ホーム » 「DMARC」タグがついた投稿

タグアーカイブ: DMARC

サーバ⚙

アーカイブ

カテゴリー

DMARCレポートを出力

DMARCの設定をして、なりすましなどのレポートをメールで送る設定をしたけど、xmlファイルはzip圧縮でメール添付だし、xml ファイルも内容が読みづらい。

dmarc-catを使ってみる

“aptitude search dmarc”を実行すると、dmarc-cat というソフトが見つかり、”sudo aptitude install dmarc-cat” インストールして使ってみる。

dmarc-cat 0.9.2/j4 by Ollivier Robert

Reporting by: google.com — noreply-dmarc-support@google.com
From 2020-02-12 09:00:00 +0900 JST to 2020-02-13 08:59:59 +0900 JST

Domain: tsaitoh.net
Policy: p=quarantine; dkim=r; spf=r

Reports(1):
IP                      Count   From        RFrom       RDKIM   RSPF    
xxxxx-xx-x-x.xxx.ne.jp. 1       xxxxxxx.xxx xxxxxxx.xxx pass    pass    

これなら、なんとなく読みやすい。でも、どちらにしろ、添付ファイルのzip抽出、zip解凍、dmarc-cat の実行、んで、これらの内容を最終的にメールで読みたい。

メールを dmarc-cat で変換してレポート

ということで、その一連の処理を、procmail から実行させるための perl script をチロっと書いてみた。

#!/usr/bin/perl

# DMARC のレポートメールを dmarc-cat で文字情報にして送信しなおす
#
#       .procmailrc に以下を記載
#       | dmarc-report-mail.pl メールアドレス

my $mailto = $ARGV[0] ; # 送りなおすメールアドレス

# 添付ファイルを抽出するディレクトリ
my $tmpdir = "/tmp/dmarc-report-$USER-$$" ;

if ( mkdir( $tmpdir ) ) {
  # 標準入力のメールから添付ファイルを抽出
  system( "/usr/bin/munpack -q -C $tmpdir > /dev/null 2>&1" ) ;

  if ( opendir( my $dh , $tmpdir ) ) {

    # 保存された全ての添付ファイルの処理
    while( my $file = readdir( $dh ) ) {
      if ( -f "$tmpdir/$file" ) {

        # .zip ファイルだけ処理を行う
        if ( $file =~ /\.zip$/ ) {
          my $zipfile = "$tmpdir/$file" ;
          my $xmlfile = $zipfile ;
          $xmlfile =~ s/\.zip$/.xml/ ;
          $xmlfile =~ s/X/!/g ;

          # 圧縮解除 .zip => .xml
          system( "/usr/bin/unzip -q -d $tmpdir '$tmpdir/$file'" ) ;
          if ( -f $xmlfile ) {

            # .xml => dmarc-cat の出力をメールに送る
            if ( $mailto ne ""
                 && open( $mh , "| /usr/sbin/sendmail $mailto" ) ) {
              print $mh "Subject: DMARC report\n\n" ;
              if ( open( my $fh , "/usr/bin/dmarc-cat '$xmlfile' |" ) ) {
                while( <$fh> ) {
                  print $mh $_ ;
                }
                close( $fh ) ;
              }
              close( $mh ) ;
            }
            unlink( $xmlfile ) ;    # 解凍されたファイルを消す
          }
        }
        unlink( "$tmpdir/$file" ) ;     # 添付ファイルを消す
      }
    }
    closedir( $dh ) ;
  }
  rmdir( $tmpdir ) ;
}

この script を以下の様な procmailrc にかけて、report-a 宛のレポートを変換後 report-a-dmarc 宛に再転送させる。

:0
* ^To.*report-a@xxxxxxx\.xxx
| /...path.../dmarc-report-mail.pl report-a-dmarc@xxxxxxx.xxx

:0
* ^To.*report-f@xxxxxxx\.xxx
| /...path.../dmarc-report-mail.pl report-f-dmarc@xxxxxxx.xxx

DNSにDMARCを設定

SPF, DKIM の設定がうまく動いているようなので、DMARC も設定してみよう。

DMARC は、SPF, DKIM にてメールの送信者認証で問題が発生した際にそのメールをどう扱ってほしいかを受け取り側に伝えるための設定。なりすましを受けたら報告してもらえるという意味でも便利かも。

DMARCの設定

ひとまず、なりすましは無いと思うけど、DMARCの設定ミスでメールが消えても困るから、p=none を設定し、問題が起こっても特になにもしてもらわないことにする。メール受信時の成功などの統計用情報が送られてくるメールアドレスと、失敗(なりすまりが発生?やばい!?)のメールアドレスを設定

mydns.jp の自宅ドメインの設定で、以下のような情報を返すように設定を行う。

_dmarc.tsaitoh.net IN TXT “v=DMARC1;
     p=none;
     rua=mailto:report-a@tsaitoh.net;
     ruf=mailto:report-f@tsaitoh.net”

p=none(なにもしない)でなく、p=quarantine(隔離), p=reject(廃棄), に設定すると、レポートメールが送られるようになる。

DMARCの状態レポートの受信設定

上で設定した、統計用メール、失敗用メールの受取先を実際に配送できるように、/etc/aliases に登録。

$ sudo vi /etc/aliases # 以下を追加
report-a: root
report-f: root
$ sudo newaliases

試しに Google のメールアドレスにメールを送ったら、dmarc=pass が表示されるようになった。(現時点では、p=none なので report-a 宛などのメールは送られてこない)

Authentication-Results: mx.google.com;
       dkim=pass header.i=@tsaitoh...
       dkim=pass header.i=@tsaitoh...
       spf=pass (google.com: domain of ...
       dmarc=pass (p=NONE sp=NONE dis=NONE) ...

DMARCレポート

後日 p=quarantine にレベルを上げたら、以下の様なレポートが届く様になった。なりすまし被害なしってことで。

検索 🔎

  My Google     Yahoo

便利サイト