今更ながら必要に迫られてDKIM/SPFを設定してみた

Page content

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行の制限があるため行のマージ等は不要)

image-20240911143144983

image-20240911143418221

  • エントリ名:セレクタ名._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

image-20240911143740942

自分の場合は、サブドメイン名で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がなくなっていることを確認。

関連記事