注意事項
2022/09/20 ローカルファイルの解析方法を追記
2022/09/06 Elasticsearchのバージョン7.10以前が制限された事に伴って対応する変更しました。
背景
当方が開催した2022年のサイバーセキュリティ月間関連イベントでフィッシングについて講演しましたのでスライド資料も参考にして下さい。
迷惑メールやなりすましフィッシングメールなど送信メールのセキュリティ対策には、「SPF」「DKIM」「DMARC」の3点が利用されます。
このうち「DMARC」にはレポート機能があり、対応したメールプロバイダーから対象ドメインの送信メール状況について、DNSのTXTテーブルに設定したメールアドレス宛にレポートが届きます。
しかしこのレポートが人間には分かり難いxml形式のファイルをgzipまたはzip圧縮ファイルで送信されてきます。
DMARCレポートを解析してグラフ表示して可視化するサービスが国内外に複数あります。
業務で利用される方はサポートがあるこれらの有料サービスを利用する事を推奨します。
しかし個人などで費用が掛からない範囲でせっかく送信されたDMARCレポートを解析して可視化するオープンソースのソフトを利用して役立ててみます。
今回はDockerコンテナ環境で「DMARCvisualizer」を構築していますのでメモ書きしてみました。
DMARCvisualizer
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 20.04LTS
- Docker CE version 20.10.17
- docker compose version v2.8.0
コンテナ側
- parsedmarc:7.1.1
- elasticsearch:7.17.5
- grafana:v8.5.2
Docker環境の準備
以下のページにて紹介していますので参考にしてみて下さい。
DMARCvisualizerの構築
Githubからリポジトリ取得
必要となる基本のファイルをGithubから入手します。
この記事の投稿当初のオリジナルリポジトリではElasticsearchのバージョン7.10以前が制限された事に伴って利用が出来なくなってしまいました。
修正して対応したフォークされたリポジトリがありましたので、これをさらに当方でフォークして修正したリポジトリを用意しました。
$ 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レポートファイルをコピーしておくと解析してレポートします。
コピーした設定ファイルを修正します。
[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メールサーバーの情報を設定。
[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 COMMAND SERVICE STATUS PORTS
dmarc-visualizer-elasticsearch-1 "/tini -- /usr/local…" elasticsearch running 9300/tcp
dmarc-visualizer-grafana-1 "/run.sh" grafana running 0.0.0.0:3000->3000/tcp
dmarc-visualizer-parsedmarc-1 "parsedmarc -c /pars…" parsedmarc running
DMARCレポートの解析
「parsedmarc」コンテナを起動する事で設定したメールアドレスのIMAPサーバーからDMARCレポートのメールを取得解析してelasticsearchにデータを格納してgrafanaでグラフ表示します。
Webブラウザでgrafanaコンテナのポート番号3000番を開いてみましょう。
「 http:// localhost:3000 」