SPFとDKIM単体では不十分?DMARCを導入したほうがよい理由

メールのなりすまし対策として、よく使われるのが次の3つです。

SPF
DKIM
DMARC

SPFとDKIMをすでに設定している環境では、

「SPFとDKIMがあれば、DMARCまで設定する必要はないのでは?」

と思うかもしれません。

しかし、SPFとDKIMにはそれぞれ重要な弱点があります。

その弱点を補い、普段ユーザーが目にするFromアドレスのドメインが本当に正当なのかを確認できるようにする仕組みがDMARCです。

今回は、なぜSPF・DKIM単体ではなくDMARCまで導入した方がよいのかを説明します。


SPFだけではFromのなりすましを防げない

まずSPFです。

SPFは簡単にいうと、

「このドメインのメールを、このIPアドレスから送ってよいか」

を確認する仕組みです。

例えば、

example.jp
  ↓
SPFレコード
  ↓
203.0.113.10 から送信OK

と公開しておけば、受信サーバーは送信元IPを確認できます。

一見すると、これだけでなりすまし対策ができそうです。

しかしSPFには大きなポイントがあります。

SPFが確認するドメインと、メールソフトでユーザーが見るFromのドメインは必ずしも同じではありません。

メールには大きく分けて、

Envelope From
Header From

があります。

SPFが認証するのは基本的にEnvelope From側です。

一方、Outlookなどでユーザーが、

From: support@example.jp

として目にするのはHeader Fromです。

そのため、攻撃者が自分で管理しているドメインをEnvelope Fromに使用し、

Envelope From:
attacker.example

Header From:
bank.example

のようなメールを作ったとします。

attacker.example に正しいSPFレコードが設定されていれば、

SPF = PASS

になる可能性があります。

しかし受信者に見えるFromは、

bank.example

です。

つまり、

SPF PASSだから、画面に表示されているFromも正しい

とは限りません。


DKIMなら大丈夫なのか

DKIMではメールに電子署名を付け、メールが署名後に改変されていないことや、その署名を検証できることを確認します。

例えば、

DKIM-Signature:
 d=example.jp;
 s=selector1;

なら、受信側はDNSから公開鍵を取得して署名を検証します。

しかしDKIMにもSPFと似た問題があります。

DKIMで検証される、

d=example.jp

と、

From: user@example.jp

が必ず同じドメインとは限りません。

例えば攻撃者が、

Header From:
president@company.example

DKIM-Signature:
d=attacker.example

というメールを送ったとします。

attacker.example のDKIM署名自体が正しければ、

DKIM = PASS

になり得ます。

それでもユーザーが見るFromは、

president@company.example

です。

つまり、

DKIM PASS = Header Fromのドメインが正しい

でもありません。


そこでDMARCが必要になる

DMARCの重要なところは、

ユーザーに表示されるHeader Fromのドメインと、SPFまたはDKIMで認証されたドメインとの関係まで確認する

ことです。

これを**アライメント(Alignment)**と呼びます。

例えば、

Header From
user@example.jp

      ↑
      │ ドメインの関係を確認
      │
SPF認証ドメイン
example.jp

なら、SPF側のアライメントが成立します。

DKIMについても、

Header From
user@example.jp

      ↑
      │ ドメインの関係を確認
      │
DKIM d=
example.jp

という関係を確認します。

ここがSPF/DKIM単体とDMARCの大きな違いです。


SPF PASSでもDMARC FAILになる

例えば次のメールです。

Header From:
president@company.example

Envelope From:
bounce@attacker.example

attacker.example のSPF設定が正常なら、

SPF = PASS

になります。

ところがDMARCでは、

Header From
company.example

       ≠

SPF認証ドメイン
attacker.example

となります。

SPF認証には成功していますが、SPF Alignmentは失敗です。

さらにDKIMも、

DKIM = FAIL

またはアライメントしていなければ、

SPF     PASS
DKIM    FAIL

でも

DMARC   FAIL

となり得ます。

これがDMARCを導入する大きな理由です。


DKIM PASSでもDMARC FAILになる

逆もあります。

例えば、

Header From:
president@company.example

DKIM-Signature:
d=attacker.example

だったとします。

攻撃者自身のドメインなのでDKIM署名は正常です。

したがって、

DKIM = PASS

になり得ます。

しかしDMARCでは、

Header From
company.example

       ≠

DKIM d=
attacker.example

となるため、DKIM Alignmentは成立しません。

SPF側もDMARCの条件を満たしていなければ、

DKIM    PASS
SPF     FAIL
DMARC   FAIL

となります。

つまり、

SPF PASSやDKIM PASSという文字だけを見て「このメールは正しい」と判断するのは危険

ということです。


逆にDKIM FAILでもDMARC PASSになることがある

ここも非常に重要です。

前回の記事で説明したように、正常メールでも配送途中で本文が変更され、

DKIM = FAIL

になることがあります。

例えば、

正規送信者
 ↓
DKIM署名
 ↓
中継サービス
 ↓
本文変更
 ↓
DKIM FAIL

となったとします。

これだけを見て、

DKIM FAIL
    ↓
隔離

としてしまうと、正常メールを隔離する可能性があります。

しかしSPF側が、

SPF = PASS

で、さらにSPFで認証されたドメインがHeader Fromとアライメントしていれば、

SPF
PASS + Alignment PASS
       ↓
DKIM
FAIL
       ↓
DMARC
PASS

と判定できます。


SPFとDKIMは「両方PASS」がDMARCの条件ではない

ここはDMARCを理解するときによく混乱するところです。

DMARCは、

SPF PASS
+
DKIM PASS
=
DMARC PASS

という単純な仕組みではありません。

基本的には、

        Header From
             │
      ┌──────┴──────┐
      ▼             ▼
     SPF           DKIM
      │             │
 認証成功?      認証成功?
      │             │
Alignment?      Alignment?
      │             │
      └──────┬──────┘
             │
   どちらか一方が
   DMARC条件を満たす
             │
             ▼
        DMARC PASS

です。

したがって、

SPF  PASS + Alignment PASS
DKIM FAIL

→ DMARC PASS

もありますし、

SPF  FAIL
DKIM PASS + Alignment PASS

→ DMARC PASS

もあります。


SPF・DKIM・DMARCの役割を整理すると

3つを非常に単純化すると、次のように考えると分かりやすいです。

認証主に確認すること
SPFこの送信元IPは、そのドメインから送信を許可されているか
DKIMDKIM署名を正しく検証できるか
DMARCSPF/DKIMの認証結果と、ユーザーが見るHeader Fromのドメインが適切に結び付いているか

つまりDMARCは、SPFやDKIMの代わりになるものではありません。

SPF ──┐
      ├──→ DMARC
DKIM ─┘

という関係です。

SPFとDKIMという材料を、Header Fromとの関係まで含めて評価するのがDMARCと考えると理解しやすいでしょう。


DMARCにはもう一つ大きなメリットがある

DMARCでは送信ドメインの管理者が、

認証に失敗したメールを受信側にどう扱ってほしいか

というポリシーをDNSで公開できます。

代表的なのが、

p=none
p=quarantine
p=reject

です。

例えば、

v=DMARC1; p=none;

なら、まず監視中心で始められます。

運用状況を確認したうえで、

p=quarantine

さらに、

p=reject

へ強化できます。

そのためDMARCは、単に認証方式を一つ追加するだけではなく、自ドメインを騙ったメールを受信側でどう扱ってほしいか表明できる仕組みでもあります。


最初からrejectにする必要はない

DMARCを導入する場合、いきなり、

p=reject

にする必要はありません。

特にメールシステムが複雑な組織では、

Microsoft 365
業務システム
Webサーバー
複合機
メーリングリスト
外部メール配信サービス

など、自分たちが把握していなかった正規の送信経路が存在することがあります。

最初は、

v=DMARC1; p=none; ...

としてレポートを収集し、

誰が自ドメインを使っているか
        ↓
SPFは正常か
        ↓
DKIMは正常か
        ↓
Alignmentは正常か
        ↓
正規送信経路を整理
        ↓
quarantine / rejectを検討

と段階的に進める方が安全です。


まとめ

SPFとDKIMは重要なメール認証技術ですが、それぞれ単体のPASSだけでは、ユーザーが実際に目にするFromドメインが正当であることまでは保証できません。

そこでDMARCを利用します。

             Header From
                  │
          「本当にこのドメイン?」
                  │
        ┌─────────┴─────────┐
        ▼                   ▼
       SPF                 DKIM
   認証+Alignment     認証+Alignment
        │                   │
        └─────────┬─────────┘
                  ▼
            DMARC判定
                  │
        ┌─────────┴─────────┐
        ▼                   ▼
       PASS                FAIL

そのため、

「SPFとDKIMを導入したから終わり」ではなく、DMARCまで含めて設計する

ことが重要です。

特に、

SPF PASS ≠ Fromが正しい
DKIM PASS ≠ Fromが正しい
DKIM FAIL ≠ 不正メール

という3点を理解すると、DMARCを導入する意味がかなり分かりやすくなります。

コメント

タイトルとURLをコピーしました