Site cover image

根と葉

SPFとDKIMとDMARC

情報処理安全確保支援士に対する勉強のメモ。

SPF

SPF(Sender Policy Framework)とは、メールを送信してきたサーバのIPアドレスが、その送信元ドメインから送信を許可されたものかを、DNSを使って確認する仕組みのこと。

  • IPアドレス: 192.0.2.10 からの、ヘッダーfrom: user@example.comというメールを受信
  • example.comのSPFレコードをDNSから取得
  • SPFレコードで192.0.2.10 が許可されているか確認
    • 許可されていればSPF Pass、許可されていなければSPF Fail

SPFレコード

主に下記の要素で構成される。

  • SPFのバージョン
  • 許可するIPアドレス
  • 挙動
    • +: Pass = 許可(省略可能)
    • -: Fail = 不許可
    • ~: Soft Fail = 不許可だが受信側の処理は任せる
    • ?: Neutral = 判断しない

DNSに登録されるのは、例えば下記のようになる。

example.com. IN TXT "v=spf1 ip4:192.0.2.10 -all"
その他の例
  • 192.0.2.10 は許可、それ以外は不許可: v=spf1 ip4:192.0.2.10 -all
    • +(Pass)を明示する場合: v=spf1 +ip4:192.0.2.10 -all
    • IPv6も使える: v=spf1 ip6:2001:db8::/32
  • 192.0.2.10192.0.2.11 は許可、それ以外はSoft Fail: v=spf1 ip4:192.0.2.10 ip4:192.0.2.11 ~all

DKIM

DKIM(DomainKeys Identified Mail)とは、DMとIIM(Identified Internet Mail)の仕様を統一した認証技術のこと。仕組み的にはDMと同様だが、DKIMでは公開鍵をメールヘッダーに添付することも可能。

DM(DomainKeys)

DNSサーバで送信元ドメインに紐づけて正当なメールサーバの公開鍵を登録しておき、送信元SMTPサーバによる署名によって正当性を検証する仕組みのこと。

  • 送信側SMTPサーバは秘密鍵で署名し、メールのDomainKey-Signatureヘッダーに設定
  • 受信側SMTPサーバは送信元DNSに問い合わせて公開鍵を取得し、DomainKey-Signatureヘッダーの値を検証

DKIM-Signatureヘッダー

主に下記の要素で構成される。

  • v: DKIMのバージョン
  • a: 署名アルゴリズム
  • d: 署名したドメイン
  • s: 公開鍵を特定するセレクタ(詳細は後述)
  • h: 署名対象のヘッダー
  • bh: 本文のハッシュ値
  • b: 秘密鍵で作成した署名

例えば下記のようになる。

DKIM-Signature:
 v=1;
 a=rsa-sha256;
 d=example.com;
 s=z2026;
 h=from:to:subject:date;
 bh=本文のハッシュ値;
 b=電子署名;

DKIMで確認できるのは、d=のドメインが管理する秘密鍵で署名され、署名対象部分が改ざんされていないこと。ヘッダーfromのドメインと署名したドメインが同じことは保証しない。

DNSへの登録

公開鍵はセレクタ._domainkey.ドメインでTXTレコードとしてDNSに登録する。例えば下記のようになる。

z2026._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=公開鍵"

DMARC

DMARC(Domain-based Message Authentication, Reporting, and Conformance)とは、SPFやDKIMの認証結果を、ヘッダーfromのドメインと結び付けて検証し、失敗したメールの扱いを送信側ドメインが公表する仕組みのこと。

下記のいずれかがPassすれば、DMRACとしてもPassとなる。

  • SPFがPass & SPFのドメインがFromと整合
  • DKIMがPass & DKIMのd=ドメインがFromと整合

ドメインの整合性(アライメント)

DMRACにおいて、SPFではヘッダーfromのドメインエンベロープfromのドメインを、DKIMではヘッダーfromのドメインDKIM-Signatureのドメインを比較する。このとき、どのドメインを整合しているとみなすかのモードが2種類ある。

  • Relaxed: サブドメインまでは許容する
    • e.g. example.commail.example.com は整合しているとみなす
  • Strict: 完全一致のみを整合とみなす

DMARCレコード

DMARCポリシーは、_dmarcを付けた名前のDNS TXTレコードとして登録する。主に下記の要素で構成される。

  • v: DMARCのバージョン
  • p: DMARC失敗時の希望ポリシー
    • none: 何もしない、quarantine: メールを隔離する、reject:メールを拒否する
    • あくまでドメイン所有者の希望であり、最終的には受信側のポリシーによってどのように処理されるか決まる
  • rua: 集約レポートの送付先
  • ruf: 個別の失敗レポート送付先
  • adkim: DKIMアライメント方式
    • r: Relaxed, s: Strict
  • aspf: SPFアライメント方式
    • r: Relaxed, s: Strict

例えば下記のようになる。

_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:report-a@example.com; ruf=mailto:report-f@example.com; adkim=r; aspf=r"

処理の流れ

  • メールを受信
  • _dmarc.example.comのTXTレコードを検索
  • SPFとDKIMを検証
  • 各認証ドメインとヘッダーfromドメインの整合性を確認
  • どちらか一方がPass + 整合ならDMARC Pass、そうでなければDMARC Fail
  • p=のポリシーを参考に処理し、必要に応じてレポートを送信