DMARCレポートを解析・可視化する parsedmarc を試してみた
こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。
DMARC 対応していますか?
メール管理者の方々の苦労が目に浮かぶます。DAMRC レポートを受け取ってチェックするといった作業がしばらく続くことと想像します。
ただ、xml を解析するのは生産性が低い作業だと思います。少しでも楽をしたいと思います。
parsedmarc
今回は parsedmarc を使います。
parsedmarc は OSS の DMARC レポート解析と可視化ツールです。
xml 形式の人間には読みにくい DMARC レポートを読みやすく可視化してくれます。
私は試していないですが、IMAP 等でメールを読み込み、自動で解析してくれる機能もあるようです。
parsedmarc は Grafana と Elasticsearch を組み合わせて使うことができます。
やってみた
ローカルで parsedmarc を起動します。
dmarc-visualizer で docker-compose.yml が公開されています。
それを基にミドルウェアのバージョンを最新化してみました。
ディレクトリ構造
.
├── LICENSE
├── README.md
├── big_screenshot.png
├── docker-compose.yml
├── grafana
│ ├── Dockerfile
│ └── grafana-provisioning
│ ├── dashboards
│ │ └── all.yml
│ └── datasources
│ └── all.yml
└── parsedmarc
├── Dockerfile
└── parsedmarc.ini
docker-compose.yml
Elasticsearch のバージョン最新化と、変数 xpack.security.enabled=false
を足しています。
version: '3.5'
services:
parsedmarc:
build: ./parsedmarc/
volumes:
- ./files:/input:ro
- ./output_files:/output
command: parsedmarc -c /parsedmarc.ini /input/* --debug
depends_on:
- elasticsearch
restart: on-failure
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
volumes:
- ./elastic_data:/usr/share/elasticsearch/data
grafana:
build: ./grafana/
ports:
- 3000:3000
user: root
environment:
GF_INSTALL_PLUGINS: grafana-piechart-panel,grafana-worldmap-panel
GF_AUTH_ANONYMOUS_ENABLED: 'true'
grafana/grafana-provisioning/datasources/all.yml
Elasticsearch のバージョンを docker-compose.yml
と合わせています。
apiVersion: 1
datasources:
- name: 'dmarc-ag'
type: 'elasticsearch'
access: 'proxy'
orgId: 1
url: 'http://elasticsearch:9200'
database: '[dmarc_aggregate-]YYYY-MM-DD'
isDefault: true
jsonData:
esVersion: 8.12.0
timeField: 'date_range'
interval: 'Daily'
version: 1
editable: false
- name: 'dmarc-fo'
type: 'elasticsearch'
access: 'proxy'
orgId: 1
url: 'http://elasticsearch:9200'
database: '[dmarc_forensic-]YYYY-MM-DD'
isDefault: false
jsonData:
esVersion: 8.12.0
timeField: 'arrival_date'
interval: 'Daily'
version: 1
editable: false
parsedmarc/Dockerfile
python のバージョンを最新化しています。
msgraph-core==0.2.2
しないと動かなかったのでそうしています。IMAP doesn't work any more #54
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
COPY parsedmarc.ini /
grafana/Dockerfile
grafana イメージを latest で指定しました。(やらなくてもいいけど)
FROM grafana/grafana:latest
ADD https://raw.githubusercontent.com/domainaware/parsedmarc/master/grafana/Grafana-DMARC_Reports.json /var/lib/grafana/dashboards/
RUN chmod 644 /etc/grafana/provisioning
COPY grafana-provisioning/ /etc/grafana/provisioning/
起動
up で起動しましょう。
$ docker-compose up -d
起動すると files
ディレクトリが作成されるはずです。ここに DMARC レポートを配置します。
可視化
ブラウザで http://localhost:3000
にアクセスします。
Grafana 画面が表示されたら、Home → Dashboards → DMARC Reports の順にクリックします。
見えました。私が持っているサンプルデータでは DKIM で何件か false になっています。
ベアメールさんのサイトがとても理解しやすかったのでこちらを参照にしながら、Grafana を確認します。
Overview
メール送信元ごとに SPF、DKIM の認証結果を可視化してくれます。
Grafana の Overview に注目します。
SFP、DKIM、SPF Auth Result、DKIM Auth Result、この4項目と DMARC 認証の関係は上のベアメールさんのサイトを参照してください。pass していないメールサーバーは対策を行います。
https://baremail.jp/blog/wp-content/uploads/2023/09/DMARC_alignment.png より引用
Published Policies (as reported)
Published Policies に注目します。
DKIM Policy は DKIM のアライメントモード、SPF Policy は SPF のアライメントモードです。
relaxed mode または strict mode があり、relaxed mode は DKIM または SPF で認証したドメインと From ヘッダの組織ドメインが一致してればよく、strict mode はより厳密で完全一致(サブドメインまで)している必要があります。
どちらのモードを採用しているかは確認しておいたほうが良いと思います。
Policy は DMARC ポリシーです。受信者に対し認証が失敗した際の動作を定義しています。
none は何もしないという意味です。quarantine は不審メール、reject は拒否です。none であればとりえあず送信はできている可能性があります。相手の迷惑メールボックスに入るかどうかは不明ですが。。
こちらのサイトがとても参考になりました。詳しくはこちらを参照ください。
SPF Alignment Details
SPF アライメントに合格するには、Envelope From
と Header From
が一致している必要があります。ここを見ると一致していないエンベロープが判明します。
DKIM Alignment Details
DKIM アライメントに合格するには、DKIM 署名のドメインと From ヘッダが一致している必要があります。ここで確認しておきましょう。
ファイル出力
output_files
ディレクトリに csv または json で出力されます。手元で加工したい場合はこちらを使います。
$ ls output_files/
aggregate.csv aggregate.json forensic.csv forensic.json samples
まとめ
何種類か DMARC レポート解析を試してみたいと考えています。今回は parsedmarc を試してみました。
現代においてもメールは主要な連絡手段だと思います。信頼性の高いメールを送信するために DMARC 対応は必須だと思います。
parsedmarc cli 版はこちらです。
Discussion