DMARC レポートの XML ファイルを HTML 形式のレポートに変換するスクリプト

DMARC レポートを受信して検証しようと思ったのですが、溜まった XML ファイル (実際には .zip や .gz ファイル) をいちいち開いて、XML を読むなんていう非効率なことはやりたくなかったため、これらをまとめて、HTML 形式のレポートに変換するスクリプトを簡単に作ってみました。

先月ですが、自社で使用しているメールアドレス用のドメインに、SPF (Sender Policy Framework) / DKIM (DomainKeys Identified Mail) / DMARC (Domain-based Message Authentication, Reporting, and Conformance) の設定をしました。SPF と DKIM に関してはかなり前から設定済みだったので、実際には DMARC の設定を足したという感じですが。

SPF / DKIM / DMARC に関する細かい説明は省きますが、Google Workspace 管理者向けのヘルプにそれぞれの基本的な説明や、実際の設定方法例について結構わかりやすく解説されているので、興味のある方は下記を一読するとよいと思います。

で、DMARC に関しては、「SPF / DKIM の検証にメールが合格しなかった場合にそのメールをどう処理するか」 を受信サーバに対して指示する仕組みということもあって、まずは段階的に導入して、問題ないはずのメールが間違ってリジェクト (受信されず破棄) されたり、スパムメールフィルタに送られたりしないことを確認してから、本格的な運用に入った方がいいよとされています。

また、それを確認するためのレポートも受け取りましょう、というのが推奨されていますので、当然ながら、初めてこれを設定する私としてもお勧めの通りに進めました。

DMARC の設定自体は、ドメインの TXT レコードに、下記のような設定を追加するだけですので、設定自体は簡単ですが、事前に SPF と DKIM が正しく設定されていることが求められますし、SPF と DKIM を設定してから最低でも 48 時間以上は間を空けて設定しろというのも推奨されていますので、その点は気をつけましょう。

v=DMARC1; p=none; rua=mailto:dmarc_report@example.com

rua にメールアドレスを指定することでそこにレポートが届きます。

p=none; が適用ポリシーになりますが、

  • none: 特に何もしません。
  • quarantine: 迷惑メールフォルダ (もしくはそれに類するもの) に送ってね、と指定します。
  • reject: 受け取り拒否してね、と指定します。つまり受信者に届く前に破棄されます。

という 3 種類の値を指定することができます。本来は p=reject; で運用するべきものですが、初期段階では、前述の通り影響範囲を確認したり、SPF や DKIM の設定が間違っていたり、抜けていたりして検証に失敗していないかなどを確認する猶予期間を取るため、p=none; を指定しても良いとされています。

まずは、p=none; にしておいて、rua で指定したメールアドレスにレポートを送ってもらい、それをしばらく確認しながら様子を見るということですね。

本題

さて、なんか前置きが長くなりましたけども、DMARC の設定が完了すると、1 日に 1 回、レポートメールが送られてきます。レポートの形式は XML で、レポートメールに .zip や .gz に圧縮された状態で届くんですが、ご存じの通り、XML は人間様が読むにはつらいフォーマットです。

私の環境で送られてくる DMARC レポートなんて、大した分量じゃないにもかかわらず、最初に 1、2 件見て、めんどくせってなってしばらく溜まるまで待とうって感じにしたんですが、実際に 1 ヶ月分くらい溜まってみると、もう読む気がしねぇっていう心境になりました。

とはいえ、レポートを全く確認しないわけにもいかないので、重い腰を上げたわけですけども、この溜まった .zip ファイルを、一気に処理して 1 つの HTML ファイルにしてしまえば、読むのも多少は楽なのでは? ということで、簡単に要件をまとめつつ、Node.js で動作させるスクリプトのコーディングに着手。半日くらいで形になったので GitHub で公開しました。

使い方

README.md にまとめてありますけども、まず、リポジトリを git clone してきて、npm install したら、プロジェクトのルートディレクトリに report という名前でディレクトリを作ってください。

ここに、届いた DMARC レポートメールに添付されている .zip ファイルをとにかく必要な数だけ突っ込みます。基本的には .zip や .gz のままでいいですが、解凍した .xml ファイルを入れても大丈夫です。

report ディレクトリに、.zip ファイルや .xml ファイルを格納した例

そしたら、npm run dev してください。プロジェクトのルートディレクトリ直下に、report.html が生成されますので、それをブラウザで開いてもらえれば、レポートの内容が HTML に変換されていると思います。

下記はレポートの例です。

生成された HTML 形式のレポートの例

XML ファイル内に値が入っていない場合は N/A になっていると思いますが、私の手元にある約 1 ヶ月分のレポートでやってみて一応問題はなかったので、多分大丈夫なんじゃないかなと。

ただ、Google さん (.zip 形式) と Microsoft さん (.gz 形式) から届く DMARC レポートでしか試していないのと、私が受け取る DMARC レポートは、大した分量じゃない (弊社は、例えばマーケティングで何千件もメール送ったりするような企業ではないので) ため、デカい DMARC レポートを変換した場合の見やすさみたいのはわかりませんし、そもそも想定してません。

そういう方々はきちんと有償で提供されている、DMARC レポート解析サービスを利用しましょう。あくまで、弊社程度の規模のメールのやりとりしかしない零細企業が、簡単に DMARC レポートを確認したいな、くらいの用途にしてください。

ということで、DMARC レポートをこれで眺めてみましたが、たまに、なりすましされたんだろうなっていうメールが SPF や DKIM の検証で引っかかって、softfail されてるんですよね。

自分たちで運用しているサーバからの送信についてはほぼ問題ないこともわかりましたので、もう少ししたら p=reject; に変更して運用開始しようかなと考えています。

よろしければ使ってみてください。もし何かお気づきの点があればフィードバック頂くか、Fork して修正してもらえれば。

関連エントリー

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?