DMARCレポートツール「parsedmarc」をインストール

前に試したオープンソースのツールはうまくインストールできなかったので、他にいいツールはないものかと検索し、parsedmarcをインストールしたときの覚書。

環境: CentOS Stream 9, Python 3.9.17


1.parsedmarcとは?

オープンソースのDMARC解析ツール。
IMAPやAPI経由でDMARCレポートのメールを解析して、他のシステムが使いやすい形式で出力する。

Python製。

オープンソースの全文検索エンジン「Elasticsearch 」とダッシュボード可視化ツール「Kibana」と組み合わせることで、グラフ形式で分かりやすく可視化することが可能。

公式サイト


ここで
「GoogleのLooker StudioでDMARCレポートを表示できる方法があるのでは?」
と思って調べたけど、今はないみたい。


2.parsedmarcをインストール

公式サイトに従ってPythonの環境を整える。
# dnf install python39 python3-virtualenv python3-setuptools python3-devel libxml2-devel libxslt-devel

parsedmarcユーザーを追加する。
# useradd parsedmarc -r -s /bin/false -m -b /opt

parsedmarcユーザー権限でPython仮想環境を作る
# sudo -u parsedmarc virtualenv /opt/parsedmarc/venv

Python仮想環境に入る。
# source /opt/parsedmarc/venv/bin/activate

parsedmarcユーザー権限でparsedmarcをインストール。
(venv)# sudo -u parsedmarc /opt/parsedmarc/venv/bin/pip install -U parsedmarc

(venv)# parsedmarc --version
parsedmarc-8.6.1がインストールされた。


3.parsedmarcの設定ファイル生成して動作テスト

公式サイトのサンプルを見ながら設定ファイルを作る。
参考: Using parsedmarc — parsedmarc 8.6.1 documentation

(venv)# cd /opt/parsedmarc/
(venv)# vi parsedmarc.ini

[general]
save_aggregate = True
save_forensic = True

[imap]
host = imap.mail.jp
user = dmarc@mail.jp
password = password

[mailbox]
watch = True
delete = False

#[elasticsearch]
#hosts = 127.0.0.1:9200
#ssl = False

実行してみる。
(venv)# parsedmarc -c /opt/parsedmarc/parsedmarc.ini --debug

監視状態になるので、dmarcレポートが付いたメールをこのメールアドレス(上の例ではdmarc@mail.jp)へ転送してみる。

「Quit with ctrl-c」と書いてあるけどctrl-cで止まらない。
ctrl-zで停止できる。
そのうち修正されていると思う。

Python仮想環境から出る。
(venv)# deactivate


4.Elasticsearchをインストール

parsedmarcで処理した後、可視化するにはElasticsearchとKibanaをインストールする必要がある。

まずは全文検索エンジン「Elasticsearch」をインストールする。
参考: Install Elasticsearch with RPM | Elasticsearch Guide [8.10] | Elastic

RPMリポジトリを登録してdnfインストール。
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/elastic.repo

[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

# dnf install --enablerepo=elasticsearch elasticsearch

8.10.2-1がインストールされた。

パスワードが表示されるのでメモしておく。
パスワードを保存してサービス起動。
# echo "aaa-bbb-ccc" > /opt/parsedmarc/elasticsearch_pwd.tmp
# chmod 644 /opt/parsedmarc/elasticsearch_pwd.tmp
# systemctl start elasticsearch

エラー。
ログを確認。権限のエラーだった。
# less /var/log/messages

サービスがelasticsearch_pwd.tmpを見れるようにする。
# chmod 755 /opt/parsedmarc/

サービス起動して確認
# systemctl start elasticsearch
# systemctl status elasticsearch

設定ファイルも確認
# less /etc/elasticsearch/elasticsearch.yml

動作確認。
SSLとパスワードを付けないとアクセスできないようになっている。
# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:aaa-bbb-ccc https://localhost:9200

{
  "name" : "vm-dev1.hoge.co.jp",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "78pYQychSJWnjsjTYh10pg",
  "version" : {
    "number" : "8.10.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
    "build_date" : "2023-09-19T08:16:24.564900370Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}



5.Kibanaをインストール

次にダッシュボード可視化ツール「Kibana」をインストールする。
参考: Install Kibana with RPM | Kibana Guide [8.10] | Elastic

リポジトリを追加してインストール。
# less /etc/yum.repos.d/elastic.repo

[kibana-8.x]
name=Kibana repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# dnf install kibana

8.10.2-1がインストールされた。
何か大事そうなメッセージが表示された。

Kibana is currently running with legacy OpenSSL providers enabled! For details and instructions on how to disable see https://www.elastic.co/guide/en/kibana/8.10/production.html#openssl-legacy-provider
Created Kibana keystore in /etc/kibana/kibana.keystore

/usr/lib/tmpfiles.d/elasticsearch.conf:1: Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.

サービスとして起動して確認。
# systemctl start kibana
# systemctl status kibana

設定ファイルも確認。
# less /etc/kibana/kibana.yml

ログ確認
# journalctl --unit kibana

httpでアクセスしてみる。
# curl http://localhost:5601/?code=898358

他の端末からアクセスするためにファイヤーウォールを停止
# systemctl stop firewalld

windowsからブラウザでアクセスしてみる。
…表示されない。
windowsのtelnetでアクセスしてみる。
PS> telnet vm-dev1 5601

接続できない。

他の端末から接続できるように設定ファイルを編集
参考: Configure Kibana | Kibana Guide [8.10] | Elastic
# less /etc/kibana/kibana.yml

#server.host: "localhost"
server.host: "0.0.0.0"

再起動して接続確認。
# systemctl restart kibana

ブラウザでアクセスすると「Enrollment token」を貼り付けろと出る。

よくわからないけど、生成してみる。
# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

Verification requiredとなるので、kibana-verification-codeを実行してみる。
# /usr/share/kibana/bin/kibana-verification-code

コンソールに表示されたコードを入力するとConfigure Elastic to get startedになる。
Completing setupで進まない…。

ログ確認
# journalctl --unit kibana

Sep 28 14:06:57 vm-dev1.jp kibana[2509]: [2023-09-28T14:06:57.848+09:00][INFO ][plugins.securitySolution.endpoint:metadata-check-transforms-task:0.0.1] no endpoint installation found

分からない。
ローカルネットワークの仮想マシン上でやっているからかな?
Enrollment tokenを聞かれたのは「?code=898358」でアクセスしたからだと思う。

後で調査する。


6.parsedmarcとelasticsearchとkibanaを連携させる。

parsedmarcの設定ファイルにelasticsearchを追記。
# less /opt/parsedmarc/parsedmarc.ini

[elasticsearch]
hosts = https://elastic:aaa-bbb-ccc@127.0.0.1:9200
ssl = True
cert_path = /etc/elasticsearch/certs/http_ca.crt

parsedmarcをサービス化する。
参考: Using parsedmarc — parsedmarc 8.6.1 documentation

権限でエラーになったのでGroupはelasticsearchにした。
# vi /etc/systemd/system/parsedmarc.service

[Unit]
Description=parsedmarc mailbox watcher
Documentation=https://domainaware.github.io/parsedmarc/
Wants=network-online.target
After=network.target network-online.target elasticsearch.service

[Service]
Environment="PATH=/opt/parsedmarc/venv/bin/"
ExecStart=/opt/parsedmarc/venv/bin/parsedmarc -c /opt/parsedmarc/parsedmarc.ini
User=parsedmarc
Group=elasticsearch
Restart=always
RestartSec=5m

[Install]
WantedBy=multi-user.target

サービス起動、確認。
# chmod +x /etc/systemd/system/parsedmarc.service
# systemctl start parsedmarc
# systemctl status parsedmarc

エラーになったらログを確認して再起動。
# journalctl -f --unit parsedmarc
# systemctl daemon-reload
# systemctl restart parsedmarc

試しにdmarcレポートが付いたメールを転送してみる。
ログを監視しながら。
# journalctl -f

処理されているっぽいけどブラウザでkibanaにアクセスしても反映されているか分からない。

時間切れ。
また調査予定。



【関連記事】