独自ドメインを取得してメールサーバを運用すると、Gmailやhotmailなどメジャーなメールサービスからスパム認定されることが多々ある。jpドメインであれば、まだマシという話も聞くがこのサイトを立ち上げるときには、少なくともgmail、hotmail、Yahooでスパムに分類された。そこで、少しでもその可能性を減らすために送信者ドメイン認証を設定した。
大前提として、送信ホストが逆引きできることが好ましいので、DNSできちんと設定する。
新たにソフトを導入する必要などがないのでお手軽。
送信元の設定としては、自ドメインのDNSにSPFレコードを作成する。
@ IN TXT "v=spf1 mx -all" @ IN SPF "v=spf1 mx -all"
今回は、1ホストで1ドメインしか運用していないので、単純にドメインのMXレコードに記載されているホストからのみ送信するという設定にしておく。どちらのレコードを参照してもSPFレコードを取得できるようにするため、TXTレコードとSPFレコードに同じ内容を記載している(正しい設定かわからないが、いまのところ問題なし)。
設定を行った後はnamedを再起動するなどして、digなどで当該レコードがきちんと取得できるかどうかを検証する。その後、Gmail、Yahooメールなど適当なサイトにメールを送信して、受信メールのヘッダにSPF認証が成功しているかを確認する。メールを送信すると、SPF認証が正しく行われているか検証してくれるサービスもある。
SPFに比べると、送信メールサーバ側でソフトを導入しなければならないので少しハードルが高い。
送信時にメールに署名を付けるようにメールサーバを設定し、DNSで公開鍵を公開しておく。
Gentooではopendkimが利用できる。
opendkimをインストールする
> emerge -av opendkim
portageでインストールすると、設定手順を提示してくれるのでそれに従って作業を行えばよい。
秘密鍵と公開鍵を作成する。portageでサポートしてくれるので簡単。
> emerge --config mail-filter/opendkim
上記コマンドを実行すると
の2つのファイルが生成される。ファイル名は指定したselector名で作成される。
opendkimの設定を行う。
#/etc/opendkim/opendkim.conf Mode s #今回は送信時に署名するだけで受信時の検証はしない Syslog yes SyslogSuccess yes Canonicalization relaxed/simple Domain example.jp #署名するドメイン。このドメインから発信するメールに署名する Selector master #複数の鍵を運用する際に鍵を特定するセレクタ KeyFile /etc/opendkim/master.private #署名に用いる秘密鍵:先に生成したファイルを指定 #Socket inet:8891@localhost #標準設定ではinetを利用するが今回は無効にする Socket unix:/var/run/opendkim/opendkim.sock #inetの代わりにUNIXドメインソケット経由でPostfixと連携する Umask 002 #Postfixから読み書きできるようにソケットのパーミションを設定 ReportAddress root@example.jp SendReports yes PidFile /var/run/opendkim/opendkim.pid UserID milter #Statistics /var/lib/opendkim/stats.dat
今回は、IPアドレス、ドメインとも1つしかないサイトなので、単一の鍵でドメインのすべてのメールを署名するので設定は単純。送信者ごとに、サブドメインごとなどで鍵を使い分けたり、署名の有無をコントロールすることもできる。その場合は、ドメインや送信者と鍵を対応付ける設定を行う。関係するパラメータとしては、Domain、Selector、KeyFileあたり(必要が生じたときに調べよう)。
opendkimサービスを起動
> /etc/init.d/opendkim start #サーバ起動時に自動的に起動するようにしておく > rc-update add opendkim default
Postfix側で送信メールに署名する設定を行う。
#/etc/postfix/main.cf smtpd_milters = unix:/var/run/opendkim/opendkim.sock #opendkimの連携先:opendkim.confで設定したソケット non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock #opendkimの連携先:opendkim.confで設定したソケット milter_default_action = accept #DKIMの認証結果にかかわらずメールを受け入れる(スパム判定は別に行うため)
DNSにDKIMレコードを登録する。鍵を生成したときに/etc/opendkim/selector.txtができるので、そのままDNSに登録すればよい。2行になっているので、1行にしてしまうほうがすっきりする気がする。
selector._domainkey IN TXT ( "v=DKIM1; k=rsa; p=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" )
<selector>は対応するセレクタ名にする。p=の部分が公開鍵の内容。
SPFの際と同様に、設定を行った後はnamedを再起動するなどして、digなどで当該レコードがきちんと取得できるかどうかを検証する。その後、Gmail、Yahooメールなど適当なサイトにメールを送信して、受信メールのヘッダにSPF認証が成功しているかを確認する。メールを送信すると、DKIM認証が正しく行われているか検証してくれるサービスもある。
ソケットは「/run/opendkim/opendkim.sock」に生成されるが、/runはtmpfsとなっているため、再起動時にクリアされる。OpenDKIMは起動時に/run/opendkimディレクトリにソケットを作成しようとするが、起動時にはディレクトリが存在しないため、ソケットの作成に失敗してしまい、OpenDKIM自体が起動できない。
/run以下のディレクトリをセットアップしているのは「/etc/init.d/opentmpfiles-setup」で、これが「boot」ランレベルに登録されていないと、起動時に/run/opendkim」ディレクトリは生成されない。なお、opentmpfiles-setupが生成するファイルを決めている設定ファイルは、「/usr/lib/tmpfiles.d」以下に格納されている。