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ではログファイルを一度スキャンし、
- Queue ID->接続元IPアドレスの辞書(Hashなど)を作成する。
- Queue ID->送信者メールアドレスの辞書を作成する。
- Queue ID->宛先メールアドレスの辞書を作成する。
- Queue ID->SMTP認証IDの辞書を作成する。
- 上記の辞書を組み合わせ、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を同時に出力することができるようになります。
LOCAL_CONFIG
Klog syslog -S" "
LOCAL_RULESETS
SLocal_check_mail
R $* $@ $(log client_addressa=$&{client_addr},\ client_port=$&{client_port},\ auth=$&{auth_authen} $)
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
- Perl
- Sendmail-PMilter >= 1.00
- Readonly
- Time::Piece
- Geo::IP
- Moose
- MooseX::Getopt
- MooseX::Daemonize
- Exception::Class
- Email::Address
- Email::Simple
- Email::Date::Format
- Email::Send
- Authen::SASL
- RRDs
- Net::INET6Glue
- Test::MockObject(for make test)
インストール
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> メッセージ数のしきい値(通)
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アドレスからのメール送信に対して、 倍率を設定することができます。例えば、- プライベートIPアドレスからのメールは、メール大量送信として扱わない(倍率 0)。
- あるユーザはマルウェアに感染しやすいので、通常の半分のメールで大量送信として扱う(倍率2)。
- ある海外のISPからのメールは、ユーザが利用するとは考えられないので、倍率を10にする。
- 同一のSMTP認証IDのユーザが、同時に2カ国から送信してきた場合は、倍率を2とする。
# 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を修正します。
- CONNECTのMACROに{client_port}を追加することで、接続元のSource Portをログに出力することができます。
- 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>
...
- clinet_address: SMTPクライアントのIPアドレス。MTAがPostfixの場合は、
milter_connect_macros
に{client_addr}
を追加することで出力可能 - clinet_port: SMTPクライアントのSource port。MTAがPostfixの場合は、バージョンが2.5以上に限り、
milter_connect_macros
に{client_port}
を追加することで出力可能。 MTAがSendmailの場合は、confMILTER_MACROS_CONNECT
に{client_port}
マクロを追加することで出力可能。 - auth_id: SMTP認証のID。
- sender: エンベロープの送信者メールアドレス( MAIL From: )。
- recipient:エンベロープの宛先メールアドレス( RCPT To: )。
- connect_time: SMTPサーバにクライアントが接続した時刻。YYYY-MM-DD HH:MM:SS %z.
- eom_time: SMTPサーバがクライアントからメールを受診した時刻( End of message ".\r\n" ). YYYY-MM-DD HH:MM:SS %z.
- size: メッセージサイズ(bytes)。MTAがSendmailの時のみ、
confMILTER_MACROS_EOM
に{msg_size}
マクロを追加することで出力可能。 - country: 送信元の国のコード
- tab: TAB ("\t")
このフォーマットは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