最近,自宅サーバに届く spam メールが大幅に増え,無駄なリソースを消費しています.qmail で運用し,セキュアであっても.また,bogofilter を使い,spam メールを別のメールフォルダに隔離したとしても,spam メールをサーバが受け取る事には変わりありません.
その為,サーバのディスクに保存される前に spam メールを拒否する方法が必要になり,何か良い方法が無いかとリサーチしていました.そこで antibadmail を発見し,調査,テスト,運用という流れになりました.
ここでは,antibadmail のインストール及び設定について説明します.
# 備忘録な面がとても強いのですが,そこはご愛嬌です.
antibadmail とは,広瀬雄二さんが作成した SMTP セッション中に spam メールを拒否する為の汎用的な SMTP ラッパーです.
ラッパーですので,qmail 以外の postfix や courier-mta 等,RFC2821 に準拠した物であれば利用可能です.
antibadmail はコンテンツフィルタでは無い為高速に動作し,SMTP セッション中に spam メールの判断を行い,spam と判断した場合,SMTP セッションを中断します.
ただし,SMTP セッションで得られる情報は限られた物なので,antibadmail で全ての spam メールを拒否出来るわけではありません.その為,ベイジアンフィルタである,bogofilter や spamassassin を組み合わせて使うと効果的です.
結局組み合わせる必要があるなら,bogofilter 等だけで良いのでは? と思う人もいると思います.bogofilter 等のベイジアンフィルタは,メール本文を全て読んでから判断しますので,いくら bogofilter が C 言語で書かれていて高速だろうと,やはり速度の低下は免れません.spamassasin は Perl で書かれていますので,余計も遅くなるでしょう.
その為,SMTP セッションで明らかに spam だと判断出来るメールはその段階で拒否し,残りをベイジアンフィルタにかける方が効率が良く,CPU パワーを有効的に使えるのです.
antibadmail は作者のサイトからダウンロードが出来ます.現在の最新のスナップショットは antibadmail-1.24.tar.gz のようです.
が,作者は,CVS を利用した入手を薦めているようですので,CVS を利用してソースコード等を入手しましょう.具体的には以下の様にタイプする事で入手が可能です.
cvs -d :pserver:anonymous@yatex.org:/qmail co antibadmail
antibadmail は D.J.Bernstein が作成した ucspi-tcp パッケージに含まれている tcpserver を利用しますので,サーバ内に ucspi-tcp がインストールされていない場合はインストールする必要があります.
D.J.Bernstein さんのプロダクト (qmail や djbdns) がインストールされている場合は ucspi-tcp がインストールされているはずですが,そうでない場合は,以下の様にインストールしましょう.
# ここでは,FreeBSD な環境を想定しているので,ports/packages でインストールする事を前提にしています.
cd /usr/ports/sysutils/ucspi-tcp make install
これで,ucspi-tcp がシステムにインストールされます.
antibadmail のインストールは,以下の様に make install でインストールが可能です.
# 上記の CVS 経由で取得した場合を想定しています.
cd antibadmail make install
これで antibadmail のインストールが完了しました./usr/local 以下に antibadmail という名前のバイナリファイルがある事を確認して下さい.
上記の手順でバイナリのインストールは終わりましたが,設定ファイルを保存する場所の準備が出来ていません.以下のように設定ファイルを準備するディレクトリを用意してください.
mkdir -p /var/qmail/control/badhelodir mkdir -p /var/qmail/control/badmailfromdir mkdir -p /var/qmail/control/badrcpttodir
これらディレクトリの作成が完了した事を確認して下さい.
antibadmail は tcpserver を通じて動作すると書きました.tcpserver は詳細なアクセスコントロールが可能で,このルールは,テキストで作成し,tcprules コマンドで CDB と呼ばれるデータベース形式に変換して利用します.
CDB はとても高速なファイルデータベースで,変更があっても tcpserver の再起動は必要がありません.その為,動的にルールを変更させる使い方でも問題はありません.
# POP Before SMTP 等で CDB を使う場合,動的にルールを変更しています.
単純な tcprules ファイルは次の様になります./usr/local/etc/tcp.smtp という名前で作成して下さい.
127.0.0.1:allow,RELAYCLIENT="" 192.168.1.:allow,RELAYCLIENT="" all:allow
この場合,127.0.0.1 (localhost) からのメールの発信は許可.192.168.1 (自ネットワーク)からのメールの発信の許可.その他は接続のみが許可.といったルールになります.
先に述べたように,テキストファイルのままでは動作せず,CDB 形式に変換する必要があります.変換には tcprules コマンドを利用します.次のようにタイプする事で,CDB 形式に変換されます.
tcprules /usr/local/etc/tcp.smtp.cdb /usr/local/etc/tcp.smtp/tmp < /usr/local/etc/tcp.smtp
これで /usr/local/etc/tcp.smtp.cdb というファイルが作成されました.
qmail を tcpserver 経由で起動している場合,qmail-smtpd を起動するスクリプトに少し編集を加えます.
tcpserver -vR -x /usr/local/etc/tcp.smtp.cdb -c120 -U 0 smtp qmail-smtpd 2>&1
と上記の様なスクリプトがあった場合,以下の様に書き換えます.
tcpserver -vR -x /etc/smtp.cdb -c120 -U 0 smtp antibadmail qmail-smtpd 2>&1
と,書き換える事で,qmail-smtpd は antibadmail が前に待ち受ける形で起動する事が出来ます.
antibadmail はメールの Accept, Reject を syslog でログを取得出来ます.ログファシリティは LOCAL1 で,ログレベルは INFO です.
syslog.conf に次の1文を追加し,syslogd をリスタートさせる事でログ取得の準備が完了します.
local1.* /var/log/smtp-stat
この場合,/var/log/smtp-stat に antibadmail のログが吐き出されます.このまま運用した場合,ログサイズが膨大になりますので,newsyslog.conf を編集し,ログのローテーションを行った方が良いでしょう.
newsyslog.conf には以下の様に追加します.
/var/log/smtp-stat 640 7 * @1T00 J
この場合,/var/log/smtp-stat は,毎月1日の午前0時にログのローテーションが行われます.ローテート回数は7回で,ログファイルは bz2 形式で圧縮して保存されます.
メールの流量が多い場合,ここは毎月では無く,毎週又は毎日とすべきですが,多数のファイルに分けられてしまいますので,ログを整形してレポートを行う何かが完成してから細かく分けるようにした方が良いかと思います.
上記の点が完了したら antibadmail は動作しているはずです.ですが,何も設定されていない状態の場合,基本的に antibadmail は働いてくれません.
その為,様々な状態に合わせて設定を行う必要があります.以下では代表的な設定について記載していきます.
以前存在したアドレスで,現在使われていないアドレス宛ての spam メールは結構多いものです.既に存在せず,またしばらく使う事の無いアドレスは,spam メールを受信する際に拒否する事によって,無用なバウンスをなくす事が可能になります.
例えば,info@example.com というアドレスは存在せず,また,しばらく使う事の無い事が分かっている場合,次のように設定する事でメールの受信を拒否出来ます.
touch /var/qmail/control/badrcpttomdir/info@example.com
このように,/var/qmail/control/badrcpttodir 以下にメールを受取りたくないアドレス名のファイル ( 今回の場合は,info@example.com ) を作成する事で,SMTP セッション中に受信を拒否する事が可能です.
多くの spam は hotmail 等のフリーメールアドレスのアカウント名を From: としてメールを送ってきます.大抵の場合,From: に書かれたアドレスは存在しないアドレスや,spammer 本人のアカウントでは無い為,メールサーバは User Unknown 等の返信を送ろうにも送れなかったり,全く違う他人に送ってしまう事になります.
この様な spam の場合を拒否するには以下の様な考察の元で設定を行うと効果的です.
プロバイダが用意してある正規のサーバを利用していない
上記の理由により,正規のサーバからのメールは受信し,それ以外は拒否とするルールを適用する事によって,hotmail や yahoo を名乗る spam を拒否する事が可能になります.
touch /var/qmail/control/badmailfromdir/@hotmail.com touch /var/qmail/control/badmailfromdir/.hotmail.com echo '=.hotmail.com:allow,GOODMAILFROM="@hotmail.com"' >> /usr/local/etc/tcp.smtp
/var/qmail/control/badmailfromdir 以下に @hotmail.com というファイルを作成する事で,@hotmail.com を名乗るメールを全て拒否します.ただし,これだけの場合だと正規のサーバからのメールも拒否する事になる為,tcpserver のルールセットに =.hotmail.com:allow,GOODMAILFROM="@hotmail.com" を追加します.こうする事で,接続元のホスト名を調べ,ホスト名のドメイン部分が hotmail.com かどうかを判断し,hotmail.com だったら許可,それ以外なら拒否という動作を実現する事が可能になります.
ここでは,antibadmail を使う際に注意しなければならない点を Tips として纏める事にします.
メーリングリストマネージャとして ezmlm 及び ezmlm-idx を使っている場合,antibadmail を利用する際に注意する点があります.
antibadmail は,RCPT TO に現れたメールアドレスから,メールボックスが存在するかをチェックします.ezmlm は,.qmail-[ML] という形式の .qmail ファイルを持ち,そのファイルは,symlink で各 ML 内のファイルを指しています.
問題が出るのは,各 ML のディレクトリのパーミッションが,700(drwx------) である事です.antibadmail は,qmaild の権限で動作しますので,qmaild からファイル名見える状態でなければなりません.
大抵の場合,ezmlm で作成したディレクトリのオーナは,そのユーザになっており,パーミッションが 700(drwx------) の為,qmaild は .qmail-[ML] の先のファイルを見る事が出来ませんので,antibadmail は RCPT TO が正しくないと SMTP セッションを終了させてしまいます.
その場合,ディレクトリパーミッションを 701(drwx-----x) とし,ディレクトリ以下のファイル名が見える状態にする事で問題を回避する事が可能です.
Hiroyuki Seino http://www.seichan.org/ http://www.seichan.org/blog/
Today:1 Yesterday:2 All:10623