2024年2月1日の Google による送信ドメイン認証強化に対応するため、postfix を SPF と DKIM に対応させたときのメモです。

SPF

基本は DNS に TXT レコードを足すだけですが、自ドメイン宛のメールを Gmail に転送 (forward) している場合は一工夫が必要に思います。例えば自ドメインが @foo.com だっとして、me@foo.com 宛のメールを me.foo@gmail.com に転送するようになっていたとします。 送信者 you@bar.org から me@foo.com へメールを送信すると、foo.com の smtp サーバがメールを受信した後、Gmail へメールを再送信します。 このとき Gmail から見るとメールの送信者は bar.org なのに smtp サーバは foo.combar.org からのメールが bar.org の SPF レコードに含まれないサーバから送信されているので SPF 認証に失敗してしまいます。

ARC を設定すればそれでも問題ないのかもしれませんが、世の中には envelope from を強制的に書き換えて場当たり的に対処する work around が知られているようです。 今回はとりあえず、それで様子をみることにしました。

転送時に envelope from(具体的には Return-Path:)を強制的に root@foo.com に変えるためには、まず /etc/postfix/main.cf に以下を追加します。

sender_canonical_classes = envelope_sender
sender_canonical_maps = regexp:/etc/postfix/sender_canonical

次に /etc/postfix/sender_canonical を次のような内容で作成します。

/@foo.com$/                     @foo.com
/^[^@]+@([a-z0-9_+\-\.]+)$/     root@foo.com

この設定で、自ドメインである foo.com から直接送信されている場合は envelope from を変更せず、そうでないときは強制的に root@foo.com に変わるはずです。 root@foo.com は smtp サーバからエラーメールを受け取れるアドレスであれば何であっても問題ありません。

こうしておいて、

sudo postmap /etc/postfix/sender_canonical
sudo systemctl restart postfix

とすれば設定が反映されるはずです。

ただ、原因は調べ切れていませんが、このやり方だと、Gmail から me@foo.com へ送信された場合、転送された先の me.foo@gmail.com では SPF 認証に失敗するようです。 Gmail 側で受信したメールを見てみると Return-Path:root@foo.com に変わっていません。 この問題を避けるためには .forward/etc/aliases の設定で

me: "|/usr/sbin/sendmail -oi -f root@foo.com me.foo@gmail.com"

のようにすればよいことを発見しました。 この設定が必要なのは Gmail に転送しているアカウントだけです。 それ以外の場合は sender_canonical_classes の設定だけで対応できているようです。

DKIM

こちらは素直に設定すれば良いようです。

sudo apt install opendkim opendkim-tools

sudo opendkim-genkey -D /etc/dkimkeys -d foo.com
sudo chown opendkim:opendkim /etc/dkimkeys
sudo chown opendkim:opendkim /etc/dkimkeys/default.txt
sudo chown opendkim:opendkim /etc/dkimkeys/default.private

その後、/etc/opendkim.conf に次のような行を追加、あるいは変更します。

Domain                foo.com
KeyFile               /etc/dkimkeys/default.private
Selector              default
Socket                inet:8891@localhost
Mode                  sv

そして公開鍵 /etc/dkimkeys/default.txt の内容を DNS に登録します。 このファイルの中身をそのまま使うことはできないので、手で適当に整形する必要があります。

その後 /etc/postfix/main.cf に以下を追加します。

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

そして

sudo systemctl restart opendkim
sudo systemctl restart postfix

このように DKIM の新しい設定を反映させれば完了です。

いいわけ

以上です。メモですので何か間違いがあってもご容赦ください。