OpenSMTPDのdkimフィルタ構築とsfp/dkim/dmarcレコードの設定

#PCとプログラム覚え

概要

はじめに

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)

まあ普通にメール到達しているし、別にロゴなど加えたメールじゃないので無視してよし、という風に判断しているが、 こういうのを見るにつけ、メール業界は<規制>(準備)の嵐の真っ只中にあるということである。

Popup