メール送信者ドメイン認証

独自ドメインを取得してメールサーバを運用すると、Gmailやhotmailなどメジャーなメールサービスからスパム認定されることが多々ある。jpドメインであれば、まだマシという話も聞くがこのサイトを立ち上げるときには、少なくともgmail、hotmail、Yahooでスパムに分類された。そこで、少しでもその可能性を減らすために送信者ドメイン認証を設定した。

逆引き

大前提として、送信ホストが逆引きできることが好ましいので、DNSできちんと設定する。

SPF

新たにソフトを導入する必要などがないのでお手軽。

  1. メールを送信する
  2. 受信サーバは送信者のドメイン(Fromのドメイン)のネームサーバに対してSPFレコードを問い合わせる
  3. 相手のDNSから取得したSPFに送信元のホストのIPアドレスが含まれていれば認証成功

送信元の設定としては、自ドメインの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認証が正しく行われているか検証してくれるサービスもある。

DKIM

SPFに比べると、送信メールサーバ側でソフトを導入しなければならないので少しハードルが高い。

  1. 送信時にメールサーバがメールに署名をつける(ヘッダに署名をつける)
  2. 送信者(DKIM-Signatureのdタグ)のDNSから公開鍵を取得し受信メールの署名を検証

送信時にメールに署名を付けるようにメールサーバを設定し、DNSで公開鍵を公開しておく。

opendkim

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」以下に格納されている。