いまさらだけど遅すぎというほどでもないDMARC レポート編1

前回はDMARCの設定の内メールの送受信に関わる部分しか触っていないので、今回はレポート周り。
これをやらないとDMARCを導入する意味がないとまでは言わないけど大切。

データベースの準備

まず、データを溜めるためのデータベースの準備。今回はMySQLを使うことにする。

# mysql -u root -pパスワード mysql  ←MySQLの管理者rootとそのパスワード
mysql> CREATE DATABASE opendmarc;
mysql> GRANT ALL PRIVILEGES ON opendmarc.* TO 'dmarc'@'localhost' IDENTIFIED BY 'opendmarc_db_password';
mysql> FLUSH PRIVILEGES;   ←GRANTでアカウント作るなら要らないんだっけ?行っても害はないのでやっておく
mysql> quit

opendmarcというDBとその全権限ユーザーdmarc、パスワードopendmarc_db_passwordを指定。localhostだけアクセス可。
DB名は下のファイルで指定されているのでopendmarcにしている。気に入らないなら下のファイルも要変更。

opendmarcにMySQL用のデータベース定義用(スキーマ)ファイルが付属しているのでそれを利用する。
FreeBSDの ports/pkg でopendmarcをインストールしたなら /usr/local/share/doc/opendmarc/schema.mysql がそれ。
ファイルの中で指定されているDB名がopendmarcになっている。

# mysql -u dmarc -popendmarc_db_password opendmarc < /usr/local/share/doc/opendmarc/schema.mysql
/usr/local/etc/mail/opendmarc.conf (変更)
1
2
3
HistoryFile /var/run/opendmarc.dat             #← 行頭の#を削除
HistoryFile /var/run/opendmarc/opendmarc.dat   #← もしくは場所としてはこっちのがいいかも
ReportCommand /usr/local/sbin/sendmail -t

レポート作成用のスクリプトとして GitHubGistからstevejenkins/opendmarc-send-reports.sh を貰って必要に応じて編集する。

/usr/local/etc/mail/opendmarc-send-reports.sh (FreeBSD用に変更)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/sh    #←オリジナルはbash
# Imports data from OpenDMARC's opendmarc.dat file into a local MySQL DB
# and sends DMARC failure reports to domain owners.
# Based on a script from Hamzah Khan (http://blog.hamzahkhan.com/)

set -e

# Database and History File Info
DBHOST='localhost'
DBUSER='dmarc'
DBPASS='opendmarc_db_password'
DBNAME='opendmarc'
HISTDIR='/var/run/opendmarc'
HISTFILE='opendmarc'  #←拡張子は書かない

# Make sure history file exists
touch ${HISTDIR}/${HISTFILE}.dat

# Move history file temp dir for processing
mv ${HISTDIR}/${HISTFILE}.dat /tmp/${HISTFILE}.$$

# Import temp history file data and send reports
/usr/local/sbin/opendmarc-import -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose < /tmp/${HISTFILE}.$$
/usr/local/sbin/opendmarc-reports -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose -interval=86400 -report-email 'postmaster@example.com' -report-org 'EXAMPLE.COM'
/usr/local/sbin/opendmarc-expire -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose

# Delete temp history file
rm -rf /tmp/*.$$
# chmod +x /usr/local/etc/mail/opendmarc-send-reports.sh
# touch /var/run/opendmarc/opendmarc.data
# chown postfix:vmail /var/run/opendmarc/opendmarc.data  #←/etc/rc.confに書いたopendmarc_runasに合わせる
# chmod 600 /var/run/opendmarc/opendmarc.data

opendmarc-send-reports.sh は実行可能にパーミッション変更。
/var/run/opendmarc/opendmarc.data は作成しておかないと(作成できないと) opendmarc が利用不可になるので注意。

# /usr/local/etc/rc.d/opendmarc restart

opendmarcを再起動。
DMARC対応ドメインからメール着信後に /var/run/opendmarc/opendmarc.dat のサイズが0でなくなることを確認。テキストファイルなので表示してみるのもあり。

# /usr/local/etc/mail/opendmarc-send-reports.sh

実行してエラーにならないことを確認。
opendmarc-import, opendmarc-reports, opendmarc-expire がそれぞれ複数行表示されること。
opendmarc-reports: sent report for hoge@example.com (2.0.0 Ok: queued as ABCDEF01234) のような行が1行以上あることを確認。

問題ないようであれば毎日自動実行されるようにする。

/etc/crontab
16  0  *  *  *  root  /usr/local/etc/mail/opendmarc-send-reports.sh > /dev/null 2>&1

例: 毎日夜中0:16に実行をcrontabに設定。

受信一覧レポートをウェブで確認

GitHubの techsneeze/opendmarc-dashboard に OpenDMARC Dashboard という極めて簡単でシンプルなPHPスクリプトがあるので貰ってくる。統計を作る機能など複雑なのは一切無し。単純に受信したメールのリストと送信ドメイン認証の結果とDMARCのポリシーが表示される。
opendmarc-dashboard-config.php.sample と opendmarc-dashboard.php をPHPが利用可能なウェブサイトのドキュメントルート下のどこかに置く。(今回はウェブサーバがopendmarcの動くメールサーバと同一とする)
opendmarc-dashboard-config.php.sample を opendmarc-dashboard-config.php にリネームするか opendmarc-dashboard-config.php にコピーする。 opendmarc-dashboard-config.php を編集。

/usr/local/www/hoge/hage/opendmarc-dashboard-config.php
1
2
3
4
$dbhost="localhost";
$dbname="opendmarc";
$dbuser="dmarc";
$dbpass="opendmarc_db_password";

上の方で指定したDMARC用のDBの情報に合わせる。

ブラウザで https://example.com/hoge/hage/opendmarc-dashboard.php を開く。初期値では最大で90行まで表示される。
たとえば256行表示させたい場合は https://example.com/hoge/hage/opendmarc-dashboard.php?limit=256 などとする。
ここに表示されるのは先の opendmarc-send-reports.sh の中の opendmarc-import によりデータベースにに登録された分だけ。なので情報はリアルタイムに更新(追加)されるわけではないので勘違い無く。

OpenDMARC Dashboard

ところで他所様のドメインのメールサーバー宛に送信するレポートメールの確認はどうしましょう?は以下のようなの。

facebookmail.comからUndelivered Mail Returned to Senderになってレポートメールが返送されてきたので正常に送信されていることが判った。っていうか、指定されてるメールアドレスにレポート送ってるのに叩き返すってどういうことよ。
他所に送信しているレポートのコピーが欲しければopendmarc.confのFailureReportsBccに希望のメールアドレスを指定したら届くのかな。

Subject: 
Report Domain: facebookmail.com Submitter: EXAMPLE.COM Report-ID: facebookmail.com-1509202920@EXAMPLE.COM
From: 
postmaster@example.com
Date: 
2017年10月29日 00:02
To: 
postmaster@facebook.com

This is a DMARC aggregate report for facebookmail.com
generated at Sun Oct 29 00:02:01 2017

添付ファイル: EXAMPLE.COM!facebookmail.com!1509116520!1509202920.zip
添付ファイルの中身はここには出さないけどXML形式のレポートファイル

DMARCを導入して運用すると(DNSの設定のDMARCの宣言でruaまたはrufを指定している場合)上のようなレポートメールが他所のDMARC運用ドメインから届いくようになる筈。次はその他所から届いたレポートメール(レポートファイル)を解析するのをやるつもり。

関連記事: