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」の前は、「-」(マイナス)ではなく、「チルダ」です。
「マイナス」と「チルダ」では、意味が違います。