SPFの送受信設定

今回はSPFの設定を行います。
SPFとは何かということについてはここでは割愛しますが、メールの送信者が正しいか正しくないか認証する仕組みです。
キャリアメールの「なりますメール」のフィルターなどに利用されたりします。

SPFの送信設定

自分の持っているサーバのメールに正しいSPF送信設定を行うことで、携帯電話などにメールが送信可能になります。
ユーザの設定しているフィルターによっては、何も設定されていないSMTPからのメールは弾かれてしまうのですがSPFを設定することで概ね届くようになります。

SPFレコードの設定

SPFの送信設定は簡単で、DNSサーバのTXTレコードに特定の記法でSPFレコードを追加するだけです。
以下にいくつか例を示します。

v=spf1 +ip4:xxx.xxx.xxx.xxx -all  

これはipによる認証を行っています。
+は合格条件ですので、指定のipv4アドレスを持つものは認証に成功。
-は失敗条件なので、それ以外の全ては失敗となります。
失敗にはもう少しゆるい失敗を示す ~ があります。

これらは受信側のSMTPの設定に依存するのですが、基本的には-は受信拒否、~は失敗だけと受信するようなものが多いのではと思います。

v=spf1 +a:hogehoge.com -all  

また上記はドメインによる認証を行っており、hogehoge.comのAレコードと一致するIPから送信されているものを合格としています。

詳細はいろいろなサイトにありますが、なんだかんだでwikipediaがわかりやすいので、記法についてはwiki参照ということで。

上記設定を施すことで、自分のサーバから送られるメールが迷惑メールなどにならずに受信されるようになります。

動作確認

自分のサーバからgmailやyahoo mailなどにメールを送信して「メールのソース」を表示してみてください。
その中にspfのヘッダが表示され、PASS等の文字が出ていれば認証に成功しています。

SPFの受信設定

次は受信側の設定を行います。
この設定を行うことで、自分のサーバで受信するメールのうちSPFの正しく指定されていないものを弾いたりできます。
簡易なスパムなどは概ねこれで弾けるのではないでしょうか。
あまり弾きすぎると今度は、メール機能が緩かったりするシステムからメールが届かなくなったりするかもしれませんが大体大丈夫だとは思います。
ASP系のサービスでアカウントごとにメールアカウントを作成するがそのときにenvelope-fromを書き換えていたりするサービスがあると受信できなくなるかもしれません。ヘッダーFromなら大丈夫です。

パッケージのインストール

今回はPythonspf設定パッケージ群をインストールしてみます。
perlのものもあるのですが、Pythonのものの方が細かい設定が可能とのことです。
私は細かい設定をしていないのでほぼ意味がないのですが、今後を見据えてこちらで。

# pydnsインストール  
[root@metal ~]# cd /usr/local/src/  
[root@metal src]# wget https://pypi.python.org/packages/source/p/pydns/pydns-2.3.6.tar.gz  
[root@metal src]# tar xvzf pydns-2.3.6.tar.gz  
[root@metal src]# cd pydns-2.3.6  
[root@metal pydns-2.3.6]# python setup.py install  
  
# pyspfインストール  
[root@metal pydns-2.3.6]# cd /usr/local/src/  
[root@metal src]# wget https://pypi.python.org/packages/source/p/pyspf/pyspf-2.0.9.tar.gz  
[root@metal src]# tar xvzf pyspf-2.0.9.tar.gz  
[root@metal src]# cd pyspf-2.0.9  
[root@metal pyspf-2.0.9]# python setup.py install  
  
# pypolicyd-spfインストール  
[root@metal pyspf-2.0.9]# cd /usr/local/src/  
[root@metal src]# wget https://launchpad.net/pypolicyd-spf/1.3/1.3/+download/pypolicyd-spf-1.3.tar.gz  
[root@metal src]# tar xvzf pypolicyd-spf-1.3.tar.gz  
[root@metal src]# cd pypolicyd-spf-1.3  
[root@metal pypolicyd-spf-1.3]# python setup.py install  
  
# パッケージインストーラを入れてipaddrをインストール  
[root@metal pypolicyd-spf-1.3]# cd /usr/local/src/  
[root@metal src]# wget http://peak.telecommunity.com/dist/ez_setup.py  
[root@metal src]# python ez_setup.py  
[root@metal src]# wget http://peak.telecommunity.com/dist/ez_setup.py  
[root@metal src]# easy_install ipaddr  
# 何も表示されなければOK Ctrl+Cで停止してください  
[root@metal src]# /usr/bin/python /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf   
  
# 不要ファイルの削除  
[root@metal src]# rm pydns-2.3.6.tar.gz   
[root@metal src]# rm pypolicyd-spf-1.3.tar.gz   
[root@metal src]# rm pyspf-2.0.9.tar.gz   

PythonSPFパッケージは三位一体となっているようでして、上記全てのインストールが必要でした。
正直各々のパッケージの役割を理解しておりません。
dns周りの機能群とspfそのものと、policy設定系の3つなんだなぁという予想くらいです。

一旦以上でインストールは完了です。

設定ファイル修正

今度は設定ファイルを編集していきます。

[root@metal src]# vi /etc/postfix/master.cf  
[root@metal src]# diff /etc/postfix/master.cf.org /etc/postfix/master.cf  
...  
127a129,132  
> #  
> policy-spf  unix  -       n       n       -       0       spawn  
>   user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf  
[root@metal src]# vi /etc/postfix/main.cf  
[root@metal src]# diff /etc/postfix/main.cf.org /etc/postfix/main.cf  
...  
> smtpd_recipient_restrictions =  
...  
>     check_policy_service unix:private/policy-spf  
>   
> policy-spf_time_limit = 3600s  
  
# SELinuxの設定  
[root@metal src]# yum install policycoreutils-python  
[root@metal src]# semanage fcontext -a -t postfix_etc_t "/usr/lib/python2.7/site-packages/ipaddr-2.1.11-py2.7.egg"  
[root@metal src]# restorecon -R /usr/lib/python2.7/site-packages/ipaddr-2.1.11-py2.7.egg  
[root@metal src]# systemctl restart postfix  

master.cfとmain.cfを編集して、spfの機能を有効にしています。

またその次にSELinuxの設定を行っています。
普段SELinuxを無効化している方は不要です。

動作検証

gmailやyahoo mailなどから自分のサーバ宛にメールを送信し/var/log/maillogに以下のように出力されていれば動作しています。

policyd-spf[xxxxx]: Pass  

エラーが出力されている場合には、master.cfで追加した設定のパスや、インストールしたパッケージ群の権限が悪い場合が多いので確認してみてください。

あとがき

正直このあたりの設定は動いてるだけで、あまり理解できていないです。
SPFという仕組み自体はシンプルなので理解しやすいのですが、spfのパッケージ群やpostfixのmaster.cfの書き方、意味が理解できていません。

そろそろ体系的に勉強した方がいいのかな、と感じ始めています。

参考サイト

参考というより、SELinux以外ほぼまんまです。
レンタルサーバー・自宅サーバー設定・構築のヒント