DKIM(ディーキム)は、そのメールが正規のメールサーバから送信されたか否かを識別するための技術です。仕組みとしては、送信側でメールに電子署名を行い、受信側でそのメールの電子署名を検証することによってメールサーバの正当性をチェックします。そこで今回は、OpenDKIM を利用して、Postfix を DKIM に対応するための設定方法をまとめてみました。
DKIM 設定の概要
送信側のメールサーバで電子署名(以下「署名」と表記します)に必要な秘密鍵と公開鍵を作成し、この秘密鍵を使ってメールサーバで署名を行うように設定します。一方、ペアの公開鍵はメールドメインを管理しているDNSサーバのTXTレコードに登録しておきます。そして、受信側のメールサーバはこの公開鍵を使って署名の検証を行います。
このように設定しておけば、下図の迷惑メール送信者のメールサーバから、送信元のメールアドレスを偽ったメール送信したとしても、受信側メールサーバでDKIMの検証により認証NGとなり、迷惑メールと判定される可能性が高くなります。(迷惑メールと判定するか否かは、受信側メールサーバの判断になります)
今回は、上図の「送信側のメールサーバ」と「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 の設定は完了です。お疲れさまでした!!
コメント
[…] gmailとmailman Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) […]
[…] http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/ https://blog.apar.jp/linux/856/ […]
[…] 主に下記6つのサイトを参照して、やっとできました。 https://blog.apar.jp/linux/856/ http://server-setting.info/centos/sendmail-dkim-milter.html http://www.ohoclick.com/archives/38 […]
[…] Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) […]
[…] 参考サイト: Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM) | あぱーブログ […]