メール認証技術 => SPF DKIM DMARCを徹底的に理解する

# メール認証技術 => SPF DKIM DMAECを徹底的に理解する
こんにちは。今回はメール認証技術であるSPF、DKIM、DMARCについて深く触れていこうと思います。
SPF？しってるよ。送信元IPアドレスをDNSサーバに問い合わせて検証するんでしょ？
それはそうなのですが、このような理解だとだいぶ解像度が低いです。

SPF、DKIM、DMARCについて順々にまずは触れていこうと思います。

## 電子メールの仕組みについて
電子メールにはエンベロープとメッセージという二種類のものに分けられます。

![スクリーンショット 2024-04-29 070254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087483/2d8058d7-237f-6833-c35a-e8f5d24278ca.png)

イメージとしてはエンベロープは封筒、その封筒の中身に入ってるのがメッセージとなります。
つまり郵便と同じで配送(通信)に使われるのは(封筒)エンベロープなのです。
郵便と同じように配送できなかった場合はエラーメッセージをエンベロープFROMの宛先に指定して使われたりします。

そしてメッセージはヘッダと改行を挟んで本文のあるボディに分けられます。
じゃあエンベロープTO・エンベロープFROMとメッセージのヘッダTO・ヘッダFROMは何が違うの？=>いい質問です！エンベロープのTOとFROMは通信時に正しい宛先へ配送するため使われますが、ヘッダ部の情報は受信したメールソフトで表示されるときに使われるんです。
ちなみに、BCC(Blind Carbon Copy)に設定した宛先はエンベロープでは扱われますが、ヘッダには残されません。つまりメール受信者はメールソフトで表示されないので、BCCの情報を見ることができないんですね。CC(Carbon Copy)は残ります。

大まかな仕様については触れたので早速認証技術について触れていきます！

## SPF(Sender Policy Framework)
上述の通り送信元IPアドレスがそのドメインで許可されているのかを確認して送信元を検証する認証技術です。

**SPFを利用するときに必要な設定**
メールの送信者は自身のDNSサーバに必要な設定(TXTレコードなど)をする必要があります。
メールの受信者側のシステムはメール受信時、SPFに必要な問い合わせを実施するようにしておきます。

### メール送受信時の認証の流れ
(1)送信者は送信側のメールサーバから受信者のメールサーバに対してTCPコネクションを確立。
(2)メール受信者はTCPコネクション確立時に取得した送信側のIPアドレスを取得します。そして送られてきたメールのエンベロープFROMのメールアドレスのドメインを管理するDNSサーバに対してTXTレコードの問い合わせを行います。そうすると、問い合わせを行ったDNSサーバからメール送信側で許可してるメールサーバのIPアドレスが返ってくるので、TCPコネクション確立時のIPアドレスと比較します。

**つまりSPFは、送信してきたTCPコネクション確立時のメールサーバのIPアドレスがエンベロープFROMのドメインを管理するDNSサーバで許可されたものかを確認するものなんです**
※逆をいえばエンベロープFROMとTCPコネクション確立時のメールサーバのIPアドレスが一致していればヘッダFROMが偽装されていてもSPFはPASSしてしまうのです。

## DKIM(Domain Keys Identified Mail)
メール送信サーバーで秘密鍵を用いて送信メールに電子署名を付加します。次に署名付きのメールを受信した受信サーバーは、送信元ドメインのDNSサーバーに問い合わせをして公開鍵を取得し、 署名を照合します。認証結果は、メールのヘッダー情報に記述されるため、メール受信者はメールの正当性を確認できるようになるという仕組みです。

DKIMの「送信ドメイン認証のドメイン」は、 DKIM-Signatureヘッダというところにある dタグのドメインです。
つまりDKIM-Signatureヘッダにある dタグ＝DKIMの署名情報に対応する公開鍵があるドメインということになります。

### DKIMの流れ
(1)メールの送信者はとあるサービスAのメールサーバにメールを送信します。
(2)サービスAのメールサーバは自身の秘密鍵で署名をして送信します。
(3)受信者はDKIM-Signatureヘッダというところにある dタグのドメインから署名に対応する公開鍵を取得して検証します。
(4)サービスAの秘密鍵で署名されていたことが検証できればPASSとなります。

**ここで注意したいのが、あくまでDKIMが保証するのはサービスAから送信されたメールであるということなのです(サービスAの秘密鍵で署名しているため)。
つまりヘッダFROMとは関連がないんですね**


※Microsoft365ではDKIMを作成者署名にすることを推奨しているそうです。

じゃあエンベロープFROMとヘッダFROMが一致しているか確認する技術があれば安心できない？=> そうなのです。そのためのDMARCなのです。

## DMARC

DMARCはSPFまたはDKIMどちらかで、受信者が目にする送信者メールアドレスのドメインからのメールであることが認証されていることがPASSの条件です。

DMARCはヘッダーFROMとエンベロープFROMのドメインの組織ドメインまたは完全修飾ドメインが一致していれば認証成功などがある。

DMARCは送信者が指定したポリシにより、悪用されてたらレポートを送信させることが可能
攻撃者はヘッダーfromを詐称したい(メールソフトから受信者がみるため)
なので攻撃者は正しいヘッダーfromに詐称するのでそのヘッダーFROMのドメインにDMARCのポリシを問い合わせることが可能なんです。

SPFまたはDKIMをpassしたメールが、DMARCでpassするかを表にするとこのようになります↓

|  SPFがPASS | エンベロープFROMとヘッダFROMは | DKIMがPASS | DKIMのdタグとヘッダFROMは | DMARC検証結果 |
|:-:|:-:|:-:|:-:|:-:|
|  PASS  | 同じドメイン  |  なんでも  | なんでも   |  PASS |
|   PASS |  違うドメイン | なんでも   | なんでも   | NG  |
|   なんでも |  なんでも | PASS  | 同じドメイン    | PASS|
|    なんでも|  なんでも | PASS  |  違うドメイン |  NG |
|   PASS |   違うドメイン|  PASS | 同じドメイン  |  PASS |
|   PASS |  同じドメイン |  PASS | 違うドメイン  |  PASS |
|    PASSしてない| PASSしてない  | PASS  | 同じドメイン  | PASS  |
|  PASS  | 同じドメイン  |    PASSしてない|    PASSしてない|     PASS |


## まとめ

- SPF,DKIMはエンベロープFROMとヘッダーFROMの不一致を検出できない仕様である
- DMARCはエンベロープFROMとエンベロープFROMが不一致を検出することができる
- DMARCはヘッダーFROMのドメインのDNSサーバへ確認にいき、ヘッダーFROMのドメインが設定したポリシを行う。