メールサーバを運用していると、迷惑メールの踏み台になっていないのに、Gmail等に迷惑メール判定されてしまうことが有ります。
その場合はSPFレコードとDKIMの設定を行うことで、メールが正当なものでなりすましもされていない事を証明する材料を提示することができます。
設定しなくてもメールサーバとして動きますが、これくらいはマナーとして設定しておくと良いと思います。
SPFレコードの設定
SPFでは、受信者がDNSのSPFレコードを参照して、そこに登録されているドメイン名とホスト名を参照し、送信サーバがなりすまされていないか検証する仕組みです。
hoge@example.comで、SMTPメールサーバのIPアドレスが255.255.255.255だとすると
1 |
example.com IN TXT "v=spf1 +ip4:255.255.255.255 ~all" |
を設定することになります。
v=spf1はバージョン情報ですが固定でOK。
そこからスペース区切りで設定を列挙していくことになります。
+は、送信メールサーバとして認証する。という意味。
ipv4:255.255.255.255は、メールサーバのアドレス。
これが組み合わさっているので、
ipv4の255.255.255.255からの送信メールは+正規のサーバとして認証してね。
という意味になります。
続いて出てくる~は、一応SPF公開してるけど、認証失敗する可能性があるからこれだけでなりすまし判定しないでね。という意味。
送信元のホストを表すallと組み合わさっているので、他全部は認証失敗の可能性があるけど、なりすましとも限らないよ。というゆるーい設定になります。
+と~以外にも、-も指定でき、例えば-allとすると、先に設定したipv4:255.255.255.255以外のホストからのメールはなりすましですからね!という厳しい指定になります。
その場合、メーリングリストを利用した再配信等の後に誤認してしまう場合があるらしいです。
こちらのサイトが超詳しいです。
能書きは良いんじゃ!とりあえず設定させてくれよ!って方は上にも書きましたが、
example.comのTXTレコードに、v=spf1 +ip4:255.255.255.255 ~all
のホスト名とIPアドレスを書き換えて設定してくださいな。
DKIMの設定
なりすましや改ざんを検知する仕組みです。
公開鍵暗号を使っており、予めDKIM用の公開鍵はDNSサーバに追加しておきます。
送信サーバはメールヘッダに秘密鍵を利用した署名を行い、受信者は公開鍵をDNSに問い合わせて復号することでメールが本当にそのドメインからのものであるか検証することができます。
postfixの場合、OpenDKIMを使うのが一番手っ取り早いと思うので、ありがたくこれを使わせてもらいましょう。
epelリポジトリにあるので、導入していない人はepelを追加してください。
CentOS7だとさりげなく標準リポジトリに入ってるので、
1 2 |
yum install epel-release yum update |
でOKです。
そしたらopendkimをインストールします。
1 |
yum install opendkim |
署名に利用する鍵を作成するディレクトリを作り、鍵を作成し、パーミッションを直しておきます。
1 2 3 4 |
cd /etc/opendkim/keys/ mkdir example.com_keys opendkim-genkey -D example.com_keys -d example.com -s default chown -R opendkim:opendkim ./example.com_keys |
-Dオプションでは鍵を作成するディレクトリ
-dオプションでは使用するドメイン
-sオプションではセレクタの名前
を指定します。defaultとしていますが、何でも大丈夫です。他の名前にした場合は以後出てくるdefaultというセレクタを読み替えてください。
先のセレクタ名.txtの中に、DNSに設定すべき公開鍵等の情報があるのでcatします。
1 2 3 |
cat ./example.com_keys/default.txt default._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=public_key" ) ; ----- DKIM key default for example.com |
長いのでp=xxxに記載されている公開鍵は省略しています。この場合TXTレコードに登録する情報は
1 |
default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=public_key" |
となります。忘れないうちにDNSに登録してください。
DNSに追加するにあたって、ついでにADSP情報もTXTレコードも追加しておいてください。
認証失敗した場合にどういう動作を期待しているかを定義するレコードです。
1 |
_adsp._domainkey.example.com. IN TXT "dkim=unknown" |
unknown以外にもallやdiscardableが指定できますが、この2つだと認証に失敗した場合メールが破棄されます。
認証に失敗したなら破棄されなきゃ意味無いじゃん!と思う方もいらっしゃるかもしれませんが、今回はあくまでDKIMが無い事による迷惑メール判定を回避したい。という目的なので、よしということにさせてください・・・。
SPFも同じような問題がありましたが、こちらもメーリングリストなどを使う場合そのサーバがヘッダの一部を書き換えてしまい認証に失敗することがあるらしいのです。。
続いて実際にopendkimとpostfixを繋いで署名を追加してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
vi /etc/opendkim.conf # ↓送信時は署名、受信時は検証する Mode = sv # ↓コメントアウト #KeyFile /etc/opendkim/keys/default.private # ↓コメントアウト削除 KeyTable /etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts # ↓こうなっているか確認しておく Socket inet:8891@localhost |
KeyTableファイルを編集して「DKIM用のTXTレコードのフィールド名、ドメイン、セレクタ名、秘密鍵の場所」をopendkimに教えてあげます。
デフォルトで何か書かれていると思うので、そいつを変更してください。
1 2 3 4 |
vi /etc/opendkim/KeyTable # ↓編集 default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com_keys/default.private |
SigningTableファイルを編集してどのメールアドレスに対して署名を行うかを定義します。
なぜTXTレコードのフィールド名をしているすのかは謎です。もしかしたらKeyTableで定義したものと一致してさえいれば、TXTレコードのフィールド名でなくても良いのかな・・・?よくわかっていません(ぁ
1 2 3 4 |
vi /etc/opendkim/SigningTable # ↓編集 *@example.com default._domainkey.example.com |
送信メールサーバのIPアドレスを指定します。
1 2 3 4 |
vi /etc/opendkim/TrustedHosts # ↓確認 127.0.0.1 |
これでopendkimの設定は一通りOKなので、起動しておきます。
1 2 |
systemctl start opendkim systemctl enable opendkim |
最後にPostfixとopendkimを接続し、postfixを再起動ます。
1 2 3 4 5 6 7 8 9 |
vi /etc/postfix/main.cf # ↓追記 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters milter_default_action = accept # postfixを再起動 systemctl restart potsfix |
以上で設定は完了です。
メールを送信してみて、ヘッダにDKIM-Signatureが追加されているか確認してみてください。
公開鍵が正しくTXTレコードに設定されているかは、gmail等にメールを送信してみて、メールのソースにdkim=passと付記されているかをチェックしてみてください。