OpenDKIMで複数ドメインを設定してみる

どうも、やまもとやまです。
昨今のメール事情ですが、どうやら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宛てに送信してみました。
結果、

dkim
無事PASSになっていました!ひと安心!
※実際に送信したドメインはexample.comではないのでマスクしています。。

結果~

想定通り、複数ドメインに対して正常にDKIMを設定することができました。
また、有効な署名で検証もできることが確認できました。
余談ですが、色々試したところ、OpenDKIMで署名するとき、署名基準になる(OpenDKIMが見ている)のはどうもエンベロープではなくヘッダFROMのような気がします。
なお、当社専用サーバーやVPSで採用しているPleskでは、コントロールパネルのGUIからDKIM設定が可能です。すべてコマンドラインで設定しなくて良いので便利ですね。
それではまた!