Postfix 3.4 [迷惑メール対策 SPF] CentOS7 (マルチドメイン)

この記事は約10分で読めます。

SPFとは

迷惑メール対策の一つである「SPF」。
「SPF」とは、送受信時に、「正規のメールサーバーから送信されたか」を判定する仕組み。

迷惑メールの送り主は、「攻撃用メールサーバー」から送信されることが多いです。
「正規のメールサーバー」は、利用者の認証情報をパスした(通過した)、メールサーバーの事です。

SPFでは、メールの受信時に、「迷惑メールではない」と判断します。
(メールサーバーが乗っ取られた場合は別です)

メールの受信時には、「Python」もしくは、「Perl」プログラムで判定をします。
今回、Python3で、判定する方法「pypolicyd-spf」を書いています。

メール送信時は、「DNS」で設定を行います。

Rspamdを利用する場合

Rspamd、DMARC・SPFモジュール、Postfix,CentOS7
Rspamdを利用する場合、上記の記事の方を参照ください。
(2020/08/03追記)

SPFの問題点

SPFの問題点は、「転送」にあります。
SPFは、送信元を指定しており、転送をすると、「転送元」が変わってしまうのです。
転送先から、受け取ると、「SPF」は、スパムとして判断してしまいます・・・

これを回避する方法はあるが、実際には、広まっておりません・・・
そもそも、envelope-from を書き換えて転送すればいいのですが・・・

Python3 インストール pat.1

# python --version
Python 2.7.5

↑CentOS7にデフォルトで入っているpythonのバージョン
# yum install https://centos7.iuscommunity.org/ius-release.rpm
# yum install python36u python36u-libs python36u-devel python36u-pip
# python3.6 --version
Python 3.6.7

↑Python3.x が入りました。
# /usr/bin/pip3.6 --version
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)

Python3 インストール pat.2(2020/08/03)

# yum install https://centos7.iuscommunity.org/ius-release.rpm
Loaded plugins: fastestmirror
Cannot open: https://centos7.iuscommunity.org/ius-release.rpm. Skipping.
Error: Nothing to do

↑ 上記のように反応しない場合・・・
# yum install python3

↑と、行うと、
======================================================================================
 Package                                    Arch                           Version
======================================================================================
Installing:
 python3                                    x86_64                         3.6.8-13.el7
Installing for dependencies:
 libtirpc                                   x86_64                         0.2.4-0.16.el7
 python3-libs                               x86_64                         3.6.8-13.el7
 python3-pip                                noarch                         9.0.3-7.el7_7
 python3-setuptools                         noarch                         39.2.0-10.el7

Transaction Summary
======================================================================================
Install  1 Package (+4 Dependent packages)

↑と、python3がインストールできます。
# python3 --version
Python 3.6.8

↑ Python3 が、入りました。
# cat /etc/centos-release
CentOS Linux release 7.8.2003 (Core)

↑CentOS 7.8の場合です

py3dns(pypolicyd-spf用ライブラリ)

「py3dns」は、python 用 DNS ライブラリ。

「pydns」pydns-2.3.6.tar.gzは、python 2 用です。

今回、python3 用を入れます。
https://sourceforge.net/projects/pydns/files/py3dns/py3dns-3.0.2.tar.gz/download
から、
py3dns-3.0.2.tar.gz
をダウンロードしてインストール

# wget https://sourceforge.net/projects/pydns/files/py3dns/py3dns-3.0.2.tar.gz/download
# mv download py3dns-3.0.2.tar.gz
# tar xzvf py3dns-3.0.2.tar.gz
# cd py3dns-3.0.2
# python3.6 setup.py install

writing byte-compilation script '/tmp/tmp1i7zpiee.py'
/usr/bin/python3.6 /tmp/tmp1i7zpiee.py
removing /tmp/tmp1i7zpiee.py
running install_egg_info
Writing /usr/lib/python3.6/site-packages/pydns-3.0.1-py3.6.egg-info

pyspf(pypolicyd-spf用ライブラリ)

# https://sourceforge.net/projects/pymilter/files/pyspf/pyspf-2.0.12/pyspf-2.0.12.tar.gz/download
# mv download pyspf-2.0.12.tar.gz
# tar xzvf pyspf-2.0.12.tar.gz
# cd pyspf-2.0.12
# python3.6 setup.py install

running install_scripts
copying build/scripts-3.6/type99.py -> /usr/bin
copying build/scripts-3.6/spfquery.py -> /usr/bin
changing mode of /usr/bin/type99.py to 755
changing mode of /usr/bin/spfquery.py to 755
running install_egg_info
Writing /usr/lib/python3.6/site-packages/pyspf-2.0.12-py3.6.egg-info

pypolicyd-spf 本体インストール

# wget https://launchpad.net/pypolicyd-spf/2.0/2.0.2/+download/pypolicyd-spf-2.0.2.tar.gz
# tar xzvf pypolicyd-spf-2.0.2.tar.gz
# cd pypolicyd-spf-2.0.2/
# python3.6 setup.py install

running install_data
copying policyd-spf.1 -> /usr/share/man/man1
copying policyd-spf.conf.5 -> /usr/share/man/man5
creating /etc/python-policyd-spf
copying policyd-spf.conf -> /etc/python-policyd-spf
copying policyd-spf.peruser.5 -> /usr/share/man/man5
running install_egg_info
Writing /usr/lib/python3.6/site-packages/pypolicyd_spf-2.0.2-py3.6.egg-info

pypolicyd-spf 設定
# vi /etc/python-policyd-spf/policyd-spf.conf
 
Mail_From_reject = Fail
↓
Mail_From_reject = False

Failだと、メールが届かないので、「False」にして、ヘッダ情報に付加して、メールは、届くようにする。

pypolicyd-spf テスト

# python3.6 /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf

で、何も反応がないことを確認。
実際には、標準入力を待っている状態。
不具合がある場合は、なにか、エラーメッセージが出てきます。

postfix設定

vi /etc/postfix/master.cf
policy unix -       n       n       -       0       spawn
  user=nobody argv=/usr/bin/python3.6 /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf

上記、2行を加えます。行頭の 「policy」の部分を、main.cfでも、同じ名前にします。「policy」でなくても大丈夫。
vi /etc/postfix/main.cf

smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, permit_auth_destination, reject_unauth_destination, reject
↓
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination,check_policy_service unix:private/policy

policy_time_limit = 3600s

実際に、メールを受信してみる

メールを受信すると、

Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=XXX.XXX.XXX.XXX

というヘッダ情報が付加されて、「Pass」となり、「迷惑メールではない」と、判定されています。

送信時の設定(DNSの設定)

example.jp. IN TXT " v=spf1 +ip4:XXX.XXX.XXX.XX ~all"

TXTレコードで、上記のように記述します。「all」の前は、「-」(マイナス)ではなく、「チルダ」です。
「マイナス」と「チルダ」では、意味が違います。

 

タイトルとURLをコピーしました