Postfix DKIM設定(OpenDKIM)【2024年版】

Linux
Linux
スポンサーリンク

DKIM(ディーキム)は、そのメールが正規のメールサーバから送信されたか否かを識別するための技術です。仕組みとしては、送信側でメールに電子署名を行い、受信側でそのメールの電子署名を検証することによってメールサーバの正当性をチェックします。そこで今回は、OpenDKIM を利用して、Postfix を DKIM に対応するための設定方法をまとめてみました。

DKIM 設定の概要

送信側のメールサーバで電子署名(以下「署名」と表記します)に必要な秘密鍵と公開鍵を作成し、この秘密鍵を使ってメールサーバで署名を行うように設定します。一方、ペアの公開鍵はメールドメインを管理しているDNSサーバのTXTレコードに登録しておきます。そして、受信側のメールサーバはこの公開鍵を使って署名の検証を行います。

このように設定しておけば、下図の迷惑メール送信者のメールサーバから、送信元のメールアドレスを偽ったメール送信したとしても、受信側メールサーバでDKIMの検証により認証NGとなり、迷惑メールと判定される可能性が高くなります。(迷惑メールと判定するか否かは、受信側メールサーバの判断になります)

DKIM 設定の概要図

今回は、上図の「送信側のメールサーバ」と「DNSサーバ」の設定を行います。(受信側メールサーバは、GmailやYahoo!メールなど、DKIMに対応しているメールサービスやメールサーバとお考えください)

送信側のメールサーバは、以下の手順で構築されている前提の手順になります。今回サーバOSは、AlmaLinux を利用していますが、Rocky Linux や CentOS Stream など RHEL系のディストリビューションであれば同じ手順で設定できると思います。

SSLメールサーバ構築メモ Postfix + Dovecot【2023年版】

rootユーザの利用について

この記事では rootユーザで設定を行うことを前提にしていますので、以下コマンドで rootユーザになってから実施してください。

sudo -s

※通常の運用時は sudo <コマンド> を利用することをオススメします。

OpenDKIM のインストール

DKIM の実装となる OpenDKIMパッケージをインストールするため、EPELリポジトリを追加します。

dnf config-manager --set-enabled crb
dnf install epel-release
dnf update

OpenDKIMパッケージとツールをインストールします。(2023年9月20日時点のバージョン:2.11.0-0.34)

dnf install opendkim
dnf install opendkim-tools

DKIM署名用の秘密鍵と公開鍵の作成

今回は「t.apar.jp」ドメインでの設定例になります。ご自分の管理しているドメイン名に読み替えてください。

鍵ファイルの作成先ディレクトリを作っておきます。ディレクトリをドメイン名にしておくと、複数のドメインを管理する時に便利です。

mkdir /etc/opendkim/keys/t.apar.jp

opendkim-genkey コマンドで鍵ファイル(秘密鍵と公開鍵)を作成します。

opendkim-genkey -v \
-b 2048 \
-D /etc/opendkim/keys/t.apar.jp \
-d t.apar.jp \
-s 20230920

【オプションの説明】
-v 実行結果を表示します。
-b 鍵の長さを指定します。デフォルト値は 1024ビットですが、2048ビットが推奨されることが多いです。
-D 鍵ファイルの作成先ディレクトリを指定
-d ドメイン名を指定
-s セレクタ名(セレクタ名はこの後の設定でよく使いますので、覚えやすいものを設定しましょう)

鍵ファイルのオーナーを「opendkim」に変更します。

chown opendkim:opendkim /etc/opendkim/keys/t.apar.jp/20230920.private
chown opendkim:opendkim /etc/opendkim/keys/t.apar.jp/20230920.txt

以上で下記2つの鍵ファイル(秘密鍵と公開鍵)が作成されました。ここで作成した公開鍵をDNSサーバに登録します。一方の秘密鍵はその名の通り、秘密にして漏洩などしないように厳重に管理してください。

/etc/opendkim/keys/t.apar.jp/20230920.private ・・・秘密鍵
/etc/opendkim/keys/t.apar.jp/20230920.txt   ・・・公開鍵

公開鍵レコードの作成

DNSサーバに登録するための公開鍵レコードを作成します。公開鍵レコードの書式は次の通りです。

<セレクタ名>._domainkey.<ドメイン名>.	IN	TXT "v=DKIM1; k=rsa; p=<公開鍵のデータ>"

「p=」の後に指定する<公開鍵のデータ>は、公開鍵ファイルの下記赤字の部分です。
cat /etc/opendkim/keys/t.apar.jp/20230920.txt
------------------------------
20230920._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArS8Vo26URP+4XmAPVYwJQozCTo6k9B3HUlEUiGKSc0W27+hkQfYF7a2LxNS5c4ESeZbSbpUwX1Oibgb2vdthFdtEWCF0nugxLLK4PyXrnqSn7VoJdkH5G9h8ywdDSFIAczrdbD6Bcgx7TxJIExFmWQ5dTrjD4YQVk3trd7dgJDRdX2fh47DVDeZtzxYYs8K0s4apyUEp7Z068P"
"ihB6OF3UE0stxS76S/XZCqyhuYv5tXKoDleuTqUwJSIPuYqeUDa6HQGat8+j/me8iBBEvRG9xmtQk25R01TFS/lkwSCgd+i7R4T1rHkNWKsIe4HZG/69IGA8CzhrcIHbgr+ehhLwIDAQAB"
) ; ----- DKIM key 20230920 for t.apar.jp
------------------------------

一般的なDNSサーバのTXTレコードの最大文字数は255文字のため、鍵の長さが2048ビットの場合、公開鍵のデータが255文字を超えてしまいますのでそのままでは登録できません。そのため、上のように255文字を超えないように区切りダブルクオテーション (") で囲んで半角スペースで連結して登録することになります。

上記をふまえて今回登録する公開鍵レコードは次のようになります。

20230920._domainkey.t.apar.jp.  IN  TXT  "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArS8Vo26URP+4XmAPVYwJQozCTo6k9B3HUlEUiGKSc0W27+hkQfYF7a2LxNS5c4ESeZbSbpUwX1Oibgb2vdthFdtEWCF0nugxLLK4PyXrnqSn7VoJdkH5G9h8ywdDSFIAczrdbD6Bcgx7TxJIExFmWQ5dTrjD4YQVk3trd7dgJDRdX2fh47DVDeZtzxYYs8K0s4apyUEp7Z068P" "ihB6OF3UE0stxS76S/XZCqyhuYv5tXKoDleuTqUwJSIPuYqeUDa6HQGat8+j/me8iBBEvRG9xmtQk25R01TFS/lkwSCgd+i7R4T1rHkNWKsIe4HZG/69IGA8CzhrcIHbgr+ehhLwIDAQAB"

(補足)
以前は、DKIMの認証結果をどのように扱うべきかを示すポリシーとしてADSPレコードも登録されていましたが、DMARCの登場により不要となりました。RFC5617(DKIM ADSP)の分類も「Historic」(利用は推奨されない)になっています。DKIM(およびSPF)を設定する場合は、合わせてDMARCレコードを登録することをオススメします。

関連記事:DMARC 導入時の注意点と設定方法

公開鍵レコードの登録(Amazon Route 53)

作成した公開鍵レコードをDNSサーバに登録します。

今回は、DNSサービスの Amazon Route 53 への登録例になります。255文字を超えるTXTレコードの設定方法は、DNSサービスごとに異なりますので、公式のドキュメントなどをご確認ください。

参考資料:Route 53 で 255 文字を超える TXT レコードを設定するにはどうすればよいですか?

対象のホストゾーン(今回の場合は「apar.jp」)を選択して、「レコード作成」をクリックします。

以下のように入力/選択して「レコードを作成」をクリックします。(ウィザード表示になっている場合は「クイック作成へ切り替える」をクリックしてください)

確認

手元のPCで登録した公開鍵レコードの問合せが成功することを確認します。

dig 20230920._domainkey.t.apar.jp TXT
(略)
;; ANSWER SECTION:
20230920._domainkey.t.apar.jp. 137 IN	TXT	"v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArS8Vo26URP+4XmAPVYwJQozCTo6k9B3HUlEUiGKSc0W27+hkQfYF7a2LxNS5c4ESeZbSbpUwX1Oibgb2vdthFdtEWCF0nugxLLK4PyXrnqSn7VoJdkH5G9h8ywdDSFIAczrdbD6Bcgx7TxJIExFmWQ5dTrjD4YQVk3trd7dgJDRdX2fh47DVDeZtzxYYs8K0s4apyUEp7Z068P" "ihB6OF3UE0stxS76S/XZCqyhuYv5tXKoDleuTqUwJSIPuYqeUDa6HQGat8+j/me8iBBEvRG9xmtQk25R01TFS/lkwSCgd+i7R4T1rHkNWKsIe4HZG/69IGA8CzhrcIHbgr+ehhLwIDAQAB"

OpenDKIM の設定

DKIM認証の処理を行う OpenDKIM を設定します。

vi /etc/opendkim.conf

# 「s」送信時の署名、および「v」受信の確認の両方行う
Mode    v
 ↓
Mode    sv

KeyFile /etc/opendkim/keys/default.private
 ↓
#KeyFile /etc/opendkim/keys/default.private

#KeyTable   /etc/opendkim/KeyTable
 ↓
KeyTable        refile:/etc/opendkim/KeyTable

#SigningTable   refile:/etc/opendkim/SigningTable
 ↓
SigningTable   refile:/etc/opendkim/SigningTable

#ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
 ↓
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

#InternalHosts  refile:/etc/opendkim/TrustedHosts
 ↓
InternalHosts  refile:/etc/opendkim/TrustedHosts

/etc/opendkim/KeyTable に署名に使う秘密鍵を指定します。書式は次の通りです。

<セレクタ名>._domainkey.<ドメイン名> <ドメイン名>:<セレクタ名>:<秘密鍵ファイルのフルパス>

実際の指定は以下のようになります。
vi /etc/opendkim/KeyTable

20230920._domainkey.t.apar.jp t.apar.jp:20230920:/etc/opendkim/keys/t.apar.jp/20230920.private

/etc/opendkim/SigningTable に署名を行うドメイン名を指定します。書式は次の通りです。

*@<ドメイン名> <セレクタ名>._domainkey.<ドメイン名>

実際の指定は以下のようになります。
vi /etc/opendkim/SigningTable

*@t.apar.jp 20230920._domainkey.t.apar.jp

/etc/opendkim/TrustedHosts にメールの送信を行うPostfixサーバのIPアドレスを指定します。今回は同じサーバでPostfixを動かしているのでループバックアドレスを指定しています。(ループバックアドレスは、初期状態で指定されていると思います)
vi /etc/opendkim/TrustedHosts

127.0.0.1

OpenDKIM の起動

systemctl start opendkim

OpenDKIM の自動起動設定

systemctl enable opendkim

Postfix と OpenDKIM を接続

メールの送受信時に DKIM認証を行うようにするため、Postfix と OpenDKIM を接続します。

Postfix の基本設定は以下をご参照ください。
関連記事:SSLメールサーバ構築メモ Postfix + Dovecot【2023年版】

vi /etc/postfix/main.cf

---(下記を最終行に追加)---------------------------
#
# DKIM設定
#
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

Postfix の実行ユーザー postfix を opendkim グループに追加します。これにより postfix ユーザーが /run/opendkim/opendkim.sock を通じて OpenDKIM に接続できるようになります。

usermod -a -G opendkim postfix

Postfix をリロードします。

systemctl reload postfix

DKIM の動作確認

最後にDKIM認証が正しく行われているかを確認します。

今回は、DKIMに対応しているGmailとメールを送受信することで確認してみましょう。

メール送信時の確認

Gmailへメールを送信し、Gmail側でメールのソースを表示し DKIM の検証が「PASS」になっていればOKです。これによりメール送信時にDKIMの署名が正しくされていることが確認できました。

メール受信時の確認

今度は、Gmailからメールを送信し、受信側のメールサーバで「DKIM verification successful」のログがあればOKです。これにより、 DKIM の検証が正しく行われていることが確認できました。

tail -f /var/log/mail/maillog
(略)
Sep 23 09:13:38 test01 opendkim[1176]: DB0C020093: mail-wr1-f42.google.com [209.85.221.42] not internal
Sep 23 09:13:38 test01 opendkim[1176]: DB0C020093: not authenticated
Sep 23 09:13:38 test01 opendkim[1176]: DB0C020093: DKIM verification successful
Sep 23 09:13:38 test01 postfix/qmgr[1199]: DB0C020093: from=<xxxxx@gmail.com>, size=3700, nrcpt=1 (queue active)
Sep 23 09:13:38 test01 postfix/local[1279]: DB0C020093: to=<sample@t.apar.jp>, relay=local, delay=0.05, delays=0.03/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Sep 23 09:13:38 test01 postfix/qmgr[1199]: DB0C020093: removed

以上で DKIM の設定は完了です。お疲れさまでした!!

コメント

  1. MailmanをGmailで使う場合の注意点 | このコードわからん より:

    […] gmailとmailman Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) […]

  2. DKIM導入 | かんのWebメモ より:

    […] http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/ https://blog.apar.jp/linux/856/ […]

  3. spam認定を解除するためにDKIMの設定した話 | Lachelier より:

    […] 主に下記6つのサイトを参照して、やっとできました。 https://blog.apar.jp/linux/856/ http://server-setting.info/centos/sendmail-dkim-milter.html http://www.ohoclick.com/archives/38 […]

  4. spam認定を解除するためにDKIMの設定した話 より:

    […] Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) […]

  5. PostfixをDKIM認証に対応(CentOS) | Angel21 HP Blog より:

    […] 参考サイト: Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) | あぱーブログ […]

タイトルとURLをコピーしました