サーバ構築(7) SPAM対策(sendmail + S25R)

Pocket

SPAM対策の一つに S25R 方式というのがあります。SPAM 阻止率99% というふれこみで一時話題になりました。これは SpamAssassin や Bogofilter のようにメールの中身を解析してSPAM判定するのではなく、送信元の情報から SPAM 発信者とおぼしきものを徹底排除するという考え方によるものです。かなり割り切った考え方なので誤判定の可能性も高く、Whitelistのメンテナンスをきちんとしないと業務では怖くて使えない代物ですが、自宅サーバの SPAM フィルタに使う分にはお手頃で効果もかなり期待できます。

S25R 方式は Postfix での運用を前提に考え出されたものです。sendmail で S25R 方式を取り入れる場合、sendmail単体では無理で、milter-regex と組み合わせることになります。

まずは milter-regex 用のディレクトリを掘り、owner を変更します。

# mkdir /var/milter-regex
# chown smmsp:root /var/milter-regex

ソースコードを取得し、SYSLOG のファシリティを変更してから make します。実行ファイルは手動でコピーします。

# cd /usr/local/src
# wget http://www.benzedrine.cx/milter-regex-1.7.tar.gz
# tar xvfz milter-regex-1.7.tar.gz
# cd milter-regex-1.7
# vi milter-regex.c
[milter-regex.c]
564c564
<       openlog("milter-regex", LOG_PID | LOG_NDELAY, LOG_DAEMON);
---
>       openlog("milter-regex", LOG_PID | LOG_NDELAY, LOG_LOCAL5);

# make -f Makefile.linux
# cp milter-regex /usr/bin/

起動スクリプトのひな形を /etc/init.d にコピーし、修正します。

# cp milter-regex.init /etc/init.d/milter-regex
# cd /etc/init.d
# chmod 755 milter-regex
# vi milter-regex
[/etc/init.d/milter-regex]
20c20
< user="mailregx"
---
> user="smmsp"

S25R 方式に則った SPAM フィルタルールを記述します。milter-regex のサイトにもフィルタルールの例がありますので、これも併せて記述しておきます。

# vi /etc/mail/milter-regex.conf
[/etc/mail/milter-regex.conf]
# S25R方式のフィルタ
tempfail "may not be mail exchanger"
connect /^[^.]*[0-9][^0-9.]+[0-9]/e //
connect /^[^.]*[0-9]{5}/e //
connect /^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/e //
connect /^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/e //
connect /^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./e //
connect /^(dhcp|dialup|ppp|adsl|dsl)[^.]*[0-9]/e //

# DNS逆引き出来ないホストを拒否する
tempfail "Sender IP address not resolving"
connect /\[.*\]/ //

# DDNSと思われるホストを拒否する
reject "Looks like a dynamic address"
connect /[0-9][0-9]*\-[0-9][0-9]*\-[0-9][0-9]*/ //
connect /[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*/ //
connect /[0-9]{12}/e //

# MS Outlookを詐称しているホストを拒否する
HAS_MIMEOLE             = header /^X-MimeOLE$/ //
HAS_MSMAIL_PRI          = header /^X-MSMail-Priority$/ //
HAS_X_MAILER            = header /^X-Mailer$/ //
HAS_OUTLOOK_IN_MAILER   = header /^X-Mailer$/ /Microsoft (CDO|Outlook) /e
MISSING_OUTLOOK_NAME    = ( $HAS_MIMEOLE or $HAS_MSMAIL_PRI ) and \
                            $HAS_X_MAILER and not $HAS_OUTLOOK_IN_MAILER
OUTLOOK_MUA             = header /^X-Mailer$/ / Outlook /
OUTLOOK_MSGID_1         = header /^Message-ID$/ \
                            /^<[0-9a-f]{12}\$[0-9a-f]{8}\$[0-9a-f]{8}@>$/
OUTLOOK_MSGID_2         = header /^Message-ID$/ \
                            /^<[A-Za-z0-9-]{7}[A-Za-z0-9]{20}@hotmail\.com>$/
IMS_MSGID               = header /^Message-ID$/ \
                            /^<[A-F]{36,40}@>$/
UNUSABLE_MSGID          = header /^List-Unsubscribe$/ //
FORGED_MUA_OUTLOOK      = $OUTLOOK_MUA and not ( $UNUSABLE_MSGID or \
                            $OUTLOOK_MSGID_1 or $OUTLOOK_MSGID_2 )
MSGID_OE_SPAM_4ZERO     = header /^Message-ID$/ \
                            /<[a-f0-9]{12}\$[a-f0-9]{8}\$0000[a-f0-9]{4}@/

reject "Forged Outlook headers"
$MISSING_OUTLOOK_NAME or $FORGED_MUA_OUTLOOK or $MSGID_OE_SPAM_4ZERO

sendmail.cf を修正します。sendmail.mc の MAILER 行よりも前に、milterの記述を挿入します。長いですが実際には改行せずに1行で記述します。sendmail を再起動すれば sendmail.cf は再生成されますので、sendmail.mc の編集だけすればよいです。

# vi /etc/mail/sendmail.mc
[/etc/mail/sendmail.mc]
173a174
> INPUT_MAIL_FILTER(`milter-regex',`S=unix:/var/milter-regex/milter-regex.sock',
 `T=S:30s,R:2m')

syslog.conf を修正します。修正後、syslogd を再起動します。併せて、ログローテーションの設定も行います。こちらも長いですが実際は改行なしの1行です。

# vi /etc/syslog.conf
[/etc/syslog.conf]
7c7
< *.info;mail.none;authpriv.none;cron.none         /var/log/messages
---
> *.info;mail.none;authpriv.none;cron.none;local5.none     /var/log/messages
30a31,32
> # milter-regex
> local5.*                                           /var/log/milter-regex

# service syslog restart

# vi /etc/logrotate.d/syslog
[/etc/logrotate.d/syslog]
1c1
< /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler
 /var/log/boot.log /var/log/cron {
---
> /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler
 /var/log/boot.log /var/log/cron /var/log/milter-regex {

最後に milter-regex を登録・起動し、sendmail を再起動します。

# chkconfig milter-regex on
# service milter-regex start
# service sendmail restart

なお、whitelist (除外設定)を設定する場合、S25R のフィルタルールを適用しないホストの情報を、以下の書式に従って /etc/milter-regex.conf の先頭に記述します。

accept
# IPアドレスで記述する場合 (192.168.0.1)
connect // /^192\.168\.0\.1$/
#
# ホスト名で記述する場合 (*.mail.example.jp)
connect /^\.mail\.example\.jp$/ //

これまでのコメント

  1. 管理人 :

    Softbankのケータイメールを拒絶してしまうことが判明。
    /etc/mail/milter-regex.conf の先頭にホワイトリストを追加。

    [/etc/mail/milter-regex.conf]
    ### White List
    /^mmrts[0-9]+p[0-9]+c\.softbank\.ne\.jp$/ OK
    /[0-9]+sc[0-9]\.softbank\.ne\.jp$/ OK

  2. 管理人 :

    gmail を拒絶してたことが判明。
    ### White List
    accept
    connect /^mail-[a-z]*[0-9]*-[a-z][0-9]*\.google\.com/e //

この記事にコメントする

Powered by WordPress, WP Theme designed by WSC Project. ログイン