DMARC

メールの送信元認証にはSPFやDKIMがあります。
両方ともDNSサーバからの情報を元に判定するのですが、
前者は送信元サーバのアドレスを、後者は証明書を確認します。
ただ正しいサーバであっても運用上これらが導入されていない可能性もあるわけで、
送信元を確認できないメールをばっさり切り捨ててしまうのはちょっと乱暴です。
これら技術が登場してからだいぶ時間は経ったものの、
対応状況はなおサーバによってまちまちです。
そんなこんなでDMARCというものが誕生し、それら不正かもしれないメールをどうすべきか、
メールを受信したサーバがDNSサーバにアドバイスを求めるような仕組みになっています。

Google Apps(Gmailも?)はわりと早くからSPFとDKIMに対応しているので、
どんな動作になるのかDMARCを設定してみました。
とりあえず私がDNSサーバに追加したレコード(BIND風)は

_dmarc.<独自ドメイン>. IN TXT "v=DMARC1; p=none; rua=mailto:<通知メールアドレス>"

です。詳細はGoogleのサポート情報を参照ください。
ちなみにOutlook.com(独自ドメイン運用)は私の登録当時SPFにだけ対応していました。
あれからだいぶ時間が経過しているので、今はもしかしたらDKIMへも対応しているかもしれません。

で、テストのためにいろいろ詐称したspamメールを送りたいのですが、今やこれが難しい。
普通のISPは普通のユーザに対しOP25Bしてますから。
なのでOP25Bしてない環境からメールを送信します。
ホストはLinuxでMTAにはすでにインストールされているssmtpを用います。
ところでssmtpは送信専用の常駐型ですらない軽いMTAで用途によっては悪くはないのですが、
メールの送り先をDNSで探してくれず、指定したMTAに対してしか送れません。
ということで通常は中継してくれる上位MTAを指定します。
が、裏技があり、送り先のMTAがわかれば(nslookup/dig等で調べられる)
そのホスト名を設定ファイルに直接埋め込むことで送れてしまいます。
相手先がGoogle Appsなら設定ファイル”/etc/ssmtp/ssmtp.conf”は以下のようにします。

mailhub=aspmx.l.google.com
FromLineOverride=YES

2行目は送信元詐称のための設定です。
準備は整ったのでメールを送信します。以下を実行します。

$ mail <送信先メールアドレス> -- -f <送信元メールアドレス>

対話型で件名(Subject:)、本文([Ctrl]+[d]で入力終了)、
CC([Ctrl]+[d]でスキップ)を入力し、エラーなくプロンプトに戻れば送信成功です。
なおFrom詐称やSPF/DKIMの不備によりspam扱いされているはずですので注意が必要です。

ではDMARCで指定した通知メールアドレスに届いているメールを確認してみます。
先の送信元メールアドレスのドメインを管理するDNSサーバに追加したDMARCレコードで
指定した通知用メールアカウントを見ると、

Report domain: <ドメイン名> Submitter: google.com Report-ID: <ID>

なるタイトルのメールが”noreply-dmarc-support@google.com”から届いています。
そのドメインのメールアドレスを送信元とするメールがどこかから送信されると
デイリーレポートとして送られてくるようです。
私はメールを受信したサーバからレポートが来るのかと勘違いしていましたが、
そうではなく正式な送信サーバから通知されるようです。
つまりDMARC対応MTAは何らかのメールを受信したときに
そのメールをどうするべきかをDMARCレコードを参考に判断した上で、
正式な送信サーバに対してその結果を通知し、
正式な送信サーバはその通知をまとめてDMARCレコードを参考に
そのレポートを管理者に送るみたいです。
そのレポートメールにはzipファイルが添付されていて、展開するとxmlファイルが現れます。
正常1通と不正1通が送られた場合のxmlファイルの中身は以下のようになっています。
(‘*’は伏字)

<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
  <report_metadata>
    <org_name>google.com</org_name>
    <email>noreply-dmarc-support@google.com</email>
    <extra_contact_info>http://support.google.com/a/bin/answer.py?answer=2466580</extra_contact_info>
    <report_id>*******************</report_id>
    <date_range>
      <begin>**********</begin>
      <end>**********</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>********.***</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>none</p>
    <sp>none</sp>
    <pct>100</pct>
  </policy_published>
  <record>
    <row>
      <source_ip>***.***.***.***</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>fail</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>********.***</header_from>
    </identifiers>
    <auth_results>
      <spf>
        <domain>****.********.***</domain>
        <result>fail</result>
      </spf>
    </auth_results>
  </record>
  <record>
    <row>
      <source_ip>****:****:****:****::****</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>********.***</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>********.***</domain>
        <result>pass</result>
      </dkim>
      <spf>
        <domain>********.***</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
</feedback>

この情報には送信元/送信先メールアドレスが含まれていませんが、
送信MTAのIPアドレスはわかります。
もし本当の不正メールと判断できれば遮断の検討をすべきでしょう。
なお、IPアドレスはmerit RADbで素性を調べられます。
[Query the RADb]テキストボックスにIPアドレス(IPv4/IPv6)を入力し、
[Query]ボタンを押せば管理している企業名などがわかります。

独自ドメインを個人で運用しているならいきなりreject設定してもいいでしょうが、
万一設定をミスっているとメールが届かないなんてことになりかねませんから、
不正メール送信を発見した時点で対応すればいいのではないでしょうか。

広告