Postfix 3.4 [迷惑メール対策 SPF] CentOS7 (マルチドメイン)
↑こちらもご覧ください。記事が新しいです。
迷惑メール対策のひとつ「SPF」を設定します。
Postfix3.3 迷惑メール対策 DKIM設定(2018/10/23追加)もご覧ください。
PostfixのSPFでは、perl版と、python版があります。
perl版 SPF
最初、perl版に挑戦をしていたのですが、どうもうまくいかない。
コマンドラインから、
# /usr/local/lib/policyd-spf-perl
と起動させて、
request=smtpd_access_policy protocol_state=RCPT protocol_name=SMTP helo_name=(ホスト名) queue_id=(英数字) sender=(メールアドレス) recipient=(ホスト名 client_address=(差出側アドレス) client_name=(ホスト名)
というふうに書き込む(標準入力に入れる)と、/var/log/maillog に
Oct XX XX:XX:XX postfix/policy-spf[XXXX]: Policy action=PREPEND Received-SPF: softfail ; identity=mailfrom; envelope-from=”(メールアドレス)”; helo=(ホスト名); client-ip=(差出側アドレス)
と、SPFの判定がでるのに、なぜか、Postfix経由だと、perl版SPFを認識してくれない。
ということで、perl版SPFを断念(悲)。
python版 SPF
もうひとつの「python版PSF」を入れてみます。
単純に
# yum install pypolicyd-spf
と、yumコマンドで入れると、
# yum install pypolicyd-spf Loaded plugins: extras_suggestions, langpacks, priorities, update-motd (略) (1/6): python-ipaddr-2.1.11-1.amzn2.noarch.rpm (2/6): postfix-2.10.1-6.amzn2.0.3.x86_64.rpm (3/6): pypolicyd-spf-1.3.2-5.el7.noarch.rpm (4/6): python-pydns-2.3.6-2.el7.noarch.rpm (5/6): python-pyspf-2.0.11-5.el7.noarch.rpm (6/6): mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm (略) Installed: pypolicyd-spf.noarch 0:1.3.2-5.el7 (略) Complete! ------------------------------------------------------
と、postfix 2.1も入ってしまうので、今回は、ソース版のSPFをインストール。
python版、SPFの「pypolicyd-spf」
「pypolicyd-spf」は、version 1.3 系と、version 2.0系があり、 Version 1.3系は、python ver.2 をサポートするが、pypolicyd-spf version 2.0系は、python ver.3に。
今回、新しい方の、「pypolicyd-spf」version 2.0系、python ver.3系を入れる。
python 2 系を削除すると、yumなどに影響をするので、python2 と python3 を同居させるようにインストール。
インストール方法は、別途。
「pypolicyd-spf」には、「py3dns」と、「pyspf」というライブラリが必要になります。
AmazonLinux2 で、python2 とpython3との共存(2019/01/04追記)
Amazon Linux 2 で、python ver.2 と、python ver.3 を共存するのは、比較的簡単。
# yum install python3
で、インストールをします。
# yum install python3 (略) Dependencies Resolved ============================================================================================================= Package Arch Version Repository Size ============================================================================================================= Installing: python3 x86_64 3.7.1-9.amzn2.0.1 amzn2-core 66 k Installing for dependencies: python3-libs x86_64 3.7.1-9.amzn2.0.1 amzn2-core 9.0 M python3-pip noarch 9.0.3-1.amzn2.0.1 amzn2-core 1.9 M python3-setuptools noarch 38.4.0-3.amzn2.0.6 amzn2-core 617 k (略) Installed: python3.x86_64 0:3.7.1-9.amzn2.0.1 Dependency Installed: python3-libs.x86_64 0:3.7.1-9.amzn2.0.1 python3-pip.noarch 0:9.0.3-1.amzn2.0.1 python3-setuptools.noarch 0:38.4.0-3.amzn2.0.6 Complete!
# /usr/bin/python --version Python 2.7.14 # /usr/bin/python3 --version Python 3.7.1
と、2つのバージョンが入りました。
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
をダウンロードしてインストール
# tar xzvf py3dns-3.0.2.tar.gz # cd py3dns-3.0.2 # python3 setup.py install running install running build running build_py creating build (略) writing byte-compilation script '/tmp/tmpssywzi_o.py' /usr/bin/python3 /tmp/tmpssywzi_o.py removing /tmp/tmpssywzi_o.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
からダウンロードしてインストール。
# tar xzvf pyspf-2.0.12.tar.gz # cd pyspf-2.0.12/ # python3 setup.py install running install running build running build_py (略) 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 setup.py install
running install
running build
running build_py
(略)
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
# vi /etc/python-policyd-spf/policyd-spf.conf Mail_From_reject = Fail ↓ Mail_From_reject = False
Failだと、メールが届かないので、「False」にして、ヘッダ情報に付加して、メールは、届くようにする。
pypolicyd-spf テスト
# /usr/bin/python3 /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 /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf
上記、2行を加えます。行頭の 「policy」の部分を、main.cfでも、同じ名前にします。「policy」でなくても大丈夫。
vi /etc/postfix/main.cf smtpd_recipient_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
postfix 2.10から変更された
smtpd_recipient_restrictions
から
smtpd_relay_restrictions
にする。
(古い設定のままでした(汗))
そして、「check_policy_service unix:private/policy」を加えます。
policy_time_limit = 3600s
も、加えます。
実際のメール受信で、SPFをテスト
SPFが設定されている、メールアドレスからテストなどをしてみます。
policyd-spf[4769]: prepend Received-SPF: None (mailfrom) identity=mailfrom;
上記は、SPFは、確認できなかったメール。
policyd-spf[4769]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom;
上記は、OKなメール。
「Pass」だとOK。