迷惑メール回避対策 DKIM設定【Postfix】

Postfixで迷惑メール判定されないように、DKIMの設定をおこなう

構築したメールサーバのメールがGmailで受信したメールが迷惑メール扱いになっていたりすることは無いでしょうか?
この対策として有効なのが、SPF(Sender Policy Framework)DKIM(Domainkeys Identified Mail)のドメイン認証が有効です

SPFの設定は本記事では紹介しませんが、DNSレコード内に配信するメールサーバーの情報を設定しておき、受信したメールサーバーは、SPFを使用して、送信元のドメインが偽装されたものではなく実際の送信元であることを確認します

DKIMはDNSサーバーに送信元ドメインの公開鍵を登録しておきます。送信するメールには暗号化された電子署名が追加されメールが送信されます。DKIMに対応しているメールサーバーで受信した場合は、DNSの公開鍵を取得してメールのヘッダーを電子署名を検証しなりすましか検証します

OpenDKIMのインストール

DKIMが有効なので、OpenDKIMをインストールします。
OpenDKIMインストールには、EPELリポジトリを追加が必要ですので、そちらのレポジトリもインストールします

# EPELのレポジトリをインストールします
$ sudo yum install epel-release

# opendkimをインストールします
$ sudo yum install opendkim

OpenDKIM 秘密鍵の作成

opendkimをインストールしたら、キーペア(秘密鍵/公開鍵)を作成します

鍵ファイルを作成する場所は「/etc/opendkim/keys/」以下に作成します。複数ドメイン(マルチドメイン)で対応する場合は、ドメイン毎に鍵ファイルを作成するディレクトリを作成したほうがわかりやすいのでその方法で作成します

鍵ファイルを作成するディレクトリを作成します

$ sudo mkdir /etc/opendkim/keys/example.com

作成したディレクトリにopendkim-genkeyコマンドでキーペア(秘密鍵と公開鍵)を発行します。
セレクタ名は、ファイルの作成日やdefaultとするパターン多いようです。

書式:opendkim-genkey -D [鍵ファイルを保存するディレクトリ] -d [ドメイン名] -s [セレクタ名]

# キーペアを作成します
$ sudo opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s default

# 作成したキーペアの所有者情報を変更します
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys/example.com/

DNSの設定

DNSに公開鍵の情報をDNSレコード設定していきます。
設定するDNSレコードは「/etc/opendkim/keys/example.com/default.txt 」の内容となります。

$ sudo cat /etc/opendkim/keys/example.com/default.txt 
default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MI0OBYLe8pMPJWqa0pqIJFw0QK~~省略~~1sN0OBYLe8pMPJWqa0pqIJFw0QK" )  ; ----- DKIM key default for example.com
  • v=DKIM1 は、keyレコードのバージョン番号(指定する場合はDKIM1)
  • k=rsa は、電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポートします
  • P=*** は、公開鍵データ

次にDNSサーバーにレコードを設定します。今回はムームードメインに以下のように登録しました

サブドメイン default._domainkey
種別 TXT
内容 v=DKIM1;k=rsa;p=MI0OBYLe8pMPJWqa0pqIJFw0QK~~省略~~1sN0OBYLe8pMPJWqa0pqIJFw0Q

ADSPレコードは、受信側でDKIMの認証結果をどのように扱ってほしいかを示すためのレコードです。
dkim=の値は「all」「unknown」「discardable」のいずれかを設定します。

サブドメイン _adsp._domainkey
種別 TXT
内容 dkim=unknown

DNSレコードの設定が終わったら、しばらくしてDNSレコードが登録されているか確認します

$ dig default._domainkey.example.com txt
; <<>> DiG 9.11.20-RedHat-9.11.20-5.el8 <<>> default._domainkey.pasoden.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40535
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;default._domainkey.example.com.        IN      TXT

;; ANSWER SECTION:
default._domainkey.example.com. 3600 IN TXT     "v=DKIM1;k=rsa;p=MI0OBYLe8pMPJWqa0pqIJFw0QK~~省略~~1sN0OBYLe8pMPJWqa0pqIJFw0Q"

;; Query time: 121 msec
;; SERVER: 108.61.10.10#53(108.61.10.10)
;; WHEN: 火  3月 16 14:27:21 JST 2021
;; MSG SIZE  rcvd: 304

opendkim.confの変更(単一ドメイン)

opendkim の基本的な設定は、「/etc/opendkim.conf」になります。このファイルを変更します。

  • mode は、「s」送信時の署名「v」受信を確認します。「sv」で送信時には署名して、受信時には確認します
  • KeyFile で、秘密鍵のファイルをしてします
  • KeyTable, SigningTable はコメントアウトして指定しないようにします
# 設定ファイルをバックアップします
$ sudo cp /etc/opendkim.conf /etc/opendkim.conf.org

# Modeを送受信とも有効にする
# KeyFileを作成したファイルを指定して、KeyTable, SigningTableはコメントアウトする
$ sudo vim /etc/opendkim.conf

Mode    sv

#KeyFile        /etc/opendkim/keys/default.private
KeyFile /etc/opendkim/e-portal.jp_keys/default.private
# KeyTable      /etc/opendkim/KeyTable
# SigningTable  refile:/etc/opendkim/SigningTable

opendkim.confの変更(マルチドメイン)

複数のドメインで利用する場合は、キーペアを同じものを使用する場合と、ドメイン毎にキーペアを利用するパターンがあります

同じキーペアを使って複数のドメインに対応する場合は、以下のように設定します。

  • mode は、「s」送信時の署名「v」受信を確認します。「sv」で送信時には署名して、受信時には確認します
  • Domain で、使用する複数のドメインを指定していきます。(書式:ドメイン1,ドメイン2, ドメイン3 )
  • KeyFile で、秘密鍵のファイルをしてします
  • KeyTable, SigningTable はコメントアウトして指定しないようにします
$ sudo vim /etc/opendkim.conf
Mode    sv
Domain  example.com, example.jp, hoge.com 
Selector        default

#KeyFile        /etc/opendkim/keys/default.private
KeyFile /etc/opendkim/e-portal.jp_keys/default.private
# KeyTable      /etc/opendkim/KeyTable
# SigningTable  refile:/etc/opendkim/SigningTable

ドメイン毎に秘密鍵を使用する場合は、KeyFileパラメーターを無効化して、KeyTable、SigningTable のパラメーターを有効化して、秘密鍵ファイルとドメインの紐づけを実施します。

$ sudo vim /etc/opendkim.conf
Mode    sv
Selector        default

#KeyFile        /etc/opendkim/keys/default.private
KeyTable      /etc/opendkim/KeyTable
SigningTable  refile:/etc/opendkim/SigningTable

「/etc/opendkim/KeyTable」に使用するドメイン毎に設定します

$ sudo vi /etc/opendkim/KeyTable
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
default._domainkey.example.jp example.jp:default:/etc/opendkim/keys/example.jp/default.private

「/etc/opendkim/SigningTable」に以下のように使用するドメイン毎に設定します

$ sudp vi /etc/opendkim/SigningTable
*@example.com default._domainkey.example.com
*@example.jp default._domainkey.example.jp

postfixの設定変更

postfixでopendkimを利用するには、以下のように設定変更をおこないます

$ sudo vim /etc/postfix/main.cf
# 末尾に以下を追記
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

OpenDKIMの起動および自動起動の設定

opendkimを自動起動するように設定しておき、その後のopendkim,postfixを再起動します

# opendkimの起動と自動起動の設定
$ sudo systemctl start opendkim
$ sudo systetemctl enable opendkim

# postfixを再起動
$ sudo systemctl restart postfix

再起動後は、メールサーバーよりメールを送信します

# 送信テスト
$ echo "dkim test" | mail -s "test" -r "admin@example.com" example@gmail.com

Gmailで受信したメールで「メッセージのソースを表示」してメールのヘッダーをみてDKIMが有効(PASS)になっているか確認します