ご家庭用の DMARC 運用を考える
はじめに
プライベートで保有しているドメインを、せっせと Cloudflare に移管している今日この頃です。
せっかく良い機会なので DNS の設定も見直しているのですが、そのひとつに DMARC (Domain-based Message Authentication, Reporting & Conformance) と言うものがあり、今日はそのお話をしてみます。DMARC は、私が持っているドメインたちよりもだいぶ新しいプロトコルなので、長年放置されていた手元の設定には当然入っておりませんでした。
DMARC って何?
DMARC は、自ドメインからの送信メールの取り扱いに関するプロトコルです。プライベートのドメインなので、このドメインからメールを送信するのは身内だけ・・・のハズなのですが、現実には(ドメインパワー最弱であろう私の保有する何もないドメインからですら)日々なりすましメールが送信されています。そんな 2022 年のインターネット。
SPF と DKIM
メールの送信ドメインを認証する仕組みに、SPF[1] と DKIM[2] と言うものがあります。
SPF は、メール送信元のサーバーを表明するための仕組みです。ドメインからメールが送信される際に使用される送信サーバーを DNS レコードで表明することで、受信サーバーが送信サーバーをチェックすることが出来る様になります。
DKIM は、同じ様なことを電子署名を用いて実現する仕組みです。電子署名なので、「なりすまし」だけでなく「改ざん」に対しても効果がありそうです。(主に)送信サーバーでメールに対して電子署名を付与し、受信サーバーでそれを検証します。送信ドメイン側が、公開鍵を DNS レコードとして公開することで、受信サーバーがそれを用いて署名検証することが出来る様になります。なるほど。
DMARC
お気付きかと思いますが、SPF も DKIM もメールを受信した側が送信元を認証するための仕組みです。受信側では、これらの仕組みを用いてメールの検証を行い、受信したメールを破棄したり、SPAM マークを付けたりすることで、なりすましメールから受信者を保護することが可能となります。素晴らしい。
素晴らしいのですが、SPF や DKIM はあくまでも受信側で送信元を認証するための仕組みであり、これだけでは送信側(というかドメイン所有側)は何も検知することは出来ません。たとえ、保有するドメインになりすました悪意のあるメールが大量送信されていても、それらのメールはドメイン保有者の手元を通り過ぎることすら無いため、気が付くことは困難ですし破棄を依頼することも出来ません。困りました。
この課題に対応するのが DMARC[3] と言う仕組みです。DMARC を用いると、SPF や DKIM の検証に失敗した際の処理を、受信側サーバーへお願いすることが出来る様になります。DMARC に対応した受信サーバーは、DNS の DMARC レコードから送信ドメイン側のポリシーを確認して、受信したメールの取り扱いを決定します。また、それらの処理に関するレポートを受信側から送信ドメイン側へ送付してもらうことも可能となります。
DMARC の設定とレポートの処理
DMARC の設定
DMARC の設定自体はそんなに難しくありません。保有するドメインのネームサーバーに、以下のようなレコードを追加するだけです。
_dmarc.****.***. 1 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:dmarc@****.***; sp=none; aspf=r;"
主なタグの指定方法は以下の通りです。なお、`v` `p` 以外は省略可能なため、必要なタグのみ指定していくことになります。
tag | value |
---|---|
v |
DMARC レコードのバージョンを指定します。今のところ DMARC1 固定です。 |
p |
認証に失敗したメールの取り扱いを受信サーバーに指示します。none : そのまま受信者に配信quarantine : 迷惑メールに分類して受信者に配信reject : メールの受信を拒否 |
pct |
DMARC ポリシーの対象となる未認証メールの割合(%)を 1 〜 100 の整数値で指定します。 |
rua |
DMARC レポートを受け取るメールアドレスを指定します。 |
sp |
サブドメインからのメールに関するポリシーを設定します。設定方法は p タグと同様です。 |
aspf |
SPF の調整ポリシーを設定します。s : 厳格。ドメイン名が完全一致する必要があります。r : 緩和。有効なサブドメインであればパスします。 |
adkim |
DKIM の調整ポリシーを設定します。s : 厳格。ドメイン名が完全一致する必要があります。r : 緩和。有効なサブドメインであればパスします。 |
Cloudflare のコンソールには、上記レコードの作成を補助するツールも備わっており、必要事項を入力するだけでレコードを作成してくれます。助かります。
DMARC レポートがやって来る
さて設定したその日から、私の元へ DMARC レポートがやって来ました。XML ファイル(が入った ZIP ファイル)が添付された素っ気ないメールです。おそるおそる中を見ると、「送信元の IP アドレス」「SPF / DKIM の認証結果」等が書いてあるのが分かりました。
件数としては、1 日 1 ドメインあたり数件なのですが、ほぼ毎日来ます。こんなものいちいち開いて確認していたら心が擦り減ってしまいます。
DMARC Weekly Digests by Postmark
そんなに難しくない XML だったので自前で処理することも検討したのですが、フリーでダイジェストをレポートしてくれるサービスを見つけたので使ってみることにします。
レポートを送って欲しいメールアドレスと対象のドメインを入力すると、設定すべきレコードが払い出されますので、ネームサーバーに設定します。
_dmarc.****.***. 1 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:********@dmarc.postmarkapp.com; sp=none; aspf=r;"
これにより、DMARC レポート自体は Postmark 宛に送信される様になります。Postmark は、受信した DMARC レポートを集計して、週刊でダイジェストをメールしてくれます。こんな感じ。
うん。十分ですね。(キャプチャ上はマスクしていますが)IP アドレスも載ってくるので、どちら方面からの送信が多いかも分かりそうです。いったんこの運用で様子を見てみようと思います。
おわりに
今回 DMARC を設定したことで、個人所有の何もないドメインからも日々なりすましメールが送られていることが分かりました。少し運用して問題なさそうでしたら、ポリシー p
を quarantine
や reject
に変更してみようと思います。DMARC レポートも Postmark がダイジェストにしてくれるので、心静かに過ごせそうです。
(おまけ)ドメインでメール送信を行わない場合
ドメインでメール送信を一切行わない場合は、SPF / DKIM とも空に設定した上で、DMARC を厳格リジェクト設定するのが良い様です。確かにこれなら、SPF / DKIM / DMARC に対応した受信サーバーは、全てのメールを拒否してくれそうです。お試しあれ。
-
Sender Policy Framework (SPF) for Authorizing Use of Domains in E-Mail, Version 1 https://datatracker.ietf.org/doc/html/rfc4408 ↩︎
-
DomainKeys Identified Mail (DKIM) http://www.dkim.org/ ↩︎
-
Domain-based Message Authentication, Reporting & Conformance (DMARC) https://dmarc.org/ ↩︎
Discussion