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
-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⏎

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をたてる意味はそれだけあるということで。

Popup