今更ながら必要に迫られてDKIM/SPFを設定してみた
SPFとDKIMと今回の目的
今回あらたにサーバ発のメール送信が必要になって、送信テストをしてみたところgmailの自分のメールボックスにメールが届かない。ログをみてみると、SPFやDKIMに対応してないから、ブロックしたよと。
Your email has been blocked because the sender is unauthenticated. 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM. 550-5.7.26 550-5.7.26
SPFはシンプルで、メールサーバを正規なものと証明するために、DNSにメールサーバのIPアドレスを事前に登録しておく方法。受信メールサーバはメールのFromに書かれたドメインを、DNSにSPFのレコードを問い合わせる。接続してきたメールサーバと登録されたIPアドレスが一致していればOK。一致しない場合は、NGとする。
もうひとつのDKIMは少し複雑で、なりすましとメール改ざんを防ぐためにメール(ヘッダと本文)に署名をして、受信側でそれを検証してから受信するという仕組み。gmailも2024年はじめから、こういった対応を必須として、対応していないメールサーバからはメールを受信しないというガイドラインに改めた。
https://support.google.com/mail/answer/81126#authentication
Gmail introduces new requirements to fight spam (blog.google)
というわけで、SPFとDKIMに対応するための設定をおこない、ここに作業メモを残す。
前提条件、現状のメール送受信の確認
- OSはUbuntu.MTAはPostfixを利用。
- DNSは自前ではなく、さくらの用意するDNSを利用
- SPF,DKIMは対応していないが、それ以外のメール送受信に問題はない。
- gmailから自ユーザへの接続OK=OK
- 外部(gmail)から自サーバのメールエイリアス宛のメール=OK
- 内部から内部メールへの送信=OK
- 内部から外部メール(gmail)への送信=NG(OSPF/DKIM対応要)
opendkim関連パッケージの追加
sudo apt install opendkim opendkim-tools
DKIMで使う証明書の作成
sudo mkdir -p /etc/postfix/dkim
cd /etc/postfix/dkim
sudo opendkim-genkey -t -s YYmmdd -d moooi.jp
sudo mv YYmmdd.private dkim.key
sudo chown -R opendkim:opendkim /etc/postfix/dkim
YYmmddはセレクタ名なので、DNSレコード、DKIM側の設定とあわせる。ここでは、先人の例になのって現在の日付とした。(省略するとdefaultになる)
dkimの設定作成(/etc/opendkim.conf)
ubuntu以外のディストリだと/etc/opendkim/opendkim.confの事が多いようだが、ubuntuの場合は/etc直下に設定ファイルがある模様。
sudo cp /etc/opendkim.conf /etc/opendkim.conf.orign
sudo nano /etc/opendkim.conf
Socket inet:8892@localhost
Domain moooi.jp
Selector 20240902 <--- 上記証明書作成の時に設定したセレクタ名
KeyFile /etc/postfix/dkim/dkim.key
postfixへの設定追加(/etc/postfix/main.cf)
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.xxxxxxx
sudo nano /etc/postfix/main.cf
#DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:127.0.0.1:8892
non_smtpd_milters = $smtpd_milters
DNSへの登録
私の場合はDNSコンテンツサーバは自前ホスティングしておらず、さくらのDNSにホスティングしてもらっているので、さくらのドメインコントロールからTXTレコードとして登録する。YYmmdd.txtがDNSに登録する公開鍵なので、引用符で囲われた3行をそのままコピペ(1行の制限があるため行のマージ等は不要)
- エントリ名:セレクタ名._domainkey
- タイプ:TXT
- データ:作成されたデータを少し加工して登録(““で囲まれた内容のみ)
加工前
20240902._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; t=y; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw3B2Zvs1k4fhOnFoaEsSLIQ8FWc3fRCGGFaw6Wjnok8eytG5v25qe9S8+rsCibruB9JqNV0qC4XgrI1y8GKxl/4kGTP9yONQZsItzm76aLLA5nkogxeFXoOb7sJ++Hnd6SYUQTvVqX1W+80vSOok4qwsJBzOLU9zMt7Kmh15QiUkaGzBFaao3U11UKxJPBh+I7t3dLWk8ZdJlw"
"2ufoRUGq6+H1tdI/TSTzEsJupx5hp8f8CeLYflaiGOR9Zyq3RDoo3kiHIMSzjgu9WqfRFUcs7RQrSPw7eMgsK6WLqolzmFPzt+pRMjIynRdtbbIOGqk5ZPxsdlY7Zd5P69jXMYrwIDAQAB" ) ; ----- DKIM key 20240902 for moooi.jp
加工後
"v=DKIM1; h=sha256; k=rsa; t=y; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw3B2Zvs1k4fhOnFoaEsSLIQ8FWc3fRCGGFaw6Wjnok8eytG5v25qe9S8+rsCibruB9JqNV0qC4XgrI1y8GKxl/4kGTP9yONQZsItzm76aLLA5nkogxeFXoOb7sJ++Hnd6SYUQTvVqX1W+80vSOok4qwsJBzOLU9zMt7Kmh15QiUkaGzBFaao3U11UKxJPBh+I7t3dLWk8ZdJlw"
"2ufoRUGq6+H1tdI/TSTzEsJupx5hp8f8CeLYflaiGOR9Zyq3RDoo3kiHIMSzjgu9WqfRFUcs7RQrSPw7eMgsK6WLqolzmFPzt+pRMjIynRdtbbIOGqk5ZPxsdlY7Zd5P69jXMYrwIDAQAB"
ついでにSPFを登録しておく
- エントリ名:@(ドメイン名=メールサーバ)
- タイプ:TXT
- データ:v=spf1 ip4:Postfixの実IP
自分の場合は、サブドメイン名でmailサーバをたててないのでSPF用の設定が上記のようになっている
動作確認
mailコマンドで自分のgmailのアカウント宛に送付して、メールソースを確認してみる。
Authentication-Results: mx.google.com;
dkim=pass (test mode) header.i=@moooi.jp header.s=20240902 header.b=kRmu4hh+;
spf=pass (google.com: domain of xxxx@moooi.jp designates 133.125.54.14 as permitted sender) smtp.mailfrom=xxxx@moooi.jp
dkim/spfともにpassになっていることを確認
dkimのtest modeの終了
"v=DKIM1; h=sha256; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw3B2Zvs1k4fhOnFoaEsSLIQ8FWc3fRCGGFaw6Wjnok8eytG5v25qe9S8+rsCibruB9JqNV0qC4XgrI1y8GKxl/4kGTP9yONQZsItzm76aLLA5nkogxeFXoOb7sJ++Hnd6SYUQTvVqX1W+80vSOok4qwsJBzOLU9zMt7Kmh15QiUkaGzBFaao3U11UKxJPBh+I7t3dLWk8ZdJlw"
"2ufoRUGq6+H1tdI/TSTzEsJupx5hp8f8CeLYflaiGOR9Zyq3RDoo3kiHIMSzjgu9WqfRFUcs7RQrSPw7eMgsK6WLqolzmFPzt+pRMjIynRdtbbIOGqk5ZPxsdlY7Zd5P69jXMYrwIDAQAB"
1行目のt=y;を削除して再登録する。DNSの仕組み上、すぐに反映されない場合もあるのでtest modeが解除されていない場合は、数時間~翌日等 少し待ってからテストしてみる。
Authentication-Results: mx.google.com;
dkim=pass header.i=@moooi.jp header.s=20240902 header.b=RZVuypw5;
spf=pass (google.com: domain of xxxx@moooi.jp designates 133.125.54.14 as permitted sender) smtp.mailfrom=xxxx@moooi.jp
メールヘッダ等を確認し、test modeがなくなっていることを確認。