SPF と DKIM だけでは、なりすましを止められない
自社のドメインを名乗る迷惑メールが取引先に届いた、という相談は珍しくないでしょう。SPF も DKIM も設定してあるのに、なぜ止まらないのか。設定した側からすれば、当然の疑問です。
答えは、SPF と DKIM がどちらも「差出人欄のドメイン」を見ていないことにあります。SPF(RFC 7208)は、メールの封筒にあたる Return-Path のドメインについて、送信を許可した IP アドレスの一覧を DNS に置く仕組みです。DKIM(RFC 6376)は、送信サーバーがメールに電子署名を付け、署名者のドメインの公開鍵で受信側が検証する仕組みです。どちらも「このメールは あるドメイン の正規の経路を通った」とは言えますが、そのドメインが受信者の目に入る From と同じかどうかは確かめません。
ここに隙があります。攻撃者は自分のドメインで SPF と DKIM を正しく設定し、From だけをあなたの会社のドメインにして送れます。SPF も DKIM も合格し、受信者には正規のメールに見えます。
DMARC が突き合わせるのは「From との一致」
DMARC(RFC 9989)は、この隙をふさぐために、SPF と DKIM の結果に一つの条件を足します。合格したドメインが From のドメインと一致していること、です。この一致をアライメントと呼びます。SPF なら Return-Path のドメイン、DKIM なら署名の d= タグのドメインが、From のドメインと同じ(または既定では同じ組織のサブドメイン)であれば一致です。
判定の形は単純です。SPF か DKIM のどちらか一方でも「合格かつ一致」なら DMARC は合格、どちらも満たさなければ不合格になります。先ほどの攻撃メールは、SPF も DKIM も攻撃者のドメインで合格しているので、From とは一致せず、不合格です。
では、不合格のメールを受信側はどう扱うのでしょうか。ここが SPF や DKIM と違う点で、扱いを決めるのは受信側ではなく、From のドメインの所有者です。所有者は「_dmarc.ドメイン」という名前の TXT レコードに、自分のドメインを名乗って不合格になったメールの扱いを書いておきます。それが p= ポリシーです。
p=none、quarantine、reject の意味
p= には三つの値があります。違いは「不合格のメールに受信側へ何を頼むか」です。
p=none: 何も頼まない
不合格でも通常どおり配送してほしい、という宣言です。なりすましは一通も止まりません。それでも none から始める理由は、あとで述べる集計レポートにあります。自社のドメインを名乗るメールが、どの IP からどれだけ送られ、どれだけ不合格になっているかを、誰にも影響を与えずに観察できます。
p=quarantine: 疑わしいものとして扱ってほしい
不合格のメールを迷惑メールフォルダなどに振り分けてほしい、という宣言です。受信者の目には触れにくくなりますが、削除はされません。内閣官房の政府統一基準は、この水準以上での運用を政府機関に求めています(改定のポイント)。
p=reject: 受け取らないでほしい
不合格のメールを受信自体拒否してほしい、という宣言です。なりすましメールは受信者に届かず、送信側にエラーが返ります。総務省・警察庁・経済産業省がクレジットカード会社に求めたのもこの方向です(2023年2月の要請)。
三つの値は、強さの段階であると同時に、誤判定の被害の大きさの段階でもあります。正規のメールがなにかの理由で不合格になっていた場合、none なら何も起きず、quarantine なら迷惑メールに入り、reject なら届きません。だから none から始め、レポートで正規の送信元がすべて合格していることを確かめてから引き上げる、という順番が定石になっています。引き上げの手順は別のガイドで扱います。
集計レポートが DMARC を「設定」から「運用」に変える
DMARC レコードには、ポリシーのほかに rua というタグで集計レポートの送り先を書けます。受信側は日に一度、そのドメインを名乗って届いたメールを送信元 IP ごとに集計し、SPF・DKIM・アライメントの結果を XML で送ってきます。SPF や DKIM には、このような受信側からの報告の仕組みがありません。
レポートを読むと、設定した本人も知らなかった送信元が見つかることがあります。営業部門が契約したメール配信サービス、Web サイトのフォームからの自動送信、複合機のスキャン送信。どれも正規の業務なのに、SPF にも DKIM にも載っていない、という状態です。none の段階でこれらを拾い上げ、設定に加えてから引き上げる。DMARC の運用とは、この繰り返しです。
レコードの読み方
典型的なレコードは次のような一行です。
v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.jp; adkim=r; aspf=r
v=DMARC1: バージョン。先頭に置きます。p=: ポリシー。none、quarantine、reject のいずれか。-
rua=: 集計レポートの送り先。外部の可視化サービス宛にする場合は、宛先側の承認レコードも必要です。 -
adkim=、aspf=: アライメントの厳しさ。r(relaxed)は同じ組織のサブドメインでも一致とみなし、s(strict)は完全一致だけを認めます。省略時は r です。 -
sp=: サブドメイン用のポリシー。省略すると p と同じ値がサブドメインにも適用されます。
なお、以前の仕様にあった pct、rf、ri の各タグは RFC 9989 で廃止されました。残っていても無視されるだけですが、新しく書くレコードには入れないでください。
自分のドメインの状態を確かめる
DMARC チェッカーにドメインを入れると、SPF・DKIM・DMARC のレコードと、省略されたタグに既定値を当てはめた実効ポリシー、レポート送り先の承認状況を確認できます。冒頭の相談にあった「設定してあるのに止まらない」は、多くの場合 p=none のまま止まっているか、DMARC レコードそのものが無い状態です。