LoginSignup
2
4

More than 1 year has passed since last update.

【図解】メール認証とDNS

Posted at

概要

メールの送信元認証を、DNSの観点から学習し、図解してみました。

学習内容

送信元メールアドレスを偽装することは比較的簡単で、なりすまし・標的型攻撃によく使われます。私のYahooメールにも、偽Amazonから「アカウント停止するぞ」メールが頻繁に来ています。登録情報が不完全だからって、天下のAmazon様が末端ユーザのアカウントを停止するなんて、特にメリットがないと思うんですけどね。

偽装メール対策として、メールの送信元が正しいかを認証する仕組みがあります。今回は、以下の3種類の技術について調べてみました。

  • SPF(Sender Policy Framework):送信元IPアドレスの認証
  • DKIM(DomainKeys Identified Mail):電子署名による認証
  • DMARC(Domain-based Message Authentication, Reporting, and Conformance):認証失敗時の動作定義

これらの技術は、DNSのTXTレコードを使っている点で共通しています。TXTレコードを使って、決められた文字列をやりとりすることで、送信元の認証や認証失敗時の動作定義をしています。

図解①:Alice→Bob

下図が、メール認証とDNSの全体像です。業界スタンダード?の、Alice(example.com)からBob(example.net)にメールを送るシチュエーションですね。図の左上部がAliceが送るメールの情報です。

メールDNS1.png

Aliceからのメールを受け取ったexample.netのメールサーバは、送信元メールアドレスであるexample.comのDNSサーバに問い合わせを行います。

SPF

SPF認証では、メール送信元のIPアドレスと、SPFのTXTレコードに記載されているIPアドレスを比較して検証します。送信元の住所として記載されたものが合っているか、Alice本人に電話して確認するようなイメージですね。

TXTレコードには、送信元として許可されたIPアドレス(FQDNでも可)と、認証結果の処理内容が記載されます。ただし、認証結果の処理内容はゆるい定義でしかなく、最終的には受信側の設定に依存します。

DKIM

DKIM認証では、秘密鍵と公開鍵の仕組みを使って送信元を検証します。メール送信元が秘密鍵を使って電子署名を行い、メール受信者が公開鍵を使って電子署名を検証します。Aliceが特殊な印鑑を押して、Bobがその印影を確認するイメージですね。

TXTレコードには、電子署名の公開鍵が記載されます。また、TXTレコードのホスト名として、[セレクタ名]._domainkeyが使われます。

DMARC

DMARCは、認証失敗時の動作を定義する仕組みです。SPF認証やDKIM認証だけでは、認証失敗したメール(なりすましメール)が受信側でどう処理されたか、送信側は把握できません。DMARCを使うことで、認証失敗時の動作ポリシーを送信側が公開し、受信側の動作をコントロールしたり、受信側からレポートを上げさせたりすることができます。

TXTレコードには、認証失敗時のポリシー(none、reject、quarantineなど)や、レポートの送付先を指定できます。また、TXTレコードのホスト名として、_dmarcが使われます。

結果

上図では、SPF認証・DKIM認証ともに問題ないので、DMARCの記載は無視して、Bobはメールを受信します
※DKIM認証の値は一致しませんが、イメージで…

図解②:Mallory→Bob

次に、AliceになりすましたMalloryが、Bobにメールを送るシチュエーションで考えてみましょう。

メールDNS2.png

送信元のMalloryは、送信元メールアドレスをAliceのものに偽装し、電子署名を付与して、Bobにメールを送信しました。受信側のBobは、送信元メールアドレスexample.comのDNSサーバに問い合わせて検証を行います。

SPF

SPF認証では、メールのIPアドレス198.51.100.1と、SPFレコードを比較します。+で許可された192.0.2.1/32とは合致しないため、~allに該当することになります。~は、不正メールとして処理されるが、配信もされる識別子です。

よって、この時点では、SPF認証はNGだがメール受信はする、という状態です。

DKIM

DKIM認証では、DKIMレコードからAliceの公開鍵を取得し、メールに付与された電子署名と検証します。検証の結果、Aliceの秘密鍵で作成された電子署名ではないことがわかりました。

DKIM認証はNGですが、DKIMは受信側の動作には干渉しないので、メール自体は受信する状態です。

DMARC

DMARCでは、DMARCレコードの記載に沿って、認証失敗時の受信動作を確認します。Aliceの属するexample.comのDMARCレコードには、認証失敗時は受信しない(p=reject)、と定義されています。また、DMARCレコードに記載されたdmarc@example.comに対して、集計レポート・認証失敗レポートが送信されます。

結果

今回はSPF・DKIMともに認証失敗しているので、受信側のexample.netは、送信側のDMARCレコードの動作定義に従い、このメールを削除します。よって、Bobがこのメールを目にすることはありません。

所感

以上、メール送信元認証の仕組みを、DNSの観点から見てきました。

他のレコードと比較して、TXTレコードは記載の自由度が高く、何に使われているかがわかりにくいものでした。メール送信元認証を通じて、使われ方の一例を知ることができました。

SPF・DKIMでは検知だけを行い、透過or削除の動作定義はDMARCで行う、という点が特徴的だと感じました。ネットワークにおけるIDSとIPSに似ていますが、検知と防御を兼ねるIPSに対して、DMARCは防御専門ですね。

また、記載を間違えれば動作しなかったり、意図しない動作になったりします。~allと-all(チルダとハイフン)とか、紛らわしいです… DNSに限らず、事前の動作検証が大切だと思いました。

実際の運用では、認証失敗したら即削除、みたいなハードな設定は少なそうです。上記の例のようにDMARCの動作をrejectにするのは、結構勇気がいりますね。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4