CentOS7

Postfix + OpenDKIMで送信元ドメイン認証を実装するメモ

DKIMとは

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.txtDNSDKIMレコードとなる

秘密鍵は漏洩しないように留意

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

以下の書式に従う

対象のメールアカウント DKIMレコード名

なお、ドメインの全てのアカウントを一括指定も可能

[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になっていること


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS