DKIM認証を導入してみた
DKIM認識とは
Source: DKIM (Domainkeys Identified Mail) : 迷惑メール対策委員会
Domainkeys Identified Mail (DKIM) の略で簡単に説明するとサーバ間でメールの不正、改竄を検査する仕組みです。
メール送信時にサーバにて電子署名を付与し、受信側のサーバでDNSのレコードに登録されている公開鍵と電子署名を照合して認証を行います。
OpenDKIMインストール
事前にEPELのリポジトリを登録しておいてください。
[root@dev ~]#### yum install --enablerepo=epel opendkim
DKIM署名用の秘密鍵と公開鍵を作成
今回はマルチドメインの環境で使用するのでドメイン毎のディレクトリを作成していきます。
鍵保存ディレクトリ作成
[root@dev ~]#### mkdir /etc/opendkim/keys/lalcs.com
秘密鍵と公開鍵
[root@dev ~]#### opendkim-genkey -h rsa-sha256 -D /etc/opendkim/keys/lalcs.com -d lalcs.com -s 20151117
[root@dev ~]#### chown -R opendkim:opendkim /etc/opendkim/keys/lalcs.com
オプションの詳細です。
-h
- ハッシュアルゴリズム
-D
- 保存先
-d
- ドメイン
-s
- セレクタ名(作成日が主流のようです)
DNSの設定
次に公開鍵、ポリシーをDNSレコードに登録していきます。
公開鍵の登録
先ほど鍵を作成したディレクトリに.txtのファイルができていると思うのでそれをDNSのTXTレコードに登録していきます。
[root@dev ~]#### cat /etc/opendkim/keys/lalcs.com/20151117.txt
20151117._domainkey IN TXT ( "v=DKIM1; h=rsa-sha256; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg...etc" ) ; ----- DKIM key 20151117 for lalcs.com
今回の内容であれば下記のようになります。(BINDの場合)
20151117._domainkey.lalcs.com. IN TXT "v=DKIM1; h=rsa-sha256; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg...etc"
ポリシーの登録
ADSPレコードを登録してDKIMのポリシーを指定します。
ポリシーは基本的には「unknown」で問題ありません。
今回の内容であれば下記のようになります。(BINDの場合)
_adsp._domainkey.lalcs.com. IN TXT "dkim=unknown"
ポリシーの詳細です。
unknown
- DKIM署名していないメールも送信している
all
- 送信するメールはすべてDKIM署名している
discardable
- DKIM署名されていないメール・不正な内容のDKIM署名がされているメールが届いたら、すべて破棄してよい
OpenDKIM設定
基本設定
基本的な設定を行います。
SoftwareHeaderはメールヘッダーにOpenDKIMのソフトウェアバージョンなどの情報がでてしまうため必ず設定して下さい。
[root@dev ~]#### cp -p /etc/opendkim.conf{,.orig}
[root@dev ~]#### diff -u /etc/opendkim.conf.orig /etc/opendkim.conf
--- /etc/opendkim.conf.orig 2015-05-13 11:03:33.000000000 +0900
+++ /etc/opendkim.conf 2015-11-17 11:09:51.484266934 +0900
@@ -36,7 +36,7 @@
##### Selects operating modes. Valid modes are s (sign) and v (verify). Default is v.
##### Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing
##### messages.
-Mode v
+Mode sv
##### Log activity to the system log.
Syslog yes
@@ -75,7 +75,7 @@
##### Add a DKIM-Filter header field to messages passing through this filter
##### to identify messages it has processed.
-SoftwareHeader yes
+SoftwareHeader no
##### SIGNING OPTIONS
@@ -95,24 +95,24 @@
##### Gives the location of a private key to be used for signing ALL messages. This
##### directive is ignored if KeyTable is enabled.
-KeyFile /etc/opendkim/keys/default.private
+#### KeyFile /etc/opendkim/keys/default.private
##### Gives the location of a file mapping key names to signing keys. In simple terms,
##### this tells OpenDKIM where to find your keys. If present, overrides any KeyFile
##### directive in the configuration file. Requires SigningTable be enabled.
-#### KeyTable /etc/opendkim/KeyTable
+KeyTable /etc/opendkim/KeyTable
##### Defines a table used to select one or more signatures to apply to a message based
##### on the address found in the From: header field. In simple terms, this tells
##### OpenDKIM how to use your keys. Requires KeyTable be enabled.
-#### SigningTable refile:/etc/opendkim/SigningTable
+SigningTable refile:/etc/opendkim/SigningTable
##### Identifies a set of "external" hosts that may send mail through the server as one
##### of the signing domains without credentials as such.
-#### ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
+ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
##### Identifies a set "internal" hosts whose mail should be signed rather than verified.
-#### InternalHosts refile:/etc/opendkim/TrustedHosts
+InternalHosts refile:/etc/opendkim/TrustedHosts
##### Contains a list of IP addresses, CIDR blocks, hostnames or domain names
##### whose mail should be neither signed nor verified by this filter. See man
ドメインごとの設定
ドメイン名に公開鍵、非公開鍵のひも付けを行う設定を追記します。
[root@dev ~]#### vi /etc/opendkim/KeyTable
20151117._domainkey.lalcs.com lalcs.com:20151117:/etc/opendkim/keys/lalcs.com/20151117.private
[root@dev ~]#### vi /etc/opendkim/SigningTable
*@lalcs.com 20151117._domainkey.lalcs.com
IPの許可設定
接続を許可するIPを追加します。
基本的にはローカルで扱うと思うので下記のみを追記
[root@dev ~]#### vi /etc/opendkim/TrustedHosts
127.0.0.1
Postfixの設定
PostfixとOpenDKIMを連携させるための設定を追記します。
#### DKIM
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
Postfix、OpenDKIM起動
[root@dev ~]#### service opendkim start
[root@dev ~]#### chkconfig opendkim on
[root@dev ~]#### service postfix reload
メールヘッダーの確認
GmailでDKIM認証が成功しているかどうかを確認してみました。
現在はYahooなど大手のサービスはほとんど対応しているようです。
ブルーが電子署名の部分で、オレンジが認証の可否を示した箇所になります。
「dkim=pass」となっているので認証成功した事になっています。