AlmaLinux9でPostfix+DKIMの設定

AlmaLinux9で構築した業務用のちょっとしたサイト、通知メールだけ送るというのでデフォルトのPostfix経由でただただ送信していたのが、通知先のメール管理がGoogle(Gmail)に切り替わっていて、まんまとスパム扱いになっていた。SPFだけでなく今回はDKIMもやっちゃいますかということで設定してみた。


opendkimをインストールする

crbとepelのリポジトリを有効にしないとconflictが出るので注意が必要。

dnf config-manager --set-enabled crb
dnf --enablerepo=epel install opendkim opendkim-tools

opendkim-genkeyでキーをつくる

opendkim-genkey -b 2048 -D /etc/opendkim/keys/ -d ドメイン名 -s セレクタ
chown -R opendkim:opendkim /etc/opendkim/keys/

2048はキーの長さ。2048bit。1024でも可。
セレクタはDKIMのIDのようなもの。DNSでも登録するので半角英数で設定。
opendkim-genkeyを実行すると -D で指定したディレクトリにセレクタ.privateとセレクタ.txt の2ファイルができる。
セレクタ.private は秘密鍵のファイル。セレクタ.txtは公開鍵を含んだDNSに登録する情報が入っている。

DNSの設定

セレクタ.txt の中身を参考にDNS登録する。

cat /etc/opendkim/keys/セレクタ.txt
セレクタ._domainkey  IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=公開鍵" )  ; ----- DKIM key セレクタ for ドメイン

この情報を元にDNSのTXTレコードに登録する。

opendkimの設定

以下の3ファイルを設定する。

  • /etc/opendkim.conf

  • /etc/opendkim/SigningTable

  • /etc/opendkim/KeyTable

/etc/opendkim.conf はDKIMそのものの設定、/etc/opendkim/SigningTable はメールアドレスとセレクタの対応を設定、/etc/opendkim/KeyTable はドメインとセレクタと秘密鍵の設定をする。

vi /etc/opendkim.conf
...
Mode s ← 送信だけなので s に変更
...
Socket local:/run/opendkim/opendkim.sock ← デフォルトで記述されているのでメモする。
...
KeyTable        /etc/opendkim/KeyTable ← コメントアウトを解除
...
SigningTable    refile:/etc/opendkim/SigningTable ← コメントアウトを解除

Socketはpostfixとやり取りするファイルになるのでメモしておく。

vi /etc/opendkim/SigningTable
...
#*@example.com default._domainkey.example.com
*@ドメイン セレクタ._domainkey.ドメイン

*****@ドメイン のメールは、セレクタ._domeinkey.ドメインのTXTレコードを検証しますよ、という設定。

vi /etc/opendkim/KeyTable
...
#default._domainkey.example.com example.com:default:/etc/opendkim/keys/default.private
セレクタ._domainkey.ドメイン ドメイン:セレクタ:/etc/opendkim/keys/セレクタ.private

ドメインとセレクタと秘密鍵をここで紐つける。
ここまでできたらopendkimを起動する。

systemctl enable --now opendkim.service

postfixの設定

postfixがDKIMとソケットを介してやりとりできるように設定する。
まずソケットにpostfixアカウントがアクセスできるようにする。

usermod -aG opendkim postfix

/etc/postfix/main.cf に先ほどメモしたソケットの情報を追記する。末尾に書く。

vi /etc/postfix/main.cf
...
smtpd_milters = local:/run/opendkim/opendkim.sock ← メモした情報
non_smtpd_milters = $smtpd_milters ← 決め打ち
milter_default_action = accept ← 決め打ち

postfixをリロードして完了。

service postfix reload

gmailに送信して確認

やってる通知処理と同じ仕組みで自前のgmailアドレスに送信してみる。
その際、/var/log/maillog で送信できているかを確認する。gmailは受信拒否した時わかりやすく英文で戻してくる。

DKIMが有効になっているかはgmailで受信したメールの「メッセージのソースを表示」で確認できる。受信できてるから有効なのだろうけど。

PASSになっていれば有効になっている証拠。
IPとドメインは消してある。

これで終わり。分かってしまえば簡単だけど、でも手間ではある。メールサービス経由に切り替えるか、通知はslackで良くない?という話もある。

参考資料

以下のサイトを参考にしました。ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?