OpenSMTPDのdkimフィルタ構築とsfp/dkim/dmarcレコードの設定
概要
はじめに
sfp/dkim/dmarcは、巨大メールプラットフォームのフィルタ設定です(以下、すべてDNSレコード正規である、小文字で表記します)。
自分たちのメール基盤がspam/mail relay/他の温床にもなっていて、虎がぐるぐる回ってバターになっちゃった、みたいな構造になってます。
2024年のGoogleのdkim規制が有名です。フィルタをあてるドメイン対象を1日あたり5000通以上としていましたので中小のドメインメールはspfさえあればdmarcチェックは通る、という感じでした。
ところが、この<猶予>も外れそうな情勢になっていて、dkim対応しようというのが、今回のMX改定作業の主目的の一つです。
OpenSMTPDを使うようにしたのも、屋上階なPostfix設定を避けるため、ということです。
認証構造
送信元IPをチェックするのが spf
送信メールヘッダの鍵チェックするのがdkim
この二つをあわせて判定をするのがdmarc
となります。spf設定でpassしていて、dkim設定なしでも、上記したように中小MXは、dmarcでpassというかたちがありましたら、今後どうなるかわかりません(むしろネガティブに考えたほうがいいでしょう)。
spf/dmarc
これはDNSレコード(TXTタイプ)設定だけです。 MXを利用するドメインのDNSに登録します。
spf
レコード名は、メールドメインホスト
“v=spf1 ip4:MXサーバーのIP ~all”
dmarc
レコード名は、_dmarc.メールドメインホスト
“v=dmarc1; p=none; rua=mailto:管理メールアドレス”
spfは厳密にやるなら -allですが、とりあえずテスト中はこれ(チルダ~all)で通してかまいません。
なぜなら、まずは “ ~all” +「dkim passの確立」が最優先だからです (spf自体の判定は、一応~allでも通してくれますんで)。
dkimレコードとOpenSMPTDのdkimフィルタ設定
dkimレコード
DNSのdkimレコード(TXT)のレコード名は
セレクタ名._domainkey.メールドメインホスト名
となります。
中身は
“v=dkim1;p=以下、公開鍵”
このセレクタ名(よく使われてるらしいのがmailという名前)と鍵(公開)(秘密)を設定するのが、このページの本題です。(前置きが長くてすみません)。
OpenBSDのsmtpd.conf
filter "dkimsign" proc-exec "/usr/local/libexec/smtpd/filter-dkimsign
filter "dkimsign" proc-exec "/usr/local/libexec/smtpd/filter-dkimsign \
-d 利用ドメイン名...(以下列挙略) \
-s mail -k /etc/mail/dkim/private.rsa.key" user _dkimsign
filter-dkimsignのインストールと設定
パッケージ
pkg_addで下の2つを入れる
libopensmtpd-1.0 library for writing opensmtpd filters
opensmtpd-filter-dkimsign-0.6p0 dkim signer integration to the OpenSMTPD daemon
ユーザ
id _dkimsign
で確認。無ければ nologin で作成。
鍵ディレクトリと秘密鍵
install -d -m 770 -o _dkimsign -g _dkimsign /etc/mail/dkim
doas -u _dkimsign openssl genrsa -out /etc/mail/dkim/private.rsa.key 2048
chmod 400 /etc/mail/dkim/private.rsa.key
chown _dkimsign:_dkimsign /etc/mail/dkim/private.rsa.key⏎
(二行目のdoasは_dkimsignユーザで作成)
DNS 用公開鍵
openssl rsa -in /etc/mail/dkim/private.rsa.key -pubout | \
sed '1s/.*/v=DKIM1;k=rsa;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;'
DNS TXT(先述)
mail._domainkey.<ドメイン> に 上で出力された公開鍵を置くv=DKIM1;k=rsa;p=この部分)。
DNS登録されたか確認
dig TXT mail._domainkey.利用ドメイン
smtpd.conf
filter “dkimsign” proc-exec “/usr/local/libexec/smtpd/filter-dkimsign -d ドメイン1 -d ドメイン2 -s mail -k
このmailが、セレクタ名と対応
/etc/mail/dkim/private.rsa.key” user _dkimsign
送信側 listen に付ける。
listen on … filter “dkimsign”
反映
smtpd -n
rcctl reload smtpd
DNSレコードの確認
使うメールのドメインDNSに、
- MXレコードに、MXホスト名が登録されているか
- spf,dmarac,dkimの書式は正しいか
送信テスト
自分のgmailメールアドレスに、短いメールをおくる。subjectも暑中お見舞いです!ぐらいのゆるいメールで。
決して連続して送らないこと。
メール不達なら、gmail側から、550とかのダメ出しメールが帰ってくるので、 とにかくまつこと。 あとはおもむろにそのメールのヘッダを見る。キックされてたなら、ともかく設定をみなおす。 時間をあけずにむやみに送信テストすると、IP/ドメイン自体のレピュテーション判定が入る(と思う。しらんけどw)。
成功の場合のメールヘッダ
Authentication-Results: mx.google.com;
dkim=pass header.i=@メールアドレスドメイン名 header.s=mail header.b=CPQrWku9;
spf=pass (google.com: domain of あなたのメールアドレス designates MXのIP as permitted sender) smtp.
mailfrom=あなたのメールアドレス
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=MXホスト名
今後どうするか(初めてのMXホスト運営者のかたに)
で、まあ、このように一通りの動作が<成功>したら、 一月程度、この仮テストホストで、運用するのをおすすめします。
一月の間にトラブルに遭遇しますし、ログチェックに慣れるというのが、よろしいかと。
本運用はその後でもよろしいかとおもいます。自前MXをたてる意味はそれだけあるということで。
参考:メールプラットフォームによる<認証>フィルタのちがい
spf,dkim,dmarcが整えばプラットフォームあてメールは弾かれることはなくなる。
ただしメールプラットホームの違いはある。 これはyahoo mailの迷惑メールフォルダにはいっていたspamメール
Authentication-Results: mtaat0053.mail.otm.ynwp.yahoo.co.jp;
dkim=unknown;
spf=none smtp.mailfrom=なんかよくわからん.jpドメイン
dmarc=unknown header.from=同上;
全部ひどいw。これは、Gmailなら、すでに入り口で弾いているケース。Yahoo Japan(LY)は、まだゆるい。
他方、入り口通過しても、たとえば、独自のフィルターなどを付加する動きは当然ある。 以下は、icloudの受信サーバのヘッダ
ICL-X-Score: 2.33303322422
Authentication-Results: bimi.icloud.com; bimi=skipped reason="insufficient dmarc"
X-ARC-Info: policy=fail; arc=none; r1=-20; r2=0
Authentication-Results: arc.icloud.com; arc=none
Authentication-Results: dmarc.icloud.com; dmarc=pass header.from=送信ドメイン名
X-DMARC-Policy: v=DMARC1; p=none; rua=mailto:ruaメール名
X-DMARC-Info: pass=pass; dmarc-policy=none; s=r1; d=r1; pdomain=送信ドメイン名
Authentication-Results: dkim-verifier.icloud.com; dkim=pass header.d=送信ドメイン名 header.i=@送信ドメイン名 header.b=Wx83ILrW
Received-SPF: pass (spf.icloud.com: domain of 送信元アドレス designates MXのIP as permitted sender) receiver=spf.icloud.com; client-ip=MXのIP; helo=MXホスト名; envelope-from=送信元アドレス
Authentication-Results: spf.icloud.com; spf=pass (spf.icloud.com: domain of 送信元アドレス designates
spf,dkimが通り、dmarcもpass判定なのだが、
Authentication-Results: bimi.icloud.com; bimi=skipped reason=“insufficient dmarc”
という不吉な文字列がある。BIMは、Brand Indicators for Message Identificationの略。
これは、たとえばメール<ロゴ>を出したいなら、dmarcは、p=noneじゃなくて、p=rejectないしはp=quarantine設定しないと、insufficientになるということらしい。 (だいたい、p=rejectなどというよう厳格設定をする企業など、ほとんどいないだろうけど。普通p=noneでしょw)
まあ普通にメール到達しているし、別にロゴなど加えたメールじゃないので無視してよし、という風に判断しているが、 こういうのを見るにつけ、メール業界は<規制>(準備)の嵐の真っ只中にあるということである。