email

Email ツール

メール認証の実像をまとめた実務リファレンス。エンベロープとヘッダーの2つのFrom、SPF/DKIM/DMARC/ARCが証明できることとできないこと、Receivedチェーンと認証結果の読み方、ヘッダーや.emlの調査ツールの選び分けまでを扱います。

3 ツール

§01 分野ガイド

2つの From を分けて考える

なりすましの疑問はほぼすべて2つの送信者IDの混同に行き着きます。エンベロープ送信者は SMTPの MAIL FROM のアドレスで、バウンスの戻り先。受信側は Return-Path:Received-SPF:smtp.mailfrom= に記録します。ヘッダー送信者は本文中の From: で、 人間が見るのはこちら。SMTPは両者の一致を要求しません。

SPFが認証するのはエンベロープ(接続元IPは MAIL FROM のドメインで送れるか)、DKIMは内容 (h= のヘッダーと本文ハッシュ bh= への署名、公開鍵はDNS)です。どちらも受信者が読む アドレスには触れません。その隙を埋めるのがDMARCの alignment で、From: のドメインが SPFかDKIMの d= と一致することを要求します。銀行を騙るメールで spf=pass は普通ですが、 dmarc=pass は違います。

検証しているのは自分ではありません。判定は受信MTAが配送時に行い Authentication-Results: に書きます。以後それはテキスト上の主張で、書いたホップが自組織の設備のときだけ信頼でき ます。

各方式が証明できること

方式公開場所認証対象転送で残るかFrom: 偽装を防げるか
SPFエンベロープドメインの TXTMAIL FROM の接続元IP残らない防げない
DKIM<selector>._domainkey.<d=>TXTh= のヘッダー + 本文ハッシュ bh=本文/Subject 無改変なら残るalignment時のみ
DMARC_dmarc.<domain>TXTFrom: のalignmentとポリシー残ったDKIM経由で有効防げる(本来の目的)
ARCARC-Seal / ARC-Message-Signature上流の判定を中継越しに保全設計目的そのもの防げない
MTA-STS / DANE_mta-sts.<domain>TXT / TLSA経路(TLSの必須化)対象外防げない

結果の語は3方式で共通で、値ごとに直す対象が違います。

意味主な原因
pass検証成功
fail権限なし・強い拒否(-all)なりすまし、登録漏れの中継
softfail権限なしだが受理(~all)移行途中で緩いまま放置
neutral判断しない(?all)ポリシーが何も述べていない
noneレコード未公開未設定
temperrorDNS一時障害(再試行可)リゾルバや権威側の不調
permerrorレコードを評価できないDNS参照10回超、v=spf1 重複、構文エラー

どのツールをいつ使うか

生ヘッダーがあるならメールヘッダー解析。継続行をunfoldし、 Received: を反転してホップ1=発信サーバー、最終=自分のプロバイダの順に並べ、ホップ間の 秒数を出します。Delay: 1800s はメールを30分抱えた中継の名指しです。下段に Authentication-Results / Received-SPF / DKIM-Signature / ARC-Authentication-Results が原文のまま並びます(DMARCの判定は1つ目の中の dmarc=pass (p=REJECT …))。生ヘッダーは送信元IPや内部ホスト名を含みます。解析はブラウザ内 完結です。

.eml ごと(バウンスや保存した添付)なら EMLメールビューア。RFC 2047のencoded-word(=?UTF-8?B?…?=)をデコード して日本語Subjectを読める形にし、From/To/Cc/Subject/Date/Reply-To/Message-ID を並べます。From: と別ドメインの Reply-To はBECの典型です。本文は生表示でMIME boundaryも見え、base64パートはBase64に通せます。

ドメインしか無いならDNSへ。DNSルックアップTXT(v=spf1)、MX (優先度付き)、修正が効くまでを決める TTL も出ます(キャッシュはdnsハブ)。 サーバーツールで、ドメイン名だけが api.sitekits.dev に送られ保存されません。受理は ホスト名ラベルのみで _dmarc.example.com 等は弾かれるため、そこは dig TXT _dmarc.example.com を使います。

リンク調査はURLパーサー(送信せず分解のみ)と IDN/Punycode変換(xn-- 形でホモグラフを暴く)。どちらもブラウザ内 完結で、メールヘッダー解析やEMLビューアと同じ /ja/for/security/に収録しています。オフセット違いの時刻は タイムゾーン変換が速く、これもブラウザ内完結ですが、収録先は security ではなく/ja/for/sre/です。証跡添付前のマスキングは手作業で、 HARサニタイザーの対象はHARでメールヘッダーではありません。

つまずきやすい点

p=none は何も守らない

レポートを求めるだけです。p=quarantine / p=reject に進めない限り受信側は失敗に何も しません。pct= は強制する割合の指定です。

DNS参照10回の上限を超える

include: / a / mx / ptr / redirect= が参照を消費し、SaaS送信元の入れ子 include: も再帰加算されます。10回超で全体が permerror = SPFなし扱いです。

失敗をすべて攻撃と読む

転送やメーリングリストは正当に認証を壊します(中継IPはSPFに落ち、[list] 接頭辞や フッターはDKIMの本文ハッシュを壊す)。単発の fail では断定できません。

Delayや前段ホップを証拠として使う

境界MTAより前のホップは攻撃者が書ける文字列です。Delayの負値や も時計ずれか タイムスタンプ欠落で、証拠にはなりません。

送信しないドメインを放置する

駐車ドメインやサブドメインにも v=spf1 -all_dmarc.<domain>p=reject のDMARC レコード、できれば null MX(MX 0 .)が必要です。ポリシータグは p= が必須で、 sp=reject だけのレコードは不正なため受信側は何も適用せず、駐車ドメイン自身が無防備な まま残ります。sp=reject はサブドメインのポリシーを明示したいときに p= と併記します (sp= を省けばサブドメインは p= を継承します)。放置は自社ブランド入りのなりすまし 素材です。

FAQ
SPFだけで自ドメインのなりすましは防げますか?
防げません。SPFが認証するのはエンベロープ送信者(SMTPのMAIL FROM)だけで、これは受信者の画面には出てきません。攻撃者は自分が管理するドメインでSPFをpassさせたまま、表示される From: ヘッダーにあなたのドメインを書けます。両者を結び付けるのはDMARCのalignment(From: とSPF/DKIMのドメインの一致)だけで、さらに p=quarantine か p=reject にしない限り受信側は失敗に対して何も措置を取りません。
正当なメールが転送されるとSPFが失敗するのはなぜですか?
転送で接続元IPが変わるため、受信サーバーは転送元のIPをあなたのSPFレコードと突き合わせ、未登録と判定します。DKIMは経路ではなくヘッダーと本文に署名するので通常は生き残りますが、メーリングリストがSubjectを書き換えたりフッターを追加すると本文ハッシュが壊れます。DMARCがSPFとDKIMのどちらか一方のpassを認めるのはこのためで、ARCは元の判定を信頼できる中継経由で運ぶ仕組みです。
メールを送らないドメインにもSPFやDMARCは必要ですか?
必要です。無防備な駐車ドメインは自社ブランド入りのなりすまし素材そのもので、攻撃者はまさにそこを探します。v=spf1 -all を公開し、_dmarc.<domain> に p=reject のDMARCレコードを置き、できれば null MX(MX 0 .)で受信も明示的に拒否します。注意点はポリシータグで、p= は必須のため sp=reject だけのレコードは不正となり、受信側は何も適用しません。sp=reject は p= と併記してサブドメインのポリシーを明示したいときに使うもので、省略してもサブドメインは p= を継承します。
Authentication-Results の dmarc=pass は具体的に何を意味しますか?
受信側メールサーバーが、From: ヘッダーのドメインがSPFまたはDKIMをpassしたドメインとalignmentしていることを確認し、_dmarc.<domain> のポリシーを適用したという意味です。受信側の判定が事後的にメールへ書き込まれたものであり、テキストから再検証できる署名ではありません。それを書いたホップが自組織の境界MTAである場合にのみ信頼できます。
SPFの結果が pass でも fail でもなく permerror になるのはなぜですか?
permerror はレコードを評価できなかったという意味です。典型的な原因は、include: / a / mx / redirect= が消費するDNS参照が10回の上限を超えること、同じ名前に v=spf1 のTXTレコードを2本公開していること、余分なセミコロンなどの構文エラーです。受信側は permerror を「使えるSPFなし」として扱うため、DMARCの判定はDKIM任せになります。