ITの教科書検索

SPF・DKIM・DMARCの違いは、何を確かめるか

SPF・DKIM・DMARCの違いは、何を確かめるかです。SPFは送ってきたサーバのIPアドレスを、DKIMは電子署名を確かめます。DMARCは、その結果がFromのドメインと一致するかを見ます。

3つとも、取引先や銀行を名乗るなりすましメールを、受信側で見分けるための仕組みです。まとめて送信ドメイン認証と呼びます。どれも、送信側のドメインの持ち主がDNSに情報を置き、受信側がそれを引いて確かめます。Gmailに大量のメールを送る送信者には、3つすべての設定が求められています。

仕組み確かめることDNSに置くもの見るドメイン
SPF送ってきたサーバのIPアドレスが、送信を許されたものか送信を許すサーバの一覧エンベロープFrom
DKIM署名が正しいか。署名した後に中身が変わっていないか署名を確かめる公開鍵署名のd=
DMARCSPFかDKIMで確かめたドメインが、Fromと一致するか失敗したときの扱いとレポートの宛先ヘッダーFrom
送信サーバexample.com秘密鍵で署名メール受信サーバexample.netexample.comのDNSSPFのTXTexample.com送信を許すIP① 許すIPを引く送信元IPと照合DKIMのTXTsel1._domainkey公開鍵② 公開鍵を引く署名を検証DMARCのTXT_dmarcポリシー③ ポリシーを引くFromと照合④ 結果をまとめるDMARCの判定受け取る・隔離・拒否送信サーバexample.com秘密鍵で署名メール受信サーバexample.net① SPFDNSから引く:example.com のTXT確かめること:送信元IPと照合② DKIMDNSから引く:sel1._domainkey のTXT確かめること:署名を検証③ DMARCDNSから引く:_dmarc のTXT確かめること:Fromと照合④ DMARCの判定受け取る・隔離・拒否
受信サーバは、送信側のドメインのDNSから、3つのTXTレコードを引きます。SPFはエンベロープFrom、DKIMは署名のd=、DMARCはヘッダーFromのドメインでレコードを探します。DMARCは、SPFとDKIMの結果がFromのドメインと一致するかを判定します。受信サーバは、その判定をもとに扱いを決めます。

なりすましメールを送れる理由:エンベロープFromとヘッダーFrom

メールを運ぶSMTPには、差出人が本物かを確かめる決まりがありません。そのため、差出人に他人のドメインを書いたメールも送れてしまいます。メールには、差出人を書く場所が2つあります。

SMTP送信サーバが受信サーバに送る内容の一部
MAIL FROM:<bounce@example.com>
RCPT TO:<tanaka@example.net>
DATA
From: sato@example.com
To: tanaka@example.net
Subject: 打ち合わせの件

1行目のMAIL FROMは、SMTPのコマンドで伝える差出人です。SMTPのコマンドで運ぶ情報を、手紙の封筒にたとえてエンベロープと呼びます。そこで、この差出人をエンベロープFromと呼びます。

DATAの後ろにあるFrom:は、メールの本文側に書かれた差出人です。メールソフトが差出人として画面に出すのは、こちらのヘッダーFromです。エンベロープFromは、届かなかったときの知らせを返す宛先で、ヘッダーFromと同じとは限りません。

SPFが確かめるのはエンベロープFrom、利用者が目にするのはヘッダーFromです。この食い違いを埋めるのが、後で説明するDMARCです。

SPF:送ってきたサーバのIPアドレスを確かめる

SPFはSender Policy Frameworkの略で、RFC 7208が定めています。ドメインの持ち主は、そのドメインからメールを送ってよいサーバを、DNSのTXTレコードに書いておきます。TXTレコードは、ドメイン名に文字列を結び付けるレコードです。

TXTexample.comのSPFレコードの例
example.com.  IN  TXT  "v=spf1 ip4:203.0.113.25 mx -all"

v=spf1は、SPFのレコードであることを示します。ip4:203.0.113.25は、そのIPアドレスのサーバに送信を許すという意味です。mxは、MXレコードに載っているサーバにも送信を許します。

最後のallは、それより前のどれにも当たらなかったすべての送信元に当たります。前に付けた記号で、当たったときの結果が決まります。

記号一致したときの結果意味
+pass送信を許す。記号を省くとこれになる
-fail送信を許さない
~softfailたぶん許さないが、はっきりは言わない
?neutral許すかどうかを示さない

受信サーバは、SMTPのMAIL FROMを受け取った時点で確かめます。エンベロープFromのドメインのSPFレコードを引き、接続してきたサーバのIPアドレスと照合します。レコードが無ければnone、DNSの一時的な失敗ならtemperror、レコードの誤りならpermerrorになります。

RFC 7208は、includeやmxのようにDNSを引く項を、合わせて10個までに制限しています。超えるとpermerrorになるので、外部のメール配信サービスを何社も足すときは数を確かめます。

SPFだけでは防げないこと

SPFは、ヘッダーFromのドメインが本物かを確かめません。攻撃者が自分のドメインをエンベロープFromに書き、そのドメインのSPFを用意すれば、SPFはpassします。RFC 7208も、ヘッダーFromなどの差出人が本物かは保証しないと注意しています。

転送にも弱点があります。SPFは、最後にメールを送ってきたサーバのIPアドレスで評価します。転送サービスがエンベロープFromを変えずに送り直すと、転送サービスのIPアドレスで照合されます。その結果、SPFは失敗します。

DKIM:電子署名でドメインと改ざんを確かめる

DKIMはDomainKeys Identified Mailの略で、RFC 6376が定めています。送信サーバが秘密鍵でメールに署名し、受信サーバがDNSに置かれた公開鍵で署名を確かめます。秘密鍵と公開鍵の関係は、公開鍵暗号のデジタル署名と同じです。

DKIM-Signature送信サーバがヘッダーに足す署名の例
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=sel1;
    h=From:To:Subject:Date; bh=(本文のハッシュ値);
    b=(署名の値)

d=は署名したドメイン、s=は鍵を選ぶための名前です。この名前を、セレクタと呼びます。h=は署名に含めたヘッダーの一覧で、RFC 6376はFromを必ず含めるよう定めています。

bh=には本文のハッシュ値が、b=にはヘッダーと本文から計算した署名が入ります。ハッシュ値は、元のデータが少しでも変わると大きく変わる値です。この値を計算するのがハッシュ関数です。

受信サーバは、s=とd=から名前を作り、DNSのTXTレコードを引いて公開鍵を手に入れます。

TXT公開鍵を置くレコードの例(鍵の値は略)
sel1._domainkey.example.com.  IN  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A…"

署名が確かめられると、d=のドメインが署名したことと、署名した部分が署名後に変わっていないことが分かります。セレクタを変えれば、1つのドメインに複数の公開鍵を置けます。新しい鍵に入れ替えるときも、古い鍵と並べて置いておけます。

DKIMの公開鍵は、認証局が発行する証明書には入っていません。ドメインの持ち主がDNSに直接置くので、電子証明書の証明書チェーンは使いません。RFC 8301は、署名にrsa-sha256を使うよう定めています。RSAの鍵は1024ビット以上、できれば2048ビット以上にします。

DKIMの署名は、中身が変わらなければ転送されても確かめられます。その一方で、メーリングリストが件名に文字を足すと、署名は合わなくなります。また、d=にはどのドメインでも書けるので、DKIMだけではFromのドメインが本物かは分かりません。

DMARC:Fromのドメインとの一致を確かめる

DMARCは、SPFとDKIMの結果を、利用者が目にするヘッダーFromに結び付ける仕組みです。SPFかDKIMで確かめたドメインが、Fromのドメインと一致するかを見ます。この一致を、アライメントと呼びます。

SPFかDKIMのどちらか1つでも、passしてFromと一致すれば、DMARCはpassします。どちらも一致しなければ、failです。DKIMの署名が複数あるときは、どれか1つが一致すれば足ります。

緩い一致と厳しい一致

一致の見方は2つあります。既定は緩い一致です。mail.example.comとexample.comのように、組織のドメインが同じなら一致とします。厳しい一致では、ドメインがまったく同じときだけ一致とします。

example.netとexample.comは、組織のドメインが違うので、緩い一致でも一致しません。攻撃者は自分のドメインでSPFとDKIMをpassさせられるので、DMARCはこの一致を必ず求めます。

DMARCのレコード

DMARCのレコードは、_dmarcを頭に付けた名前のTXTレコードに置きます。次の例は、RFC 9989の付録に載っている、扱いを変えずにレポートだけを受け取る設定です。

TXTexample.comのDMARCレコードの例
_dmarc.example.com.  IN  TXT  "v=DMARC1; p=none; rua=mailto:dmarc-feedback@example.com"
タグ書くこと例
vDMARCのレコードであること。必ず先頭に書くv=DMARC1
p失敗したメールの扱いの希望p=quarantine
spサブドメインの扱いの希望sp=reject
adkim・aspf一致の見方。rが緩い一致、sが厳しい一致aspf=s
rua集計レポートの宛先rua=mailto:…
ruf失敗レポートの宛先ruf=mailto:…

DMARCは、2015年に情報提供のための文書であるRFC 7489として公開されました。2026年5月には、標準化団体IETFの標準化の過程に乗ったRFC 9989が公開されました。これにより、RFC 7489は廃止されました。

RFC 9989では、割合を指定するpctタグがなくなり、テスト用のtタグなどが加わりました。組織のドメインを決める方法も、公開された一覧を使う方法から、DNSを上の階層へたどる方法に変わりました。レポートの形式は、RFC 9990とRFC 9991に分かれました。

動かして確かめる:SPF・DKIMの結果からDMARCの判定を出す

次の図では、3つのことを選べます。SPFとDKIMの結果、それぞれのドメインがFromと同じ組織か、DMARCのポリシーです。よくある場面のボタンを押すと、その場面の選び方に切り替わります。

Fromは example.com です。
よくある場面
example.comのサーバから、example.comの名前で送りました。SPFもDKIMも、Fromと同じ組織のドメインでpassします。
SPFの結果
SPFで確かめたドメイン
DKIMの結果
DKIMの署名のd=
DMARCのポリシー
SPF:passで、ドメインがFromと同じ組織です。DMARCのpassに使えます。
DKIM:passで、ドメインがFromと同じ組織です。DMARCのpassに使えます。
DMARCの判定:pass
DMARCはpassなので、ポリシーは使いません。受信側は、ほかの検査の結果も見てメールを扱います。

転送の場面では、SPFが失敗してもDKIMでpassします。攻撃者のドメインで認証した場面では、SPFもDKIMもpassしても、Fromと一致しないのでfailになります。

DMARCのポリシーとレポート

p=に書くポリシーは、DMARCがfailしたメールの扱いについての、送信側の希望です。値は、none・quarantine・rejectの3つです。

  • none:扱いの希望を示さない。受信側は、このポリシーを理由に扱いを変えない
  • quarantine:疑わしいメールとして扱ってほしい。迷惑メールのフォルダに入れるのが、その例
  • reject:受け取りを拒否してほしい。拒否はSMTPのやり取りの中で行う

ポリシーは送信側の希望で、最後に扱いを決めるのは受信側です。RFC 9989は、受信側がp=rejectだけを理由に拒否してはならないと定めています。ほかに判断の材料が無いときは、quarantineとして扱います。DMARCがpassしても、受信側がほかの検査で迷惑メールと判断することもあります。

noneから始めて、レポートを見て強める

ruaに宛先を書くと、受信側から集計レポートが届きます。集計レポートはXMLのファイルです。送信元のIPアドレスごとの通数や、SPF・DKIMの結果が入ります。RFC 9989は、少なくとも24時間に1回は送るよう受信側に勧めています。

rufに宛先を書くと、失敗したメール1通ごとの失敗レポートを求められます。ただし、利用者のプライバシーを守るため、送らない受信側も多いです。

いきなりrejectにすると、SPFやDKIMを設定し忘れた自社の正しいメールまで拒否されます。そこで、まずnoneでレポートを集め、正しいメールがすべてpassするのを確かめてから強めます。RFC 9989は、メーリングリストに投稿する利用者がいるドメインには、rejectを出さないよう勧めています。それでもrejectにするなら、noneとquarantineをそれぞれ1か月以上出し、結果を比べてからにします。

Gmailの送信者ガイドライン

Googleは2024年2月1日から、Gmailの個人アカウントに送るすべての送信者にSPFかDKIMの設定を求めています。1日に5,000通を超えて送る送信者には、SPFとDKIMとDMARCの3つを求めています。この場合のDMARCのポリシーは、noneで構いません。Fromのドメインは、SPFかDKIMのドメインと一致させます。

送る前の対策:OP25Bと587番のSMTP-AUTH

ここまでの3つは、届いたメールを受信側で確かめる仕組みです。迷惑メールを送らせない対策は、送る側のネットワークにもあります。

OP25Bは、ISPが、利用者の回線から外部のメールサーバの25番ポートへ送る通信を止める対策です。Outbound Port 25 Blockingの略です。ISPは、インターネット接続事業者のことです。総務省は、ISPなどのメールサーバを通らないメール送信を防ぐ対策として紹介しています。

OP25Bの下でも、正しい利用者は送れます。契約しているメールサーバの587番ポートに接続して送ります。587番では、ユーザー名とパスワードで利用者を確かめてから受け付けます。この確かめ方を、SMTP-AUTHと呼びます。

RFC 5068は、アクセス事業者が587番への通信を止めてはならないと定めています。587番とSMTP認証の流れは、メールを送る流れで説明しています。

ベイジアンフィルタリング・S/MIME・PGPとの違い

ベイジアンフィルタリングは、受信したメールの文面から、迷惑メールかを確率で判定する方法です。利用者が迷惑メールと判断したメールと、ふつうのメールから、語ごとの出やすさを学びます。差出人のドメインを確かめる送信ドメイン認証とは、見るものが違います。

S/MIMEとPGPは、利用者個人の鍵で、メールの中身を暗号化したり署名したりする規格です。送信者のメールソフトが暗号化や署名をし、受信者のメールソフトが復号や署名の確認をします。DKIMは、送信側のサーバがドメインの鍵で署名し、受信側のサーバが確かめる点が違います。

練習問題(全6問)

Q1SPFが確かめることとして正しいものはどれ?
Q2DKIMで、受信側が署名を確かめるための公開鍵を手に入れる方法はどれ?
Q3攻撃者が自分のドメインexample.orgでSPFとDKIMを用意し、Fromだけexample.comと書いて送った。example.comがDMARCを使っている場合の判定は?
Q4DMARCのレコードで、失敗したメールを受け取らないよう求めるときのpの値はどれ?
Q5転送サービスを通ったメールで、SPFが失敗しやすい理由はどれ?
Q6OP25Bの説明として正しいものはどれ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

参考にした資料

関連記事

おすすめの本 PR

セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

目的別の本の選び方を見る

セキュリティの記事を続けて読む

セキュリティ 全37本中20本目