前回は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/crontab16 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 を編集。
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 によりデータベースにに登録された分だけ。なので情報はリアルタイムに更新(追加)されるわけではないので勘違い無く。

ところで他所様のドメインのメールサーバー宛に送信するレポートメールの確認はどうしましょう?は以下のようなの。
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運用ドメインから届いくようになる筈。次はその他所から届いたレポートメール(レポートファイル)を解析するのをやるつもり。