📧

DMARCレポートを解析・可視化する parsedmarc cli を使ってみた

2024/02/02に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

DMARC 対応していますか?
前回は parsedmarc を使って DMARC レポートを解析・可視化しました。

今回は parsedmarc cli を使ってみます。
Grafana でグラフィカルになる代わりに csv/json ファイルが出力されます。

CLI インストール

Installation にインストール手順が記載されていますが、
ローカル汚したくない気持ちがあるので、docker compose を使います。

ディレクトリ構成はこのようにしました。

$ tree
.
├── Dockerfile
├── docker-compose.yml
├── input
│   └── example.xml
├── output
└── parsedmarc.ini

Dockerfile

FROM python:3.9.18-alpine3.19

RUN apk add --update --no-cache libxml2-dev libxslt-dev build-base libffi-dev \
    && pip install parsedmarc msgraph-core==0.2.2

docker-compose.yml

docker-compose.yml
version: '3.5'
services:
  parsedmarc:
    build: .
    volumes:
      - ./input:/input:ro
      - ./output:/output
      - ./parsedmarc.ini:/parsedmarc.ini:ro
    command: parsedmarc -c /parsedmarc.ini /input/* --debug

parsedmarc.ini

ini ファイルの書式は Using parsedmarc を参照ください。

parsedmarc.ini
[general]
save_aggregate = False
save_forensic = False
output = /output/

実行

input ディレクトリ配下に DMARC レポートを配置します。本エントリの例では example.xml となっていますが、ファイル名は何でも構いません。

DMARC レポート配置が終わったら、docker compose を実行します。

$ docker-compose up 
[+] Building 0.0s (0/0)                                                                                                                                                                                                                                                                                            docker:desktop-linux
[+] Running 1/0
 ✔ Container cli-parsedmarc-1  Created                                                                                                                                                                                                                                                                                             0.0s 
Attaching to cli-parsedmarc-1
cli-parsedmarc-1  |     INFO:cli.py:802:Starting parsedmarc
cli-parsedmarc-1  |    DEBUG:__init__.py:952:Parsing /input/example.xml
cli-parsedmarc-1 exited with code 0

$ docker-compose rm

exit 0 で終わっていれば正常終了です。output ディレクトリ配下に csv/json ファイルが出力されているはずです。

CSV ファイルを見る

xml から csv に変換されて少し読みやすくなりました。
私の教科書とも言える以下のサイトを見ながら csv を理解していきます。

CSVの列名 説明
xml_schema
org_name レポーターの名称 (メール受信側)
org_email
org_extra_contact_info
report_id レポートID
begin_date 集計期間
end_date 集計期間
errors
domain
adkim DKIM 認証識別子のアライメントモード、r=relaxed, s=strict
aspf SPF 認証識別子のアライメントモード、r=relaxed, s=strict
p DMARC ポリシー (none, quarantine, reject)
sp サブドメインに対するポリシー
pct DMARC ポリシーを適用するメールの割合
fo 失敗レポートを送信する条件
source_ip_address 送信元メールサーバーの IP アドレス
source_country
source_reverse_dns
source_base_domain
count 集計期間に送信された回数
spf_aligned SPF アライメントの結果
dkim_aligned DKIM アライメントの結果
dmarc_aligned DMARC アライメントの結果
disposition メッセージに適用されたポリシー(none, quarantine, reject)
policy_override_reasons
policy_override_comments
envelope_from エンベロープ From
header_from メールヘッダ From
envelope_to
dkim_domains
dkim_selectors
dkim_results DKIM 認証結果
spf_domains
spf_scopes SPF 認証対象。mfrom = エンベロープFrom、pra = ヘッダFrom
spf_results 下 SPF 認証結果 を参照

SPF 認証、SPF アライメント、DKIM 認証、DKIM アライメント を確認してどこに問題があるか把握し、対策を行います。
エンベロープ From とヘッダ From が一致しているか、一致していなくてもエンベロープ From で SPF と DKIM 認証をパスしているかなどを調査します。

ベアメールさんのサイトが詳しいです。感謝。

SPF 認証結果

一般的な意味ではなく、parsedmarc の出力結果での意味です。

説明
none SPF レコードが存在しないので認証は失敗
pass SPF 認証に合格
hardfail 受信側で破棄
softfail 受信側に届くが、スパム判定される可能性
neutral 認証結果に関わらず何もしない
temperror 一時的なエラーで認証が失敗している
permerror 様々な要因で認証が失敗している

参考

DMARCレポートとは? 設定方法や集計レポートの読み方、解析ツールを解説
なぜSPF認証が失敗するのですか?SPF認証の失敗を修正するには?
DMARC 詳細仕様-2
DMARCアライメント:緩やかなアライメントモードと厳格なアライメントモード

Discussion