#author("2018-09-02T14:17:54+09:00","default:nowsky","nowsky")
作成中
#author("2018-09-17T01:17:28+09:00","default:nowsky","nowsky")
*OpenDMARC [#be94facd]
メールのSPF・DKIMを補強する送信ドメイン認証技術(DMARC)を取り扱うプログラム。
別途スクリプトを組み合わせる事で、ドメイン認証レポート送信する事も出来る。
DMARCは仕組み上、単体利用する事が出来ない点に注意する。

- 参考情報
[[OpenDMARC - ArchWiki:+https://wiki.archlinux.jp/index.php/OpenDMARC]]
[[OpenDMARC Document:+http://www.trusteddomain.org/opendmarc/]]
~
*構築環境 [#s1e1fcd5]
今回検証した環境はこちら
-Debian 9.5 x86_64
-CentOS 7.5 x86_64
-openSUSE 42.3 x86_64
~

他には下記の通りに構築。
-今回は、OpenDKIMを構築済みの環境にOpenDMARCを新規構築
-OpenDKIMは [127.0.0.1:&color(#ff0000){TCP/10027};] で待ち受ける
-OpenDMARCは [127.0.0.1:&color(#ff0000){TCP/20027};] で待ち受ける
-汎用性を持たせる為、LocalSocketは利用しない
~
*構築 [#j6a59623]
&size(16){&font(b){1. インストール};};
OpenDMARCはディストリビューション毎にパッケージ名の差異が無いので、
各パッケージ管理システムに応じてインストールする。
- Debian
 # apt-get install opendmarc

- CentOS
 # yum install opendmarc

- openSUSE
 # zypper install opendmarc

 
&size(16){&font(b){2. 設定};};
項目についてはOpenDMARCのドキュメントに詳細が書いてあるので割愛。
DMARC評価結果はAuthentication-Resultsヘッダに追記するので、必要に応じてauthserv-idを設定する。
 
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/opendmarc.conf};};
 [01] AuthservID           mx.test.org
 [02] AuthservIDWithJobID  false
 [03] AutoRestart          true
 [04] Background           true
 [05] Socket               inet:20027@127.0.0.1
 [06] Syslog               true
 [07] SyslogFacility       mail
 [08] UMask                007
 [09] UserID               opendmarc:opendmarc
 [10] IgnoreHosts          /etc/opendmarc/ignorehosts
 [11] IgnoreMailFrom       mail.test.org
 [12] BaseDirectory        /var/run/opendmarc
 [13] PidFile              /var/run/opendmarc/opendmarc.pid
 [14] HistoryFile          /var/run/opendmarc/opendmarc.dat
 [15] SPFIgnoreResults     false
 [16] SPFSelfValidate      true
 
 --------------------------------------------------
 
 [01] Authentication-Resultsヘッダに使用するauthserv-idの変更
 [02] trueにするとDMARCのヘッダにジョブIDを含める。false推奨
 [03] 評価失敗時にプロセスを自動再起動させる
 [04] daemonをバックグラウンドで実行
 [05] TCP/IP待受け設定。ポート番号とIPアドレスが逆なので注意する。
 [06] OpenDMARCのログをsyslogから出力
 [07] syslogのファシリティ設定
 [08] ソケットファイル生成時のUMASK値
 [09] OpenDMARCを実行するユーザ:グループ設定
 [10] DMARC評価を除外する接続元IPアドレス
 [11] DMARC評価を除外するドメイン名
 [12] デフォルトディレクトリの設定
 [13] OpenDMARCのPIDファイル
 [14] DMARC評価結果(プレーンテキスト)の保存先
 [15] メールヘッダにSPF結果が含まれている時、既存の評価結果を無視する
 [16] メールヘッダにSPF結果が見つからない場合、OpenDMARCでSPF評価を実行する
 
&size(14){&font(b){/etc/opendmarc/ignorehosts};};
 LocalRelayしていないMTAの場合、ローカルアドレスを設定
 ---
 127.0.0.1
 ::1
#endregion
 
&size(16){&font(b){3. MTA設定};};
OpenDMARCを呼び出す為、MTA(Postfix)にmilter設定を追加する。
milterを追加する時、DKIM認証の前にDMARCを追加すると&color(#ff0000){DKIM認証が崩れる。};
回避するにはDKIM認証を弱く(relaxed/relaxed)するか、&font(b){DKIM認証の後にDMARC評価を追加する。};
下記は、DKIM認証後にDMARC評価を行うmilter設定となる。
- &size(14){&font(b){/etc/postfix/main.cf};};
 smtpd_milters=inet:127.0.0.1:10027,inet:127.0.0.1:20027
 non_smtpd_milters=$smtpd_milters

 
&size(16){&font(b){4. 稼働テスト};};
実際にメールを受信してSPF/DKIM/DMARCのヘッダーが追加されるかテストする。
GmailはSPF/DKIM/DMARC全てに対応しているので、Gmailからメールを送信する事でテストを行う。
設定が正常に出来ていると下記の様なヘッダが追加される。
 Authentication-Results: mx.***-*****.com; dmarc=pass (p=none dis=none) header.from=gmail.com
 Authentication-Results: mx.***-*****.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=********;
 Authentication-Results: mx.***-*****.com; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=209.85.***.***.; helo=***.google.com; envelope-from=*****@gmail.com; receiver*****@***.***.***)
~
----
~
*DMARCレポート [#i4bdab34]
DMARCは受信メール情報を蓄積しておき、正規のメール送信元ドメインに評価レポートを送る仕組みがある。
OpenDMARCもテキストデータでDMARC評価結果が蓄積されているので、
専用のコマンドを用いて加工すればレポート送信が可能となる。

- ドキュメント
[[opendmarc-import:+http://www.trusteddomain.org/opendmarc/opendmarc-import.8.html]]
[[opendmarc-reports:+http://www.trusteddomain.org/opendmarc/opendmarc-reports.8.html]]
[[opendmarc-expire:+http://www.trusteddomain.org/opendmarc/opendmarc-expire.8.html]]
~
*モジュールインストール [#uf666fb8]
DMARCレポートを生成・送信するには&color(#ff0000){MySQLとperlが必要};となる。
MySQLは[[コチラ:+https://www.ns-lab.org/wiki/?Linux/Source/MySQL]]で構築手順を公開しているのでこの場では割愛する。
perlについてはCPANでモジュールを下記の様にインストールする。
 
下記はopenSUSE環境で構築した場合の参考コマンドとなる。
ただし、単にモジュールインストールを流し込んだだけなので、
実際には構築環境に合わせて必要な物をインストールする。
 
-&size(14){&font(b){CPANインストール};};
 cpan[X]> install Domain::PublicSuffix
 cpan[X]> install Switch
 cpan[X]> install DBI
 cpan[X]> install File::Basename
 cpan[X]> install File::Temp
 cpan[X]> install Net::Domain
 cpan[X]> install Getopt::Long
 cpan[X]> install IO::Handle
 cpan[X]> install IO::Compress::Zip
 cpan[X]> install POSIX
 cpan[X]> install MIME::Base64
 cpan[X]> install Net::SMTP
 cpan[X]> install Time::Local
 cpan[X]> install Net::DNS
 cpan[X]> install Domain::PublicSuffix
 cpan[X]> install DBD::mysql
 cpan[X]> install HTTP::Request
 
-&size(14){&font(b){zypperインストール};};
 zypper install perl-Switch perl-DBI perl-File-Basename-Object perl-File-Temp perl-Net-Domain-TLD
 zypper install perl-Getopt-Long-Descriptive perl-IO-Handle-Util perl-Mail-Sender perl-Net-SMTP-SSL
~
*データベース作成 [#z827243e]
DMARC評価データをDBに蓄積する為、MySQLに新規DBを作成してスキーマを流し込む。
DB名をopendmarc以外にしている場合、スキーマに埋め込んであるdatabase名と不整合が発生し、
スキーマインポートが出来ない場合がある。
database名の不整合が発生したら、スキーマ内のdatabase名を変更して対応する。
 > 下記条件でDBを構築した場合のコマンド例
 > IP      : 127.0.0.1
 > Database: opendmarc
 > User    : db_user
 > Password: db_pass
 ---
 mysql -u db_user -p opendmarc < /usr/share/doc/packages/opendmarc/schema.mysql
~
*レポート送信 [#edb03bff]
DMARCレポートを送信するには、下記3コマンドを実行する必要がある。
OpenDMARCでは、これらを実行するコマンドが用意されているので活用する。
 
+OpenDMARCの生成したデータをDB化
+DBからレポート送信対象のデータ読込み
+期限切れデータをDBから削除

 
上記の操作を自動化する為に、GitHubで[[サードパーティのスクリプト:+https://gist.github.com/stevejenkins/1b61d15cc5aaf3e6819f#file-opendmarc-send-reports-sh]]が用意されている。
今回は利用しないが、自動化を楽に実装する場合は活用する。
 
#region(&color(#ff0000){トピック};)
-&size(14){&font(b){複数MXサーバ構成};};
MXサーバが複数台存在する場合、1台のDBに各々のサーバから評価データを流し込むか、
管理サーバなどを用意してDMARC評価データを1つ纏めた上でDBに流し込む。
 
-&size(14){&font(b){レポート生成テスト};};
レポート生成テストを行う場合、&color(#ff0000){opendmarc-reportsコマンドに "--test" を追加して実行する。};
送信したレポートメール自体を確認する場合は、MTAにBccヘッダを強制追加する設定を行う。
Postfixならば、レポート送信メールアドレス(report-email)と &color(#ff0000){"sender_bcc_maps"}; を組み合わせる事で実現出来る。
#endregion
 
----
 
-OpenDMARCのレポートデータをDB化
 /usr/sbin/opendmarc-import  --dbhost=127.0.0.1 --dbuser=db_user --dbpasswd=db_pass --dbname=opendmarc --verbose < /var/run/opendmarc/opendmarc.dat

-レポート生成とレポート送信
 /usr/sbin/opendmarc-reports --dbhost=127.0.0.1 --dbuser=db_user --dbpasswd=db_pass --dbname=opendmarc --verbose --interval=86400 --report-email report@mail.hogehoge.com --report-org mail.hogehoge.com

-期限切れレポートの削除
 /usr/sbin/opendmarc-expire  --dbhost=127.0.0.1 --dbuser=db_user --dbpasswd=db_pass --dbname=opendmarc --verbose
~
*レポート表示 [#x52c438a]
DBにインポートしたDMARC評価データは表示専用の[[Webアプリ:+https://github.com/techsneeze/opendmarc-dashboard]]があるので活用する。
アプリのインストール方法は、配布先のGitHubで公開しているのでそちらを参照。
参考画像として、opendmarc-dashboardを筆者の実環境で実行したキャプチャを掲載しておく。

 
#ref(Linux/Mail/OpenDMARC/wiki_opendmarc_01.png,35%,left,nowrap)