送信ドメインを認証するためのSPFレコードに詳しくなろう

送信ドメイン認証イメージ図

この記事は Sender Policy Framework (SPF): A Layer of Protection in Email Infrastructure の抄訳です。

メールをサーバ間で送受信するためには、SMTP(Simple Mail Transfer Protocol)というプロトコルを使います。SMTPサービスプロバイダであるSendGridも、もちろんSMTPによる通信を行っています。

SMTPのセキュリティ上の弱点として、任意のドメインの差出人になりすますことができる、というものがあります。
そのため受信者には、本当にその差出人からメールが送信されたかどうか分かりません。送信者にとっても、自身のドメインになりすましてブランドの信頼を落とす不届き者がいるかどうか、知るのは難しいことです。
これは、コミュニケーションツールであるメールの信頼性を揺るがす問題です。しかし、DNSのTXTレコードの一種であるSPF(Sender Policy Framework)レコードを使えば、ある程度は解決します。

まずはSPFの仕組みを掴みたい、という場合は『SPFとは?』をお読みください。

SPFレコードの概要

SPFレコードとは、ドメインの管理者がTXTレコードとして作成する短いテキストデータです。このTXTレコードは、他のレコード(A、PTR、MXなど)と一緒に、DNSへ登録します。たとえば次のようなものです。

“v=spf1 ip4:12.34.56.78 include:example.com -all“

SPFレコードの問い合わせタイミング

SPFレコードは、そのドメインからのメール送信を許可されているのはどういったサーバなのかを、受信サーバに伝える役目を担います。通常、SMTPの一連の通信手順のうち、メール本文を送信する前の段階で問い合わせられます。

詳しく追ってみましょう。
SMTPでは、まず送信サーバと受信サーバの間でTCPコネクションが開かれます。そうしてコネクションが確立したのち、HELOコマンドによってメールの送信元ドメインを受信サーバに伝えます。
次に、MAIL FROMコマンドによって送信元メールアドレスを伝えます。MAIL FROMコマンドで入力されたドメインは、メールのエンベロープFromとReturn-Pathヘッダに設定されます。
たとえばMAIL FROMコマンドにおいて、luke@example.comが入力されたとします。受信サーバーは、example.comのDNSレコード群のうち”v=spf1″で始まるTXTレコード、すなわちSPFレコードを確認します。SPFレコードがなければ認証は通り、複数あればエラーになるでしょう。SPFレコードが一つだけならば、受信サーバはそれに従って、送信サーバのIPアドレスを認証するかどうか判断します。

SPFレコードを形作るもの

SPFレコードは様々な機構(mechanism)の組み合わせによって出来ています。各機構は、左側に書かれているものから順番に評価されます。

  • include
    include機構は、ドメイン名を引数とします。
    include先ドメインのSPFレコードで認証処理が通るならば、認証を通します。include先でさらにinclude機構があった場合は、再帰的に評価します。
  • a
    a機構は、ドメイン名を引数とします。
    送信サーバのIPアドレスが、与えられたドメインのAレコードもしくはAAAAレコードで解決されるならば、認証を通します。
  • mx
    mx機構は、ドメイン名を引数とします。
    送信サーバのIPアドレスが、与えられたドメインのMXレコードで解決されるならば、認証を通します。
  • ip4, ip6
    ip4機構とip6機構は、IPアドレスを引数とします。
    CIDR記法によるブロック指定(例 192.168.0.0/16)も可能です。送信サーバのIPアドレスが、与えられたIPアドレスに含まれるならば、認証を通します。
  • ptr
    ptr機構は使わないようにしましょう。
    いくつかの技術的な理由によりエラーとなってしまう場合があり、名前解決のために受信サーバのメモリと帯域を多く消費します。受信サーバによっては、ptr機構が含まれているだけで、認証を弾いてしまう場合もあります。
  • all
    all機構は、引数を取らず常に認証を通します。
    SPFレコードの末尾で使うのが一般的です。たとえば認証結果を失敗にする検証子(qualifier)と組みあわせた「-all」は、「これまでの機構によって認証が通らなかったIPアドレスは、全て認証失敗する」ことを意味します。
  • redirect
    redirectは、正確には機構ではなく変更子(modifier)です。
    redirect先ドメインのSPFレコードを使って認証処理を行います。redirect変更子を利用するならば、他の機構は使わないようにしましょう。redirect変更子を使ったシンプルな例は次のとおりです。

    “v=spf1 redirect=example.com“

機構のうちinclude、a、mx、ptr、exists、redirectは、DNSの問い合わせを要求するため、一つのSPFレコード内での使用は10回以下に制限されています。なおinclude機構は再帰的に評価されるため、たとえばinclude先のSPFレコードがさらに2つのinclude機構を含んでいたならば、3回として数えます。

SendGridユーザがすること

基本的には、CNAMEレコードを設定し、送信元ドメインの参照先をSendGridドメイン(sendgrid.net)に振り向けます。こうすることで、SMTPの受信サーバは、送信元ドメインのSPFレコードではなく、CNAMEで指定されているSendGridのSPFレコードをチェックするようになります。

DNSレコードの設定内容について、詳しくは『独自ドメイン利用(Whitelabeling)および設定時のDNSレコードについて、詳しく教えてください』をご覧ください。

SPFレコードのテスト方法

まず、対象ドメインをSPF Surveyorで確認してみましょう。
このツールは、SPFレコードに間違いがあれば教えてくれます。問題なければ、そのドメインからのテストメールを自身に送ってみましょう。受信したメールのAuthentication-Resultsヘッダに「pass」と書かれていれば、SPFレコードは適切に設定できています。

SPF以外の送信ドメイン認証については、こちらの記事をご覧ください。