メール・到達率

受信専用ドメインのSPFとDMARC|なりすましを防ぐ設定

ここに向けたドメインはメールを受け取るだけで、一切送信しません。だからこそ世界で一番守りやすいドメインであり、同時に一番忘れられやすいドメインでもあります — 必要なのは3つのレコードと、存在する中で最も厳格な設定。他の誰もが必要とする半年がかりの段階的移行は、一切不要です。

  • 中級
  • 読了19分
青い封筒が灰色のメールボックスへ滑り込む一方で、もう一通の封筒は青い盾に阻まれて追い返されている

方向は2つ、設定したのはそのうち1つ

ドメインをここに向けるには、DNSレコードが1つあれば足ります。そのレコード — MX — が答える質問はただ1つ、このドメイン宛てのメールはどこへ行くのかです。キャッチオールに必要なものはそれがすべてであり、それが解決すればドメインは動き始めます。しかし同時に、その時点ではまだ半分しか設定できていません。ドメイン名は2つの方向で使われるのに、MXレコードは2つ目の方向については何も語らないからです。

自分宛てのメール何でも@自分のドメイン自分の受信箱配信されて保存されるこれは自分のMXレコードが決める自分を騙るメールFromに自分のドメイン他人の受信箱配信されないこれは自分のSPFとDMARCが決める方向は2つ、レコードも2組。一方を公開しても、もう一方には何の効果もない。
どちらの流れも、同じドメイン名についてのものです。あなたが公開したレコードが上側を支配します。下側は、あなたがまだ書いていないレコードによって答えられるべきものであり、答えられていない質問には、それぞれの受信サーバーが自分自身の推測で答えてしまいます。

興味深いのは2つ目の方向です。メールのプロトコルには、見知らぬ誰かが自分のマシンから送るメッセージのFrom:欄に、あなたのドメインを書き込むことを止める仕組みは何もありません。あなたのDNSにも、レジストラにも、メールボックスにもアクセスする必要はありません — メッセージ内のアドレスは、資格証明ではなく単なる主張であり、それは昔からずっとそうでした。その主張が信じられるかどうかを決めるのは、誰にそれを主張する権限があるかについて、あなたのドメインが何と言っているかです。

何も言わないドメイン
受信サーバーはSPFもDMARCのポリシーも見つけられず、自分自身のヒューリスティクス — 評判、内容、そのドメインが過去にどう振る舞ってきたか — に頼らざるを得なくなります。履歴もポリシーもない真新しいドメインは、なりすましの対象としてほぼ理想的です。偽装に反論する材料が何もなく、後になって非難する相手もいないからです。
だめだと言うドメイン
同じサーバーが、このドメインとして送信することはどのマシンにも許可されておらず、失敗したものは拒否すべきだと述べる公開済みのポリシーを見つけます。もはや判断に迷う余地はありません。メッセージは玄関先で突き返され、多くの場合、迷惑メールフォルダにすら届きません。

これは大企業のブランドについての仮の話ではありません。送信メールを持たないドメインが狙われるのは、まさにポリシーを持たないからです — 誰にも守られておらず、2週間ほど使われては捨てられる名前は、抵抗してくる名前よりも、迷惑メールの送り主にとって価値があります。

なぜ他の人が半年かける部分を、あなたは省略できるのか

これまでにDMARCについて何か読んだことがあるなら、それは時間をかけて慎重に進めるべきプロジェクトだと書かれていたはずです。その助言は正しいのですが、あなたには当てはまりません。それはメールを送信するドメインのために書かれたものであり、時間がかかる理由はただ1つ、失敗したものはすべて拒否せよと世界に告げる前に、自分を名乗って正規に送信しているすべてのシステムを見つけ出し、そのひとつひとつを通過させなければならないからです。普通の組織では、そのリストは誰もが思っているより長く、しかも最初から分かっているのではなく、後から発見されるものです。

  1. 何もしないポリシーを公開する。p=noneは、受信側に報告だけを求め、何も変更しません。忘れられていた送信者が、ポリシー自体によって締め出されることのないようにするためです。
  2. 何週間もレポートを読む。請求システム、ヘルプデスク、ニュースレター配信ツール、誰かが2019年に登録した採用プラットフォーム — そのひとつひとつが失敗する送信元として現れ、それぞれを許可するか廃止するかしなければなりません。
  3. 段階的に締め付ける。quarantineへ移行し、待ち、様子を見て、そこで初めてrejectへ進みます。締め付けの一歩一歩が、誰かが頼っているメールを静かに止めてしまう可能性があるからです。

これらの手順はすべて、正規の送信者を自分自身のポリシーから守るために存在します。受信専用の受信箱に向けられたドメインには、正規の送信者が存在しません。リストが長いとか、見つけにくいとか、一部だけ分かっていないとかいう話ではなく、そもそも空です。そして、すべてを拒否するポリシーは、存在しない送信者を壊しようがありません。

最終形にいきなり進むべき理由は、もう一つ副次的にあります。p=noneのままのドメインは、何も求めないポリシーを公開していることになり、受信サーバーはそれをポリシーがまったくないドメインとほぼ同じに扱います。レコードは存在するので、対応済みに見えます — これは、明らかに未完成であるより始末が悪いのです。なぜなら、誰も後から仕上げに戻ってこないからです。

3つのレコード

3つともTXTレコードで、すでにあるMXレコードの隣に追加します。名前の書き方は、ほとんどのDNS管理画面が求める形式 — ゾーンからの相対表記で、@がドメイン自身を意味する形式です。完全修飾名を求められる場合は、代わりにyourdomain.com_dmarc.yourdomain.com*._domainkey.yourdomain.comと書いてください。

名前種別決めること
@TXTv=spf1 -allエンベロープにこのドメインを名乗ってメールを送ることは、どのマシンにも許可されていません。一部のマシンではなく、一切です。
_dmarcTXTv=DMARC1; p=reject; sp=reject; adkim=s; aspf=sこのドメインを名乗って届いたものの、それを証明できないものはすべて拒否すべきであり、それはすべてのサブドメインについても同様です。
*._domainkeyTXTv=DKIM1; p=このドメインについて問い合わせが来る可能性のあるDKIM鍵はすべて無効化されており、偽装した署名を検証させることはできません。

利用しているプロバイダが値を引用符で囲むことを求める場合は、そのとおりにしてください。管理画面によっては自動で引用符を追加し、結果として二重に保存してしまうことがあり、どんなチェッカーでも読めないレコードになります — digで確認した値が二重の引用符で囲まれて返ってきたら、それが原因です。

そのまま貼り付けられる3つの値です。打ち直すのではなくコピーしてください。DMARCレコードでセミコロンが1つ抜けるだけで、タグのリスト全体が解析不能になり、解析できないポリシーはポリシーがまったくないのと同じ扱いになります。

SPF — ドメイン自身にv=spf1 -all

DMARC — _dmarcという名前にv=DMARC1; p=reject; sp=reject; adkim=s; aspf=s

DKIM — *._domainkeyという名前にv=DKIM1; p=

それらのレコードの一語一語が、実際に何をしているのか

5つの決定事項があり、どれがどれなのか知っておく価値があります — 主な理由は、もしこのドメインがいつか送信を始めることになったとき、どれを緩めればよいかを後で見分けられるようにするためです。

-all
SPFレコードの末尾にあり、ここで意味を持つのはこの部分だけです。これは上に挙げられていないものはすべて偽装であるという意味で、そして上には何も挙げられていません。よく使われる代替の~allおそらく偽装だが、とにかく配信したうえで印を付けよという意味です — これは自分の送信元をまだ探している段階では正解ですが、送信元が存在しないと確信している場合には不正解です。
p=reject
このドメインを名乗りながら認証に失敗したメールを、受信サーバーがどう扱うべきかです。noneは報告のみ、quarantineは疑わしいものとして扱う、rejectはSMTPのやり取りの中で拒否する、という意味です。rejectだけが、メッセージを人の目に一切触れさせずに済ませます。
sp=reject
同じことを、すべてのサブドメイン — 存在しないものも含めて — に適用します。これがないと、偽装者は独自のレコードを持たないbilling.yourdomain.comを使います。このサブドメインは、それを止めるものを何一つ継承していません。このタグはpの値をデフォルトとして引き継ぐので、書かなくてもレコードの挙動は同じです。それでも書き出すのは、レコードを読み返したときに見えないポリシーは、存在しないと思い込んでしまうポリシーだからです。
adkim=s, aspf=s
厳格アラインメントです。認証されたドメインが、その親戚のようなものではなく、From:欄のドメインと完全に一致することを要求します — そのためanything.yourdomain.comからのメッセージは、親ドメインに与えられた合格証を借用できません。デフォルトは緩やか(relaxed)であり、厳格(strict)こそが、許可すべきものが何もないドメインが表明すべき設定です。
v=DKIM1; p=
中身の鍵が空のDKIM公開鍵です。仕様上、空の鍵は失効を意味すると明記されているため、このドメイン配下のどんなセレクタ名を指定した署名も、無視されるのではなく検証に失敗します。ワイルドカードは、偽装者が考え出すかもしれないあらゆるセレクタ名をカバーします。名前を選ぶのは偽装者の側だからです。

そして、絶対に変えてはいけないレコード

ここまでの内容はどれも受信メールに影響しませんし、影響してはいけません。MXレコードは、このドメイン上のすべてのアドレスをここのメールボックスにするものであり、これまでの変更のどれによっても変わりません。

MXレコード — 変更なし10 smtp.grabmail.io

新しい3つのレコードとこのレコードは、それぞれ別の質問に答えているので、互いに干渉しません。SPFとDMARCは、あなたを名乗るメールを受け入れるかどうかを判断するサーバーが読み、MXは、あなた宛てのメールをどこへ配信するかを判断するサーバーが読みます。この4つすべてを備えたドメインは、すべてを受け取りながら、誰の身元も保証しないドメインです。

3つのコマンドで、設定を確認する

DNSは推測で済ませる場所ではありません。これらのレコードはどれも、見知らぬ相手に読まれるために公開されているので、彼らとまったく同じようにあなた自身も読むことができます — アカウントも、専用ツールも、ドメインを貼り付けるサイトも必要ありません。

shell
$ dig +short TXT      yourdomain.com
dig +short TXT _dmarc.yourdomain.com
dig +short MX       yourdomain.com

自分のドメインに置き換えてください。探すべきものはこれです。その名前にすでにある他のTXTレコードが多少混ざっていても構いません。

あるべき応答
"v=spf1 -all"
"v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s"
10 smtp.grabmail.io.

うまくいかない場合のパターンは4つあり、だいたい頻度の高い順に並べています。

最初のコマンドが、何も返さない
レコードがまだ伝播していないか、間違った名前に追加されています。ドメイン自身に対するTXTレコードはwwwではなく@に置くものです — 直前に編集した名前をデフォルトにしてしまう管理画面が、たいていの原因です。
SPFレコードが2つ返ってくる
ドメインに許されるSPFレコードはちょうど1つです。2つあることは1つより厳格になるわけではなく、恒久的なエラーです。受信サーバーは2つ見つけると、SPFチェックを失敗ではなく壊れているものとして扱います。すでにSPFレコードがあった場合は、2つ目を追加するのではなく、そのレコードを編集してください。
DMARCの行は返ってくるのに、何も強制されていない
値を注意深く読んでください。v=DMARC1で始まっていなければならず、タグはセミコロンで区切られています。バージョンタグが抜けているレコードや、セミコロンがカンマに変わってしまったレコードは、弱いポリシーになるのではなく、解析不能なポリシーになります。これはポリシーが全くないのと同じ扱いです。
MXの応答が変わっている
本来、変わっているはずがありません。MXの行が消えていたり、ドットだけが表示されていたり、smtp.grabmail.io以外のホストが並んでいたりしたら、他の何よりも先に手を止めて元に戻してください — それは、あなたの受信箱が依存しているレコードです。

ほとんど誰もが見落とす部分 — サブドメイン

DMARCとSPFは、ネームスペースを同じ方法では分割しません。そしてこの違いこそが、丁寧に保護したはずのドメインが漏れる場所です。sp=rejectは、存在するかどうかにかかわらず、本当にすべてのサブドメインをカバーします。SPFはまったくそのようには動きません。エンベロープの正確な名前に対して検索が行われ、独自のSPFレコードを持たない名前は、SPFレコードを持たないままです — 親のレコードを継承することはありません。

偽装者が使うものその名前のSPF何が止めるか
yourdomain.com-allが見つかり、チェックは失敗する。SPFとDMARCの両方。これこそ、上の3つのレコードが書かれた対象のケースです。
billing.yourdomain.comなし(自分で公開しない限り)。SPFは失敗ではなく無結果を返す。DMARC単独、sp=rejectによるもの — これで十分であり、だからこそこのタグは省略できません。
yourdomaln.com、見た目がそっくりな別ドメイン無関係。あなたのドメインではない。公開できるものは何もない。名前も、所有者も、レコードもすべて別物。

2行目についてはDMARCだけでカバーできているので、これは穴を塞ぐというより二重の備えです — ただし、ワイルドカードSPFレコードはたった1行の追加でSPFの層でもこの隙間を塞いでくれます。これは、SPFはチェックするがDMARCは実装していない受信側にとって意味があります。

ワイルドカードSPF — もう1つのTXTレコード* TXT v=spf1 -all

DNSのワイルドカードは、独自のレコードを持たない名前に対してのみ答えます。もしmail.yourdomain.comにすでに何らかのTXTレコードがある場合、その名前に対してワイルドカードは参照されず、そこにSPFレコードを明示的に公開する必要があります。キャッチオール専用のドメインでは、その状況はまれで、対策を練るほどではないにせよ、知っておく価値はあります。

レポート、そしてそれを受け取る価値はあるのか

DMARCにはレポートという側面もあります。ruaタグを追加すると、参加している受信側から、あなたのドメインを名乗ったものすべてと、それがどうなったかについての日次サマリーが送られてきます。これは、DMARCの中であなたがまだ知らなかった何かを教えてくれる唯一の部分であり、ここに向けたドメインでは、それを集めるのに一切コストがかかりません。送り先のアドレスを、このドメイン自身のアドレスにできるからです。

レポート付きDMARC — ドメイン部分を置き換えるv=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:dmarc@yourdomain.com

レポートを同じドメイン上のアドレスへ送るようにしておけば、多くの人が引っかかる仕様の一部を回避できます。もしrua別のドメインのアドレスを指定していると、その別ドメインの側で、あなたのレポートを受け取ることを許可するレコードを公開しなければならず、それが公開されるまで、ほとんどの送信元は何も送ってきません。同じドメインであれば、そのようなレコードは不要で、間違えようがありません。有効にする前に、届くものが何であるかを知っておく価値があります。

  • XML形式で、gzip圧縮された添付ファイルとして届きます。コーヒー片手にさっと読めるようなサマリーではありません。小規模なドメインでも、大手メールボックスプロバイダから1日に数件は届き、それぞれ数キロバイト程度です。解凍して読むための仕組みが必要になるでしょう。
  • 空であることが良い結果です。何も送信しないドメインが生成するレポートには、失敗だけが並んでいるはずで、静かな1週間は、今のところ誰もあなたを装っていないことを意味します — これは立派な情報であり、それを知る唯一の方法でもあります。
  • ごく普通のメールとして届きます。ここではそれは、ごく普通のメールボックスを意味します。ブラウザからも、API経由でも他のものと同じように読め、他のすべてと同じく5日後には削除されます。

そもそも集めたくないのであれば、このタグは丸ごと省いて構いません。ruaのないDMARCレコードも完全に有効なレコードであり、保護の効き目もまったく変わりません。レポートは何が起きているかを知るための手段であって、ポリシーを強制する仕組みではありません。

これがしないこと

これらのレコードが対応する範囲は狭く、その境界をはっきりさせておくことが、正しく頼れる対策と、間違って頼ってしまう対策との分かれ目になります。カバーしていないことが4つあります。

自分の受信箱をフィルタリングしない
あなたのドメインのSPFとDMARCは、あなたからのメールを受け取るサーバーへの指示です。それらは他人のメールシステムに読まれるものであって、あなた自身のシステムに読まれることは決してなく、キャッチオールに届くものには何の影響も与えません。届くものは相変わらず、唯一の資格証明がそれを知っていることであるアドレスに対して、世界中が送りつけてくるものすべてです。
Fromに表示される名前は止められない
Your Company <attacker@gmail.com>のようなメッセージは、すべてのチェックを通過します。認証されたドメインは、本当に攻撃者自身のものだからです。DMARCが守るのはドメインであって、その前に表示される名前ではありません — そしてスマートフォンでは、その表示名だけしか見えないことがよくあります。
見た目がそっくりな別ドメインには手が届かない
あなたのドメインと1文字違いのドメインは、他人のドメインであり、他人のレコードを持っています。あなたが何を公開しても、そこには届きません。それはレジストラと監視の問題であり、文字通り別の問題です。
メールボックスを非公開にはしない
ここのアドレスには、依然としてパスワードがありません。知っている人なら誰でも読むことができ、それがこのサービス全体の取り決めです。自分のドメインを使うことで無くなるのは推測される可能性であって、読まれる可能性ではありません — その点を正直に書いたものがキャッチオールドメインについてのガイドにあります。

最初から最後まで、実際にやってみる

作業全体を、どの段階でもドメインが動き続ける順序で並べました。

  1. まずMXを確認する。dig +short MX yourdomain.comsmtp.grabmail.ioだけを返すはずです。何かを追加する前にこれを直してください。受信できていないドメインでは、他の何をやっても無意味だからです。
  2. SPFレコードを追加する。@に対して、すでにある場合を除いて。すでにある場合は編集してください。2つあることは厳格な設定ではなく、エラーだからです。
  3. DMARCレコードを追加する。_dmarcに対して、いきなり厳格なポリシーで。ここには段階を踏むべき移行はなく、それを飛ばしても壊れるものは何もありません。
  4. ワイルドカードDKIMレコードを追加する。*._domainkeyに対して。サブドメインの層を二重に塞ぎたいなら、ワイルドカードSPFレコードも追加してください。
  5. 4つすべてを読み返す。TTLが切れるだけの時間が経ったら、パブリックリゾルバに対してdigで。
  6. 自分宛てに何か送ってみる。どこからでもいいので、このドメイン上の自分のアドレスの1つにメールを送り、受信箱を開いてください。届けば、受信側はこの変更を無事に乗り越えたということであり、それこそが確認する価値のある唯一の退行です。

これでドメインは完成です。今後思いつくどんなアドレスも受け入れつつ、誰の身元も一切保証しません。まだドメインを接続していないなら、キャッチオールのガイドから始めてください — 必要なのはレコード1つ、同じく5分です — そのうえでこのページに戻ってくれば、何一つ中途半端に終わらせない順序になります。

質問

何も署名しないのに、本当にDKIMレコードは必要ですか?

自分のメールを動かすためには必要ありません。そもそも送信するメールがないからです。これを公開するのは、偽装者がセレクタ名をでっち上げ、自分の鍵でメッセージに署名して検証を通そうとするのを防ぐためです — 空の鍵は、偽装者が選びうるどのセレクタ名に対しても失効済みと常に答え続けます。レコードは1つだけで、メンテナンスも一切不要、そしてSPFとDMARCが開けたままにしている唯一の抜け道を塞いでくれます。

これらの設定で、キャッチオールに届く迷惑メールは減りますか?

減りません。よくある誤解なので、はっきり言っておく価値があります。これらのレコードが取り締まるのは、あなたのドメインを名乗って送られてくるメールです。あなたのドメイン宛てに届くメールには影響がなく、そこにあるすべてのアドレスは相変わらずすべてを受け入れます。それがキャッチオールというものです。特定のアドレスに届く迷惑メールが問題なら、直すべきはそのアドレスの使用をやめることであって、これらのレコードを変更することではありません。

後になってこのドメインからメールを送りたくなったらどうすればよいですか?

そのときは、次の2つをこの順序で変更します。何かを送信する前にSPFレコードで新しい送信元を許可すること、そしてその送信元が求めるセレクタにDKIM鍵を追加することです。*._domainkeyのワイルドカードは、本物のセレクタを塞いだりしません — その名前ぴったりの明示的なレコードが先に見つかり、ワイルドカードはレコードを持たない名前に対してのみ参照されるからです。ここでの設定は、あなたを追い詰めるものではまったくなく、単にこのドメインが、デフォルトで開いているのではなく、デフォルトで閉じているというだけのことです。

安全のため、まずp=noneやp=quarantineから始めるべきですか?

それらの段階は、まだ見つかっていない送信者を守るために存在します。あなたには送信者がいないので、段階が守るべきものは何もなく、厳格なポリシーが壊すものも何もありません。受信専用のドメインでnoneから始めても、リスクは減りません。それは受信側に何もしなくていいと告げるレコードを公開するだけで、ドメインは以前と同じくらい偽装可能なまま残り、しかも対応済みに見えるという不利な点まで加わります。

これらのレコードを追加すると、MXレコードや受信箱に影響しますか?

まったくしません。それぞれ別の質問に答える別々のレコードであり、あなた宛てのメールをどこへ配信するかを判断する際に、SPFやDMARCを参照する受信サーバーはありません。受信箱を壊しうる唯一のものは、MXそのものを変更することです — だからこそ、パークドメイン向けガイドが推奨するnull MXレコードについて、上に独立した節を設けています。

効果が出るまでどれくらいかかりますか?

新しいレコードは、伝播すればすぐに使えるようになり、通常は数分です。すでにあったレコードを変更する場合は、その古いTTLの分だけ時間がかかります。以前の値を取得したリゾルバは、それが期限切れになるまで保持し続けるからです。既存のレコードをこれから編集するつもりなら、前日のうちにTTLを短くしておくのが、変更を素早く反映させるコツです — すでに編集してしまった後なら、待つ以外の選択肢はありません。

サブドメインごとに別々のレコードが必要ですか?

DMARCについては不要です。sp=rejectが、一度も存在したことのないサブドメインも含めて、すべてをカバーします。SPFについては、厳密には必要です — サブドメインは親のSPFレコードを継承しません — ただし*に対する1つのワイルドカードTXTレコードが、独自のレコードを持たないすべての名前に答えてくれます。そしてキャッチオールドメインでは、それがすべての名前に当てはまります。

DMARCレポートの送り先を、代わりにGmailのアドレスにできますか?

できますが、その場合は相手側のドメインが許可を出す必要があります。自分のドメインの外にあるruaアドレスには、yourdomain.com._report._dmarc.gmail.comというレコードが必要になりますが、その名前はあなたのものではないので公開できません。だからこそ、上の例ではレポートを自分自身のドメインのアドレスへ送っています。そこでは許可は不要で、メールはただキャッチオールに届くだけです。

実際に機能しているかどうかは、どうすれば分かりますか?

直接的な証拠はレポートです。ruaを有効にすれば、サマリーの中に、あなたを名乗って送信しようとしたすべての送信元と、各受信側がそれにどう対応したかが記されます。レポートがなくても、パブリックリゾルバからdigでレコードを読み返すのが実用的な確認方法です。ポリシーはそれを読むサーバーによって強制されるので、見知らぬ相手に対して正しく解決されるレコードは、機能しているレコードだということになります。

続きを読む

新しいうちに試してみてください

アドレスの取得はワンクリックで、アカウントもカードも不要です。このガイドの内容はすべて、そのアドレスですぐに試せます。

おかえりなさい

受信箱とドメインを、ひとつの場所に。