CentOS7
Postfix + OpenDKIMで送信元ドメイン認証を実装するメモ †
DKIMとは †
- DKIM(Domain Keys Identified Mail)
- 送信元ドメインを認証するための技術
OpenDKIMの導入 †
標準のレポジトリにはないので、EPELから取ってくる
[root@localhost ~]# yum install -y epel-release |
[root@localhost ~]# yum install -y opendkim |
鍵ペア作成 †
opendkim-genkeyを利用
opendkim-genkey -D [出力先ディレクトリ] -b [鍵の長さ] -d [ドメイン名] -s [セレクタ名] |
(例) |
[root@localhost ~]# opendkim-genkey -D /etc/opendkim/keys -b 1024 -d example.com -s 20170309 |
[root@localhost ~]# ls -l /etc/opendkim/keys/ |
20170309.private 20170309.txt |
[root@localhost ~]# chown -R opendkim:opendkim /etc/opendkim/keys/* |
→ セレクタ名.privateとセレクタ名.txtが出来ている
→ xxx.privateが秘密鍵、xxx.txtがDNSのDKIMレコードとなる
→ 秘密鍵は漏洩しないように留意
KeyTable、SigningTableの更新 †
KeyTableを更新する
※ DKIMレコードと秘密鍵の関連付け
[root@localhost ~]# vi /etc/opendkim/KeyTable |
以下の書式に従う
DKIMレコード名 ドメイン名:セレクタ名:秘密鍵ファイル |
[root@localhost ~]# vi /etc/opendkim/KeyTable |
20170309._domainkey.example.com example.com:20170309:/etc/opendkim/keys/20130709.private |
SigningTableを更新する †
※ どのDKIMレコードに対応する秘密鍵で署名するか決定するテーブル?
[root@localhost ~]# vi /etc/opendkim/SigningTable |
以下の書式に従う
なお、ドメインの全てのアカウントを一括指定も可能
[root@localhost ~]# vi /etc/opendkim/SigningTable |
# アカウントを指定する書き方 |
hoge@examle.com 20170309._domainkey.example.com |
# ワイルドカードを利用する書き方 |
*@example.com 20170309._domainkey.example.com |
# ワイルドカードを利用しない書き方 |
@example.com 20170309._domainkey.example.com |
opendkim.confの設定 †
設定ファイルをバックアップして編集
[root@localhost ~]# cp -p /etc/opendkim.conf /tmp/opendkim.conf |
[root@localhost ~]# vi /etc/opendkim.conf |
編集結果
[root@localhost ~]# vi /etc/opendkim.conf |
Mode sv #Selector default #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 QueryCache yes ←外部DNSで名前解決をしている場合はコメントアウトを外す |
OpenDKIM起動 †
[root@localhost ~]# systemctl start opendkim |
[root@localhost ~]# systemctl enable opendkim |
[root@localhost ~]# netstat -lntp | grep opendkim |
tcp 0 0 127.0.0.1:8891 0.0.0.0:* LISTEN xxxxxx/opendkim |
Postfixの設定を変更 †
OpenDKIMはmilterとして動作するので、Postfixにmilterの設定を入れる
[root@localhost ~]# vi /etc/postfix/main.cf |
末尾に以下を追記
/etc/postfix/main.cf |
... |
# smtpdプロセスが利用するmilterの定義 |
smtpd_milters = inet:localhost:8891 |
# smtpdプロセス以外が利用するmilterの定義 |
non_smtpd_milters = inet:localhost:8891 |
# milterがメールを受け取ったときの既定の動作 |
milter_default_action = accept |
Postfixの設定確認&再起動 †
[root@localhost ~]# systemctl restart postfix |
[root@localhost ~]# postconf | egrep "(smtpd_milters|milter_default_action)" |
milter_default_action = accept non_smtpd_milters = inet:localhost:8891 smtpd_milters = inet:localhost:8891 |
DNSサーバへのTXTレコード登録 †
出力されたTXTレコードをコピー
[root@localhost ~]# cat /etc/opendkim/keys/20170309.txt |
こんな感じのが出力される(鍵ペア作成時の鍵長が長いと結構長い)
20170309._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=xxxxpubkeyxxxxxx..." "...xxxxxpubkeyxxxxx" ) ; ----- DKIM key 20170309 for example.com |
zoneファイルに追記 †
zoneファイルにTXTレコードを追加する
DKIMレコードとADSPレコードを追加する
BINDの場合の例
/var/named/example.com.zone |
20170309._domainkey IN TXT ( "v=DKIM1; k=rsa; " |
"p=xxxxpubkeyxxxxxx..." "...xxxxxpubkeyxxxxx" ) ; ----- DKIM key 20170309 for example.com |
_adsp._domainkey IN TXT "dkim=unknown" ; DKIMの認証結果に対する取り扱い方針を示す |
名前解決できることを確認 †
[root@localhost ~]# dig 20170309._domainkey.example.com txt |
... |
;; ANSWER SECTION: |
20170309._domainkey.example.com. 3600 IN TXT "v=DKIM1\; k=rsa\; " "xxxxxpubkeyxxxxx..." "...xxxxxpubkeyxxxxx" |
[root@localhost ~]# dig _adsp._domainkey.example.com txt |
... |
;; ANSWER SECTION: |
_adsp._domainkey.example.com. 3600 IN TXT "dkim=unknown" |
→ ANSWER SECTIONに想定通りの値が返ってくること。 |
メールを送信してみる †
自分のGmailアカウント宛にメールを投げてみる
[root@localhost ~]# echo "テストメールですよ" | mail -s "DKIMのテスト" hoge@gmail.com |
maillogを確認してDKIM-Signatureフィールドが追加されていることを確認する
[root@localhost ~]# tail /var/log/maillog |
Mar 9 14:34:44 ns-test opendkim[23066]: 78A3B101059: DKIM-Signature field added (s=20170309, d=example.com) |
受信結果の確認 †
Gmailで受信したメールを確認してみる †
Authentication-Resultsヘッダが"dkim=pass"となっていることを確認する
Authentication-Results: mx.google.com; |
dkim=pass header.i=@example.com; |
... |
DKIM CHECKへ空メールを送信 †
dkim-verify@dkim.jp へ空メールを送信する。
直ぐにチェック結果の内容が返信されてくるので以下を確認する。
[DKIM VERIFY RESULT]
pass ←passになっていること
[DKIM VERIFY DETAILED RESULT]
pass ←passになっていること