どうも、やまもとやまです。
昨今のメール事情ですが、どうやらGmailでSPF/DKIM/DMARC関連のガイドラインが公開されたようで、急激にDKIMやDMARCの需要が増えているようです。
当エンジニアブログでも、同僚により以下のような記事が公開されていたりします。
Opendkimの設定やってみた
ウェビナー「Google & 米国Yahoo!の迷惑メール対策強化について」に参加しました
というわけで、流行りにのって、、、というわけではないですが、せっかくだしちょうど良い機会なので、OpenDKIMで複数ドメインの設定を試してみました。
備えがあれば憂いもない、かもしれません。
環境
以下の環境で検証しました。
ほぼほぼ最小インストールからのスタートです。
OS:AlmaLinux 8.9
また、設定対象ドメインを以下の3ドメインとします。
- dkimtest01.example.com
- dkimdkim02.example.com
- testtest03.example.com
なお、今回は検証なので、すべてrootユーザで実行しています。
OpenDKIMインストール~基本設定
OpenDKIMインストールのため、epelレポジトリを追加し、OpenDKIMをインストールします。署名用の鍵ペア作成のため、opendkim-toolsも入れておきます。
# dnf install epel-release
# dnf install opendkim opendkim-tools
次に、基本設定を行います。
1ドメインとか1設定だけであれば設定ファイルにそのまま記述しても良いですが、複数ドメインに対応するため、鍵テーブルと署名テーブルを利用します。
# vi /etc/opendkim.conf
===========================================================
Mode s # 署名を実施する
#Selector default
#KeyFile /etc/opendkim/keys/default.private
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
===========================================================
主な変更点のみ記載していますが、今回は検証は行わず、署名だけ実施するのでモードは「s」で設定しておきましょう。
鍵ペアの設定
対象の各ドメインに対し、鍵ペアを作成します。
鍵ペアはopendkim-toolsパッケージに含まれるopendkim-genkeyコマンドで作成可能です。
# cd /etc/opendkim/keys/
# mkdir /etc/opendkim/keys/dkimtest01.example.com
# opendkim-genkey -D dkimtest01.example.com -d dkimtest01.example.com -s fstest
ドメイン「dkimtest01.example.com」に対し(-dオプション)、ディレクトリ
「dkimtest01.example.com」(-Dオプション)以下にセレクタ「fstest」(-sオプション)の鍵ペアを作成しています。
確認すると、無事に作成されていることが分かります。
# ls -l dkimtest01.example.com
-rw------- 1 root root 891 Jan 10 20:23 fstest.private
-rw------- 1 root root 324 Jan 10 20:23 fstest.txt
OpenDKIMから読み込めるよう、所有者を変更しておきます。
# chown -R opendkim:opendkim dkimtest01.example.com
また、作成された公開鍵の中身は以下になっていました。
公開鍵はドメインのDNSサーバーでTXTレコードとして登録しましょう。
# cat dkimtest01.example.com/fstest.txt
fstest._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi1B1Ml8lERwQ22lxwcodOzuYeFYzql+uqVdptebVMmhXa9cCPEza30tEFrM3W2yjYxXbjFFwnWRS+fltAidh45okaL1LZHFGcAa14AU9Wuzm6RgKg5JVC/piAUTSh9H2+Au3Xml2/VbyxgXlLhYFdG+kz9f3gGxUp4LddQ4eZwQIDAQAB" ) ; ----- DKIM key fstest for dkimtest01.example.com
同様に他の2ドメインについても鍵を作成し、レコード登録しておきます。
鍵ペアと署名の対応設定
鍵ペアが作成されたら、基本設定で指定したテーブル用ファイルに対応設定を行います。
鍵テーブルでは鍵とセレクタの対応を指定します。
※各セレクタは1行で設定します。6行に見えるかもしれませんが実際の設定は3行です
# vi /etc/opendkim/KeyTable
=================================================
fstest._domainkey.dkimtest01.example.com dkimtest01.example.com:fstest:/etc/opendkim/keys/dkimtest01.example.com/fstest.private
fstest._domainkey.dkimdkim02.example.com dkimdkim02.example.com:fstest:/etc/opendkim/keys/dkimdkim02.example.com/fstest.private
fstest._domainkey.testtest03.example.com testtest03.example.com:fstest:/etc/opendkim/keys/testtest03.example.com/fstest.private
=================================================
署名テーブルでは、送信者と署名に利用するセレクタの対応を指定します。
# vi /etc/opendkim/SigningTable
=================================================
*@dkimtest01.example.com fstest._domainkey.dkimtest01.example.com
*@dkimdkim02.example.com fstest._domainkey.dkimdkim02.example.com
*@testtest03.example.com fstest._domainkey.testtest03.example.com
=================================================
ファーストマッチで処理されるので、優先するものは上に書きましょう。
ワイルドカードも利用可能で、ドメイン単位だけではなくアカウント単位での設定もできます。
また、最終行にワイルドカードで指定すると、他の全ドメインの署名を指定したりとかもできます。
PostfixとOpenDKIMの連携設定
PostfixのmilterでOpenDKIMと連携させてやりましょう。
# vi /etc/postfix/main.cf
===================================================
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
===================================================
今回はソケット経由で通信する設定にしましたが、TCPのポート経由でも通信可能です。
その場合はOpenDKIM、Postfix両方でポート指定に変更してください。
また、ソケット経由なので、Postfixからソケットへアクセス可能なようにpostfixユーザをグループ追加しておきます。
# usermod -a -G opendkim postfix
これで準備は完了です。あとはOpenDKIMとPostfixを起動してやればOK。
送信を試してみる
というわけで、実際に送信してみましょう。
# echo "dkim test mail"| mail -s "DKIM TEST" -r from@dkimtest01.example.com destination@example.com
ログを見ると、署名されていることが分かります。
Jan 10 18:55:28 dkimtest postfix/pickup[24492]: 68D20801B270: uid=0 from=<from@dkimtest01.example.com>
Jan 10 18:55:28 dkimtest postfix/cleanup[24497]: 68D20801B270: message-id=<65a50110./l4btg7QZiCZhKXW%from@dkimtest01.example.com>
Jan 10 18:55:28 dkimtest opendkim[17492]: 68D20801B270: DKIM-Signature field added (s=fstest, d=dkimtest01.example.com)
Jan 10 18:55:28 dkimtest postfix/qmgr[24493]: 68D20801B270: from=<from@dkimtest01.example.com>, size=511, nrcpt=1 (queue active)
Jan 10 18:55:28 dkimtest postfix/smtp[24500]: 68D20801B270: to=<destination@example.com>, relay=mx.example.com[192.168.0.100]:25, delay=0.09, delays=0.02/0/0.05/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7968690290)
Jan 10 18:55:28 dkimtest postfix/qmgr[24493]: 68D20801B270: removed
また、他の対象ドメインや対象外ドメインでも送信したところ、設定した3ドメインでは正常に署名され、それ以外の場合は署名が行われないことも確認ができました。やったね!
gmail宛てに送信してみる
そういえば、そもそもこの検証始めたのってGmailのガイドラインとか関連からだよね~、ということで、gmail宛てに送信してみました。
結果、
無事PASSになっていました!ひと安心!
※実際に送信したドメインはexample.comではないのでマスクしています。。
結果~
想定通り、複数ドメインに対して正常にDKIMを設定することができました。
また、有効な署名で検証もできることが確認できました。
余談ですが、色々試したところ、OpenDKIMで署名するとき、署名基準になる(OpenDKIMが見ている)のはどうもエンベロープではなくヘッダFROMのような気がします。
なお、当社専用サーバーやVPSで採用しているPleskでは、コントロールパネルのGUIからDKIM設定が可能です。すべてコマンドラインで設定しなくて良いので便利ですね。
それではまた!