Skip to main content

DKIM認証を導入してみた

DKIM認証とは

DKIM_fig1
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_header

ブルーが電子署名の部分で、オレンジが認証の可否を示した箇所になります。
「dkim=pass」となっているので認証成功した事になっています。