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で受信したメールの「メッセージのソースを表示」で確認できる。受信できてるから有効なのだろうけど。
これで終わり。分かってしまえば簡単だけど、でも手間ではある。メールサービス経由に切り替えるか、通知はslackで良くない?という話もある。
参考資料
以下のサイトを参考にしました。ありがとうございました。