DMARCvisualizerでDMARCレポートを可視化してみた

# 注意事項
2025/01/19 各コンテナのバージョンを更新。Githubリポジトリに反映。
2022/09/20 ローカルファイルの解析方法を追記
~~2022/09/06 Elasticsearchのバージョン7.10以前が制限された事に伴って対応する変更しました。~~

# 背景

当方が開催した2022年のサイバーセキュリティ月間関連イベントでフィッシングについて講演しましたのでスライド資料も参考にして下さい。

- [【第7回】サイバーセキュリティ勉強会2022 in 塩尻 - connpass ](https://connpass.com/event/228411/)

迷惑メールやなりすましフィッシングメールなど送信メールのセキュリティ対策には、「SPF」「DKIM」「DMARC」の3点が利用されます。
このうち「DMARC」にはレポート機能があり、対応したメールプロバイダーから対象ドメインの送信メール状況について、DNSのTXTテーブルに設定したメールアドレス宛にレポートが届きます。
しかしこのレポートが人間には分かり難いxml形式のファイルをgzipまたはzip圧縮ファイルで送信されてきます。
DMARCレポートを解析してグラフ表示して可視化するサービスが国内外に複数あります。
業務で利用される方はサポートがあるこれらの有料サービスを利用する事を推奨します。

しかし個人などで費用が掛からない範囲でせっかく送信されたDMARCレポートを解析して可視化するオープンソースのソフトを利用して役立ててみます。
今回はDockerコンテナ環境で「DMARCvisualizer」を構築していますのでメモ書きしてみました。

# DMARCvisualizer

- [GitHub - debricked/dmarc-visualizer: Analyse and visualize DMARC results using open-source tools](https://github.com/debricked/dmarc-visualizer)

DMARCレポートを解析するための「parsedmarc」
集約されたデータを保存する「Elasticsearch」
集約されたレポートを視覚化する「Grafana」で構成されています。

DMARCレポートのxml形式のgzipまたはzip圧縮ファイルを「parsedmarc」に取り込む方法として、

- ファイルを直接読み込ませる方法
　過去のDMARCレポートファイルを直接読み込んで解析する場合はfilesディレクトリにコピーするだけなので割と簡単です。gzipまたはzip圧縮ファイルのままで解析出来ます。
※2022/09/20 ローカルファイルの解析方法を追記

- メールアドレスを設定する方法
　DMARCレポートを受信するメールアドレスを設定して自動的に解析する方法です。IMAPメールサーバーを利用します。今回はこちらです。

- APIを利用する方法
　「Microsoft Graph」または「Gmail API」も利用可能

# DNSサーバーのDMARCレポート設定

対象ドメインのDNS管理サーバーのTXTテーブルにDMARCレポートの送信先メールアドレスを設定します。

```
v=DMARC1; p=reject; rua=mailto:postmaster@example.com, mailto:dmarc@mail.example.com;
```

「rua」オプションでDMARCレポートを送信するメールアドレスが設定出来ます。カンマ区切りで複数指定できますが「mailto:」をその都度付けましょう。また管理ドメイン以外の一般的なメールプロバイダのメールアドレスでも構いません。

# IMAPメールサーバー

DMARCレポートを受信するメールアドレスのIMAPサーバーの受信設定を予め確認しておきます。
「parsedmarc」ではSSL/TLS暗号化認証でポート番号993がデフォルト設定です。

# 動作環境

## ホスト側

- OS:Ubuntu Server 24.04.02 LTS
- Docker version 27.5.0

## コンテナ側

- parsedmarc:8.18.1
- elasticsearch:8.16.5
- grafana:v11.5.2

# Docker環境の準備

以下のページにて紹介していますので参考にしてみて下さい。

- [Linuxサーバー環境のDockerインストールメモ - Qiita ](https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e)

# DMARCvisualizerの構築

動作環境として想定するのはLinuxサーバーでDMARCレポートが受信出来る環境です。
外部からは接続出来ないローカル環境を推奨します。

## Githubからリポジトリ取得

必要となる基本のファイルをGithubから入手します。
オリジナルリポジトリが数年前から更新されていないので当方でフォークして修正したリポジトリを用意しました。

- [ohhara-shiojiri/dmarc-visualizer](https://github.com/ohhara-shiojiri/dmarc-visualizer)


```
$ git clone https://github.com/ohhara-shiojiri/dmarc-visualizer.git
$ cd dmarc-visualizer
```

## parsedmarc設定ファイルの用意

サンプルファイルからコピーします。

```
$ cp parsedmarc/parsedmarc.sample.ini parsedmarc/parsedmarc.ini
```

## Docker Imageのビルド

```
$ docker compose build
```

しばらくしてDocker Imageのビルドが完了すると以下のように作成されます。


```
$ docker images
REPOSITORY                                      TAG                 IMAGE ID       CREATED             SIZE
dmarc-visualizer-parsedmarc                     latest              60315763f67a   About an hour ago   526MB
dmarc-visualizer-grafana                        latest              3a708924eba7   About an hour ago   299MB
```

## ローカルファイルの解析方法

filesディレクトリにgzipまたはzip圧縮ファイルのままでDMARCレポートファイルをコピーしておくと解析してレポートします。
コピーした設定ファイルを修正します。

```diff_xml:dmarc-visualizer/parsedmarc.ini
[general]
+save_aggregate = False
+save_forensic = False
-save_aggregate = True
-save_forensic = True
-output = /output/
```

解析が完了するとparsedmarcコンテナは終了するのでfilesディレクトリに解析するDMARCレポートのファイルをコピーする毎にparsedmarcコンテナを再起動する手順になります。

```
$ sudo cp dmarc-report.zip files
$ docker compose start parsedmarc
```

## IMAPメールサーバーの解析方法

IMAPメールサーバーでDMARCレポートのメールを受信して解析します。
コピーした設定ファイルに追加修正します。
DMARCレポートを受信するメールアドレスとIMAPメールサーバーの情報を設定。

```diff_xml:dmarc-visualizer/parsedmarc.ini
[general]
save_aggregate = True
save_forensic = True
output = /output/

+[imap]
+host = mail.example.com
+user = dmarc@mail.example.com
+password = password
+watch = True

[elasticsearch]
hosts = elasticsearch:9200
ssl = False
```

※なお設定変更時は再ビルドしてコンテナイメージを再作成する必要があります。

## DMARCvisualizerコンテナを起動

```
$ docker compose up -d
$ docker compose ps
NAME                               IMAGE                                                  COMMAND                  SERVICE         CREATED              STATUS              PORTS
dmarc-visualizer-elasticsearch-1   docker.elastic.co/elasticsearch/elasticsearch:8.16.4   "/bin/tini -- /usr/l…"   elasticsearch   16 hours ago         Up 16 hours         9200/tcp, 9300/tcp
dmarc-visualizer-grafana-1         dmarc-visualizer-grafana                               "/run.sh"                grafana         About a minute ago   Up About a minute   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
dmarc-visualizer-parsedmarc-1      dmarc-visualizer-parsedmarc                            "parsedmarc -c /pars…"   parsedmarc      About a minute ago   Up About a minute
```

## DMARCレポートの解析

「parsedmarc」コンテナを起動する事で設定したメールアドレスのIMAPサーバーからDMARCレポートのメールを取得解析してelasticsearchにデータを格納してgrafanaでグラフ表示します。
Webブラウザでgrafanaコンテナのポート番号3000番を開いてみましょう。

「 http:// localhost:3000 」

- ![dmarc-visualizer DMARC Reports](https://github.com/debricked/dmarc-visualizer/blob/master/big_screenshot.png?raw=true)