View on GitHub

Smtpauth-manager

SMTP, Milter, SMTP AUTH, SPAM, Submission

Download this project as a .zip file Download this project as a tar.gz file
English

smtpauth-manager

smtpauth-managerは、SMTP認証によるスパムメール送信(サブミッションスパム)を拒否するためのアプリケーションです。このアプリケーションはMilterで、SendmailやPostfixなどのMTAとともに使用します。設定ファイルにSMTP認証のIDを記載すると、MTAはそのIDからのメール送信を拒否するようになります。

また、スパム送信などによる大量メール送信を検知するために、メール送信のログをファイルへ出力する機能もあります。

smtpauth-managerの利用目的

サブミッションスパムの停止

SMTP認証を利用してスパムメールを送信しているアカウントがいた場合、SMTP認証のパスワードを変更するなどの方法でIDを利用不能にし、メールの送信を止めることができます。ところが、2013年ごろからSMTP認証のIDを利用不能にしても、スパムメールの送信を止めることが出来ない事例が発生するようになりました(MTAはpostfix)。このような事象では、SMTP認証のIDを停止し、postfixを再起動する、もしくはスパム送信に使用されているsmtpdプロセスをkillすることで、止めることができます。しかし、postfixの再起動は他のユーザのメール送信も中断してしまい、smtpdをkillする場合は間違って不要なsmtpdプロセスをkillしたり、逆にkillする必要のあるプロセスを残してしまう可能性があります。

postfixやsendmailでは、クライアントがMTAと接続しSMTP認証を行うと、そのTCP接続が切断するまでメールを送信することができます。SMTP認証は接続後のみに行うため、スパムメール送信を検知し、そのSMTP認証のIDを利用不可にしても、スパマーはメールを送信し続けることができます。なお、Postfix 2.11ではcheck_sasl_accessを利用することにより、メールを拒否することができます(PostfixでのSMTP認証IDによるメール送信制限(check_sasl_access)検証)

対して、smtpauth-managerはMilterであるため、SMTP認証後(Mail From:)でもメール送信を拒否することができます。smtpauth-managerは、MTAからSMTP認証のIDを取得し、設定ファイル内にそのIDの存在するかをチェックし、存在する場合はメールの送信を拒否するようにMTAへ応答します。smtpauth-managerは毎回設定ファイルを読むため、設定変更するごとにプロセスを再起動する必要はありません。 したがって、正規ユーザのメール送信を妨げることなく、スパマーのメールを停止することができます。

サブミッションスパムの検知

sendmailやpostfixは、メールを一通送信すると複数行のログを出力します。そのため、SMTP認証のIDごとのメールの送信状況を調査するには、postfixではログファイルを一度スキャンし、

  1. Queue ID->接続元IPアドレスの辞書(Hashなど)を作成する。
  2. Queue ID->送信者メールアドレスの辞書を作成する。
  3. Queue ID->宛先メールアドレスの辞書を作成する。
  4. Queue ID->SMTP認証IDの辞書を作成する。
  5. 上記の辞書を組み合わせ、SMTP認証IDごとのメールの通数や宛先数を求める。
といった処理が必要になります。
Jun  7 01:44:48 mta postfix/smtpd[9979]: F02861C3547: client=unknown[192.168.0.1], sasl_method=PLAIN, sasl_username=send
Jun  7 01:44:48 mta postfix/cleanup[9983]: F02861C3547: message-id=<>
Jun  7 01:44:48 mta postfix/qmgr[3015]: F02861C3547: from=<send@example.jp>, size=336, nrcpt=1 (queue active)
Jun  7 01:44:48 mta postfix/smtp[9984]: F02861C3547: to=<recv@example.jp>, relay=mta.example.ne.jp[172.16.0.1]:25, delay=0.94, delays=0.29/0.08/0.37/0.2, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as D087FE7755)
Jun  7 01:44:48 mta postfix/qmgr[3015]: F02861C3547: removed

MTAがsendmailの場合、デフォルトの設定ではQueue IDとSMTP認証IDを同時に出力しないため、 SMTP認証IDごとのメールの通数や宛先数を求めることは困難です。sendmail.mcへ以下の設定を追加することで、 Queue IDとSMTP認証IDを同時に出力することができるようになります。

sendmail.mc
LOCAL_CONFIG
Klog syslog -S" "
 
LOCAL_RULESETS
SLocal_check_mail
R $*    $@ $(log client_addressa=$&{client_addr},\ client_port=$&{client_port},\ auth=$&{auth_authen} $)
sendmailのmaillog
Jun 15 21:44:50 mta sendmail[31606]: AUTH=server, relay=[192.168.0.1], authid=send, mech=LOGIN, bits=0
Jun 15 21:44:51 mta sendmail[31606]: s5FCio2S031606: client_address=192.168.0.1, client_port=2524, auth=send
Jun 15 21:44:51 mta sendmail[31606]: s5FCio2S031606: from=<send@example.jp>, size=68, class=0, nrcpts=1, msgid=<201406151244.s5FCio2S031606@mta.example.jp>, proto=ESMTP, daemon=MSA, relay=[192.168.0.1]
Jun 15 21:44:52 mta sendmail[31608]: s5FCio2S031606: to=<recv@example.ne.jp>, delay=00:00:01, xdelay=00:00:00, mailer=esmtp, pri=120068, relay=mta.example.ne.jp. [172.16.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 145F0E7557)

このような処理は、大変なのでsmtpauth-managerでメールの送受信状況を出力するようにしました。ログファイルのフォーマットは、 以下のように一通のメールに対してログを一行出力するようになっています。


client_address:192.168.0.1<tab>connect_time:2014-06-07 21:44:50 JST<tab>auth_id:send<tab>sender:send@example.jp:<tab>eom_time:2014-06-07 21:44:50 JST<tab>recipient:recv@example.ne.jp<tab>country:JP
client_address:192.168.0.2<tab>connect_time:2014-06-07 21:44:55 JST<tab>auth_id:send<tab>sender:send@example.jp:<tab>eom_time:2014-06-07 21:44:56 JST<tab>recipient:recv2@example.ne.jp<tab>recipient:recv3@example.ne.jp<tab>country:JP
なお、このファイルフォーマットは、LTSVとほぼ同じですが、 一行の中に同じlabel(recipient)が複数個存在するため、LTSVライブラリでは、このログファイルを読み込むことができないと思います。

DOWNLOAD

REQUIREMENT

インストール

CentOS 6.6 x86_64でのインストール(RPM)

EPELのリポジトリを利用できるようにします。

# rpm -Uhv http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

以下の依存パッケージをインストールします。

# yum -y install \
    perl \
    perl-Moose \
    perl-MooseX-Getopt \
    perl-MooseX-Types \
    perl-MooseX-Types-Path-Class \
    perl-MooseX-Daemonize \
    perl-Readonly \
    perl-Exception-Class \
    rrdtool-perl \
    perl-Authen-SASL \
    perl-Email-Address \
    perl-Email-Simple \
    perl-Email-Date-Format \
    perl-Email-Send \
    perl-Time-Piece \
    perl-version \
    perl-JSON \
    perl-Net-INET6Glue \
    perl-Geo-IP \
    perl-CGI \
    httpd \
    perl-Sendmail-PMilter

smtpauth-managerをインストールします。

# rpm -Uhv https://github.com/sischkg/smtpauth-manager/downloads/perl-Milter-SMTPAuth-0.13.0-0.el6.x86_64.rpm

設定ファイルを作成します。

# cp /etc/sysconfig/smtpauth/filter.sample /etc/sysconfig/smtpauth/filter
# cp /etc/sysconfig/smtpauth/log-collector.sample /etc/sysconfig/smtpauth/log-collector
# cp /etc/smtpauth/weight.sample.json /etc/smtpauth/weight.json
# touch /etc/smtpauth/reject_ids.txt

CentOS 6.6でのインストール(SOURCE)

EPELのリポジトリを利用できるようにします。

# rpm -Uhv http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

以下のパッケージをインストールします。

# yum -y install \
    git \
    perl \
    perl-Moose \
    perl-MooseX-Getopt \
    perl-MooseX-Types \
    perl-MooseX-Types-Path-Class \
    perl-MooseX-Daemonize \
    perl-Readonly \
    perl-Exception-Class \
    rrdtool-perl \
    perl-Authen-SASL \
    perl-Email-Address \
    perl-Email-Simple \
    perl-Email-Send \
    perl-Time-Piece \
    perl-version \
    perl-JSON \
    perl-Net-INET6Glue \
    perl-Geo-IP \
    perl-CGI \
    httpd \
    perl-Test-MockObject \
    perl-Sendmail-PMilter

smtpauth-managerをインストールします。

# wget https://codeload.github.com/sischkg/smtpauth-manager/tar.gz/0.13.0
# tar xzf smtpauth-manager-0.13.0.tar.gz
# cd smtpauth-manager-0.13.0
# perl Makefile.PL
# make
# make install

smtpauth-manager用のuser,groupを追加します。

# groupadd smtpauth-manager
# useradd -g smtpauth-manager -d /noexistent -s /bin/false smtpauth-manager
# gpasswd -a postfix smtpauth-manager      # ( postfixを使用する場合 )

ログファイル用のディレクトリを作成します。

# mkdir -p /var/log/smtpauth /var/lib/smtpauth/rrd
# chown smtpauth-manager:smtpauth-manager /var/log/smtpauth /var/lib/smtpauth/rrd

サービス起動用のファイルをコピーします。

# cp smtpauth-manager/data/centos6/smtpauth-manager /etc/init.d
# chmod 744 /etc/init.d/smtpauth-manager
# chkconfig --add smtpauth-manager

設定ファイルを作成します。

# mkdir -p /etc/sysconfig/smtpauth
# cp data/centos6/filter /etc/sysconfig/smtpauth/filter
# cp data/centos6/log-collector /etc/sysconfig/smtpauth/log-collector
# mkdir -p /etc/smtpauth
# touch /etc/smtpauth/reject_ids.txt
# cp data/weight.sample.json /etc/smtpauth/weight.json
# chown -R smtpauth-manager:smtpauth-manager /etc/smtpauth

設定方法

smtpauth-managerの設定

拒否設定

設定ファイルを作成します。メール送信を拒否したいSMTP認証のIDを、1行に1IDずつ入力します。
# vi /etc/smtpauth/reject_ids.txt

spammer
virus
evil

検知

smtpauth-managerには、特定のSMTP認証のIDが大量のメールを送信した時に、SYSLOG(maillog)にアラートを出力する機能があります。アラートを出力する条件は、以下の2つの項目を指定します。 <period>秒間に<threshold>通のメールを送信したユーザがいた場合にアラートを出力するには、ファイル/etc/sysconfig/log-collectorに
THRESHOLD=20
PERIOD=60
と記述します。メールの大量送信を検知すると、
Oct  5 20:42:04 mx smtpauth-log-collector[5788]: too many message sent by spammer( 1048.00 recipients / 60.00 seconds ).
のようなログを出力します。

重み付け設定

重み付け設定ファイルを作成します。これにより流量計測の際に、特定のSMTP認証IDや接続元IPアドレスからのメール送信に対して、 倍率を設定することができます。例えば、 と行ったことができます。
# vi /etc/smtpauth/weight.json
{
  "network": [
      {
          "network": "192.168.0.0/16",
          "weight":  0
      },
      {
          "network": "10.0.0.0/8",
          "weight":  0
      },
      {
          "network": "1.0.0.0/8",
          "weight":  3
      }
  ],
  "auth_id": [
      {
          "auth_id": "root",
          "weight": 0
      },
      {
          "auth_id": "spam",
          "weight": 2
      }
  ],
  "country": [
    {
      "code": "JP",
      "weight": 1
    },
    {
      "code": "US",
      "weight": 2
    },
    {
      "code": "CN",
      "weight": 10
    }
  ],
  "country_count": {
    "ratio": 2
  }
}

自動拒否

大量メール送信を検知した場合に、自動的にそのSMTP認証IDからのメールを拒否することもできます。 その場合は、ファイル/etc/sysconfig/log-collectorへ
AUTO_REJECT=YES
を追加します。また、またディレクトリ/etc/smtpauthとファイル/etc/smtpauth/reject_ids.txtの owner/groupをsmtpauth-manager変更しておきます。
# chown smtpauth-manager /etc/smtpauth /etc/smtpauth/reject_ids.txt

メール通知

大量メール送信を検知した場合に、指定したアドレスにメールで通知することができます。 その場合は送信用のMTAを用意し、ファイル/etc/sysconfig/log-collectorへ
ALERT_EMAIL=YES
ALERT_MAILHOST=<MTAのホスト名>
ALERT_PORT=<MTAのポート番号>
ALERT_SENDER=<通知メールの送信者メールアドレス>
ALERT_RECIPIENTS=<通知メールの宛先メールアドレス>
を追加します。

MTA

Postfix

Postfixの設定ファイルにMilterを登録します。

# vi /etc/postfix/main.cf

smtpd_milters = unix:/var/run/smtpauth/filter.sock
milter_connect_macros = j {daemon_name} {client_addr} {client_port} v

Sendmail

sendmail.mcにMilterを登録します。その際CONNECT時のMACROとEOM時のMACROを修正します。

  1. CONNECTのMACROに{client_port}を追加することで、接続元のSource Portをログに出力することができます。
  2. EOMのMACROに{msg_size}を追加することで、メッセージサイズをログに出力することができます。
# cd /etc/mail
# vi sendmail.mc

INPUT_MAIL_FILTER(`smtpauth-manager',`S=unix:/var/run/smtpauth/filter.sock, F=T, T=R:1m')dnl
define(`confMILTER_MACROS_CONNECT',`j, _, {daemon_name}, {if_name}, {if_addr}, {client_port}, {client_addr}')dnl
define(`confMILTER_MACROS_EOM',`{msg_id}, {msg_size}')dnl

# make sendmail.cf

起動

smtpauth-manager

smtpauth-managerを起動します。
# service smtpauth-manager start
# chkconfig smtpauth-manager on

MTA

Postfix

# service postfix start
# chkconfig postfix on

Sendmail

# service sendmail restart
# chkconfig sendmail on

メールトラフィックの表示

RPMパッケージからインストールした場合

httpdを起動することで、メールトラフィックを表示することができます。
# yum -y install httpd
# service httpd start
# chkconfig httpd on
http://<server>/smtpauth/にて、グラフを参照することができます。

SOURCEからインストールした場合

上記のRRDファイルからメールトラフィックのグラフを表示することができます。 Apache httpdをインストールします。

# yum -y install httpd

SOURCEファイル内のdataディレクトリから、HTMLファイル及びCGIをコピーします。

# cd smtpauth-manager
# cp -r data/public /var/www/html/smtpauth

httpdの設定ファイルをコピーします。

# cp data/centos6/smtpauth-manager.conf /etc/httpd/conf.d/

httpdを起動します。

# service httpd start
# chkconfig httpd on

http://<server>/smtpauth/にて、グラフを参照することができます。

LOG FILE

クライアントがメールを1通送信するとログファイルに一行追記します。( default: /var/log/smtpauth/stats.log ), ログファイルのフォーマットは以下のとおりです。

 client_address:<client address 1><tab>client_port:<client_port 1><tab>connect_time:<connect_time 1><tab>sender:<sender 1><tab>eom_time:<eom_time 1><tab>size:<size 1><tab>recipient:<recipient 1><tab>country:<country 1>
 client_address:<client address 2><tab>client_port:<client_port 2><tab>connect_time:<connect_time 2><tab>sender:<sender 2><tab>eom_time:<eom_time 2><tab>recipient:<recipient 2.1><tab>recipient:<recipient 2.2><tab>country:<country 2>
 sender:<sender 3><tab>client_address:<client address 3><tab>client_port:<client_port 3><tab>eom_time:<eom_time 3><tab>recipient:<recipient 3><tab>connect_time:<connect_time 3><tab>size:<size><tab>country:<country 3>
...

このフォーマットはLTSV Formatに似た形式ですが、一行の中に同じラベル(recipient)が複数存在しますので注意してください。

ログファイルは、毎日ログローテーションします。ローテーション後のファイル名は /var/log/smtpauth/stats.log.YYYYMMDD です。

複数SMTPサーバのログを集約

smtpauth-managerは、複数のSMTPサーバのメールログをLOGサーバへ送信し、LOGサーバ上で集約することができます。 設定手順は、複数のSMTPサーバのログの集約を参照してください。

LICENSE AND COPYRIGHT

Copyright (C) 2016 Toshifumi Sakaguchi

This program is distributed under the (Revised) BSD License: Lhttp://www.opensource.org/licenses/bsd-license.php