🙌

DMARCレポートを解析・可視化する parsedmarc を試してみた

2024/01/30に公開

こんにちは。
ご機嫌いかがでしょうか。
"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 を足しています。

docker-compose.yml
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 と合わせています。

grafana/grafana-provisioning/datasources/all.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

parsedmarc/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

COPY parsedmarc.ini /

grafana/Dockerfile

grafana イメージを latest で指定しました。(やらなくてもいいけど)

grafana/Dockerfile
FROM grafana/grafana:latest

ADD --chown=grafana:root 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 になっています。

Alt text

ベアメールさんのサイトがとても理解しやすかったのでこちらを参照にしながら、Grafana を確認します。

Overview

メール送信元ごとに SPF、DKIM の認証結果を可視化してくれます。

Grafana の Overview に注目します。
Alt text

SFP、DKIM、SPF Auth Result、DKIM Auth Result、この4項目と DMARC 認証の関係は上のベアメールさんのサイトを参照してください。pass していないメールサーバーは対策を行います。

img
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 であればとりえあず送信はできている可能性があります。相手の迷惑メールボックスに入るかどうかは不明ですが。。

Alt text

こちらのサイトがとても参考になりました。詳しくはこちらを参照ください。

SPF Alignment Details

SPF アライメントに合格するには、Envelope FromHeader From が一致している必要があります。ここを見ると一致していないエンベロープが判明します。

Alt text

DKIM Alignment Details

DKIM アライメントに合格するには、DKIM 署名のドメインと From ヘッダが一致している必要があります。ここで確認しておきましょう。

Alt text

ファイル出力

output_files ディレクトリに csv または json で出力されます。手元で加工したい場合はこちらを使います。

$ ls output_files/
aggregate.csv  aggregate.json forensic.csv   forensic.json  samples

まとめ

何種類か DMARC レポート解析を試してみたいと考えています。今回は parsedmarc を試してみました。
現代においてもメールは主要な連絡手段だと思います。信頼性の高いメールを送信するために DMARC 対応は必須だと思います。

parsedmarc cli 版はこちらです。

Discussion