OpenDKIM :: インストール、設定、動作確認

DKIMとは

DKIM(DomainKeys Identified Mail)とは、電子署名を利用して送信元メールサーバーが偽装されていないか(正当なメールサーバーからの送信かどうか)を認証する仕組みです。

DKIMの流れ

1. 送信メールサーバーが電子署名を付けてメールを送信
2. 受信メールサーバーが電子署名を認証
 → このとき受信先メールサーバーは、メールのFromアドレスのドメインのDNSに問い合わせを行い、TXTレコードに登録された公開鍵を取得して電子署名の認証を行います。
3. 電子署名が正しく認証された場合、メールヘッダーに「dkim=pass」を付与して正当なメールであることをアピールする
 → その結果、(メーラーやWEBメールの仕様に依存しますが)迷惑メールフォルダ等に振り分けられる可能性が低くなります。


DKIMのインストールと設定

今回は「OpenDKIM」を利用させていただき、VPS(CentOS)で設定したときの作業メモになります。
以下、root ユーザーで作業を行う前提です。
また、DKIMを適用するドメインは「example.com」としていますので、適宜読み替えてください。

OpenDKIM のインストール

インストール

# yum install opendkim

秘密鍵・公開鍵の作成

# cd /etc/opendkim/keys/
# mkdir example.com_keys
# opendkim-genkey -D example.com_keys -d example.com -s default
セレクタ名について

セレクタ名の命名は用途による差別化など、特に必要がなければ「default」でよいかと思います。
以下「default」というセレクタ名の前提ですが、変更される場合は適宜読み替えてください。

# ls -1 example.com_keys/
default.private
default.txt
# chown -R opendkim:opendkim ./example.com_keys
# less example.com_keys/default.txt
default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=xxxxxxxxxx" )  ; ----- DKIM key default for example.com

DNSへの登録

次にDNSのTXTレコードに公開鍵を登録します。
DNSのTXTレコードには上記の「p=xxxxxxxxxx」の部分を登録します。

default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=xxxxxxxxxx"
_adsp._domainkey.example.com. IN  TXT "dkim=unknown"

なお、「_adsp._domainkey.example.com …」のレコードですが、これは「DKIMの認証結果をどのように扱うかのポリシー」を設定する行です。

通常は「dkim=unknown」で問題ないと思いますが、「all」や「discardable」も設定できます。
各ポリシーの意味は以下となります(受信メールサーバーに以下の意図を伝えます)

allこのドメインから送信されるすべてのメールに電子署名が付けられています
unknownこのドメインから送信される一部、またはすべてのメールに電子署名が付けられています
discardableこのドメインから送信されるすべてのメールに電子署名が付けられています。もし電子署名が認証できない場合はそのメールは破棄すべきです

Value Domain の場合

なお、今回対象のドメインは「Value Domain」の管轄だったため、「Value Domain」のコントロールパネルより、以下を設定しました。

txt default._domainkey v=DKIM1; k=rsa; p=xxxxxxxxxx
txt _adsp._domainkey dkim=unknown

ちなみに「subdomain.example.com」のようなサブドメインがある場合は以下の書式になるので注意が必要です。

txt default._domainkey.subdomain v=DKIM1; k=rsa; p=xxxxxxxxxx
txt _adsp._domainkey.subdomain dkim=unknown

お名前.com の場合

また、「お名前.com」の場合は、コントロールパネルより以下の2行を設定します。(2019/08/03 追記)

ホスト名:default._domainkey
TYPE:txt
TTL:3600
VALUE:v=DKIM1; k=rsa; p=xxxxxxxxxx
ホスト名:_adsp._domainkey
TYPE:txt
TTL:3600
VALUE:dkim=unknown


※ DKIMのTXTレコードが正しく登録されたかの確認は、後述の「DKIMのTXTレコードの確認」を参照ください。
※ なお、最初の登録時は、TXTレコードの登録を誤る場合があるので、TTLを短めにしておくと修正変更の時間が短縮されます。
→ 正しい設定が確認できたら正規のTTLを改めて設定します。


OpenDKIM の設定

次に OpenDKIM の設定を行います。

# vi /etc/opendkim.conf 

  :

# 送信時は署名を行い、受信時は検証する
#Mode   v
Mode    sv

  :

# Socket の設定(デフォルトで以下のようになっているはず)
Socket  inet:8891@localhost

  :

# KeyTable の設定(同じ設定であれば、追記でなくコメントアウトを外してもよい)
# KeyTable      /etc/opendkim/KeyTable
KeyTable        /etc/opendkim/KeyTable

  :

# SigningTable の設定(同じ設定であれば、追記でなくコメントアウトを外してもよい)
# SigningTable  refile:/etc/opendkim/SigningTable
SigningTable    refile:/etc/opendkim/SigningTable

  :

# ExternalIgnoreList の設定(同じ設定であれば、追記でなくコメントアウトを外してもよい)
# ExternalIgnoreList    refile:/etc/opendkim/TrustedHosts
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts

  :

# InternalHosts の設定(同じ設定であれば、追記でなくコメントアウトを外してもよい)
# InternalHosts refile:/etc/opendkim/TrustedHosts
InternalHosts   refile:/etc/opendkim/TrustedHosts

  :
# vi /etc/opendkim/KeyTable 

default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com_keys/default.private
# vi /etc/opendkim/SigningTable

*@example.com default._domainkey.example.com
# vi /etc/opendkim/TrustedHosts

127.0.0.1
::1

自動起動の設定

# chkconfig opendkim on
# chkconfig --list | grep opendkim
opendkim        0:off   1:off   2:on    3:on    4:on    5:on    6:off

opendkim を起動

# service opendkim start
# netstat -lntp | grep opendkim
tcp        0      0 127.0.0.1:8891              0.0.0.0:*                   LISTEN      24094/opendkim

postfix の設定と再起動

次に postfix と opendkim の紐付けを行います。

# vi /etc/postfix/main.cf
 
# 最下部に以下を追記
# for DKIM
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
# /etc/init.d/postfix restart



以上で設定は完了です。



DKIMの動作確認

GMail等にメールを送ってみて、以下のようなメールヘッダーが付けば設定が正しく行われています。

ARC-Authentication-Results: i=1; mx.google.com;
       dkim=pass header.i=@example.com header.s=default header.b=lAxa+2SH;

上記のようなメールヘッダーが付与されない場合は、DNSのTXTレコードが正しく設定されているか再確認してみてください。
なお、TXTレコードが正しいかは以下のコマンドで確認できます。

DKIMのTXTレコードの確認

% dig -t TXT default._domainkey.example.com
  :
(snip)
  :
;; ANSWER SECTION:
default._domainkey.example.com. 120 IN TXT    "v=DKIM1; k=rsa; p=xxxxxxxxxx"

% host -t txt default._domainkey.example.com
default._domainkey.example.com descriptive text "v=DKIM1; k=rsa; p=xxxxxxxxxx"


DKIMの設定をしてもスパム判定される場合

正しくDKIMの設定をしているにも関わらず、スパム判定されて迷惑メールフォルダに振り分けられてしまう場合は、以下の設定や確認を行ってみましょう。
特に1と2は必須です。

1. SPFが正しく設定されているか確認

2. postfix の hostname, domain の設定

Postfix の「myhostname」と「mydomain」を正しく設定する。

% sudo vi /etc/postfix/main.cf
  :
myhostname = example.com
  :
mydomain = example.com
  :
% sudo /etc/init.d/postfix reload

3. Postfix の TLS 設定

Postfix の MTA 間送信において、TLS による暗号化を行う設定をします。
具体的には「main.cf」に以下を追記し、Postfix をリロードします。

% sudo vi /etc/postfix/main.cf
# for TLS
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
% sudo /etc/init.d/postfix reload

4. SoftwareHeader の変更

「opendkim.conf」の「SoftwareHeader」の設定を「no」に変更する。

% sudo vi /etc/opendkim.conf
  :
SoftwareHeader  no  <= yes から no に変更
 :
% sudo service opendkim restart 

 

おまけ(1)

今回、DKIMを設定したついでにSPFの設定を見直したところ、Gmailで以下のエラーが出ていました。

postfix の設定を以下のように「ipv4」に変更することで、問題を解決することができました。

# Enable IPv4, and IPv6 if supported
#inet_protocols = all
inet_protocols = ipv4
おまけ(2)

以下のような便利なWEBサービスがありました。
DKIM,SPF, DMARC の確認に便利です。

https://dmarcian.com/dkim-inspector/

https://dmarcian.com/spf-survey/

https://dmarcian.com/dmarc-inspector/