[ English / Japanese ]
SMTPのラッパーである「antibadmail」は、SMTPセッションにおいてspam (迷惑メール)を拒否する汎用的な機能を提供するソフトウェアです。 このプログラムは、以前に作成したqmail patches の後継版です。
「antibadmail」はラッパーであるため、qmailだけではなくsendmailや postfixを初めとするRFC2821準拠に準拠したものであれば利用可能です。
コンテンツフィルタとは異なり、antibadmailはコンテンツ(メールの中身) を一切チェックせずに迷惑メールを拒否します。 想像してみてください。もしあなたが迷惑メールを送信する側であるならば、 正規のSMTPサーバから迷惑メールを送信するでしょうか? 正しい自分のメールアドレスを利用して迷惑メールを送るでしょうか?
いいえ、そのようなことはしません。
antibadmailはSMTPセッションにおけるおかしなパラメータを元に迷惑メー ルを拒否します。antibadmailのプログラムは、三つのSMTPパラーメータ (HELO, MAIL-FROM, RCPT-TO)とSMTPクライアントのDNSレコードのみをチェッ クしますので、このソフトを使うことでメールサーバの負荷を下げることがで きます。
最新版を入手するにはcvsを使ってください。
cvs -d :pserver:anonymous@yatex.org:/qmail co antibadmail
ソースコードのスナップショット
antibadmail-1.37.tar.gz
abmusersメーリングリストへの加入もどうぞ。
下記のようにしてantibadmailを利用することでqmail/sendmail/postfixで 簡単に迷惑メールを拒否することができます。
($CONTROLDIR のデフォルト値は /var/qmail/control)
$CONTROLDIR/badhelodir/ディレクトリにあるファイル名に一致する 名前を、HELOのパラメータとして送ってきたホストからのメールを拒否 します。また、. (ドット)から始まるエントリは、ワイルドカードとし て扱われます。
偽ったIPアドレスをHELOのパラメータとして使用して、迷惑メール を送ってくる場合もあります。これらのほとんどは迷惑メールです。こ のメールを拒否します。
unknown-host(IPアドレスに対応するPTRレコードが登録されていない ホスト)に対しては、より厳密な下記のHELOメッセージチェックが行な われます。
HELOのパラメータに「.(ドット)」が含まれていない場合は迷惑メー ルと見なす。
unknown-hostからのHELOパラメータに対して、より広範囲なワイル ドカードマッチング(例: `.jp')が適用されます。 $CONTROLDIR/badhelodir/unknown/ディレクトリに、ワイルドカードパ ターンをファイル名として、空ファイルのファイルを作ります。
上記のいずれの場合においても、qmailのルールと同様に $RELAYCLIENTか$RELIABLECLIENTがセットされている場合には、badhelo チェックはされません。
badhelo拒否と同様に、MAIL-FROM アドレスで拒否することができま す。$CONTROLDIR/badmailfromdir/に拒否したいメールアドレスを置く ことで実現できます。「@」から始まるパターンは当該ドメインのすべ てのメールアドレスを意味します。「.(ドット)」から始まるパターン は、そのドメイン下のすべてのドメインに一致します。
(例) @hotmail.com -> すべての *@hotmail.com アドレスに一致します .biz -> すべての *@*.biz アドレスに一致します
ランダム@hotmail.comと言ったアドレスからの非常に多くの迷惑メー ルがあることを知るかも知れません。そのときに、すべての @hotmail.com のメールを受信をあきらめるのは賢い選択でしょう。 やりすぎだと思いますか?? では次を読んでください。
tcpserverのルールファイルの中で、GOODMAILFROMに受け入れを許可
するドメイン名を設定します。この変数にリストアップされたドメイン
は、$CONTROLDIR/badmailfromdir/のリストに含まれてい
たとしても受け入れられます。この特徴により、正規のhotmailサー
バから@hotmail.comのメッセージを受け取りつつ、偽物の
@hotmail.com をすべて拒否することができます。これを行なうために
は、
=.hotmail.com:allow,GOODMAILFROM="@hotmail.com"
をtcpserverのルールとbadmailfromデータベースの
@hotmail.comの中へ記述します。antibadmailを-Hオプションを
*つけずに* 起動します。(-Hオプションはリモートホスト名をしないオ
プション)
$GOODMAILFROMのルールのように、送ってきたHELOパラメータが
$CONTROLDIR/badhelodir/の中に存在したとしても、
$GOODHELOにリストアップされていれば、そのメールは受け入れられま
す。
気をつけて使いましょう!
Yahooのように無料のメールアドレスサービスやインターネット接続 サービスを提供しているプロバイダ(ISP)があります。正規のYahooの SMTPサーバは、サーバ自身の正しいFQDN名を送ってきますから、 「HELO yahoo.com」と送ってくる(名乗る)サーバは100%迷惑メールを送 ろうとしていると思われます。したがって、これらを拒否するのは賢い 方法と言えます。この場合、「yahoo.com」エントリをbadhelodir/デー タベースに追加します。この時、$GOODHELOを設定してはいけません。 なぜならば...
例えば、hotmail.comのように、FQDNを送ってこないサーバもあります。 HotmailのSMTPサーバは困ったことに、FQDNの代わりに 「HELO hotmail.com」を送ってきます。このような時だけは $GOODHELOを使います。
=.hotmail.com:allow,GOODMAILFROM="@hotmail.com",GOODHELO="hotmail.com"
こうすることで、頭を悩ませるようなサーバからもメールを受け取 ることができます。
bounceメッセージやRELAYCLIENTからのメッセージを除き、 ローカルパートのみの送信者を持つメールを拒否します。
bounceメールにはnull送信者が使われます。迷惑メールを送信する サーバによっては、null送信者を使い複数の受信者へメールを送ります。 これは誤っています(補足:正規のメールではないという意味)。 antibadmailは、null送信者から送られてきたメールが、複数のRCPT TO(受信者)アドレスを要求したら、そのメールを拒否します。
$RELAYCLIENTや$RELIABLECLIENTを設定してある場合、MAIL-FROMド メインチェックはキャンセルされます。これは、信頼できるメールサー バからのバウンスメールを受け取るのに役立つでしょう。
以前使っていた古いメールアカウントを持っているならば、そのメー ルを今使っているメールサーバへ転送したいかも知れません。このよう な場合、「転送されてきたメールは迷惑メールでいっぱい」ということ を知る必要がある。なぜならば、転送メールを受け取るメールサーバは、 メールを転送してくるサーバを信頼しているのだから。 この問題に対しては、$PASSONLYに列挙されたホストを除くすべての転 送されてきたメールをantibadmailでは拒否する。古いサーバから転送 されてくるメールを、*.jpと*.orgドメインに制限したいならば、下記 をtcpserverのルールへ記述する。
=old.server.previously.used:allow,PASSONLY=".jp/.org"
$CONTROLDIR/badrcpttodir/に列挙されたRCPT-TO受取人アドレスを 拒否する。
BADHOST環境変数が設定されている場合、SMTPのエラー553でメール を拒否します。送られてきたメールを拒否したいときに、TCPコネクショ ンを拒否するのは良くない方法です。SMTPクライアントの自然な振る舞 いとしては、セカンダリMXなどへの接続を試みます。tcpserverでの $BADHOSTの設定は、下記のように行います。
=.evil.domain:allow,BADHOST=""
これによりSMTPセッションで5xxのエラーコードをクライアントへ送 ります。
tcpservverに tcpserver-paranoid パッチを適用する必要があります。
IPアドレスに対するDNSのPTRレコードは必ずしも必須ではありませ ん。しかし、多くの迷惑メール送信者は、PTRレコードを詐称したり、 (設定を)省略したりします。
PTRレコードを詐称したサーバからのメールを拒否したいならば、 -pオプションをtcpserverへ追加します。
tcpserver -p ......
そして、tcpserverを上記のパッチをあてたものに置き換えます。 antibadmailは、不正なPTRレコードが設定されたIPのホストからのメー ルを拒否します。
パラノイドチェックは非常に強力です。たまに意図しないメールを 拒否してしまいます。拒否したログから"BAD_PARANOID"を探 すことで知ることができます。x.y.z.wのIPアドレスを持ち、 *@xyz.its.dom.ainの正しくないPTRを返すホストを許容するためには、 下記のようにtcpruleファイルを追加します。
x.y.z.w:allow,PASSONLY="@xyz.its.dom.ain"
$PASSONLYに一致するx.y.z.wからのメールは、正しくないPTRレコー ドを返したとしても受け取ります。
多くの場合、迷惑メールを送ってくるコンピュータは、(IPアドレス の逆引きホスト名が登録されていない)unknownホストです。この unknownホストからのメールを拒否するのは賢い方法です。 しかし、実際には、受け取りたいメッセージの多くもunknownホストか ら送られてきます。正しいDNSの設定の重要性を認識していないメール サーバの管理者がいるのです。
この問題のために、聞き慣れない国のIPアドレスブロックに対して PTRレコードを要求した方が良いだろう。もし、あなたやあなたのサイ トのユーザ全員があるAAAという国の`XXX.YYY.*.*'というIPアドレスブ ロックと、通信する必要がないならば、下記のような設定をtcpserver のルールファイルへ追加します。
XXX.YYY.:allow,REQPTR=""
この設定により、XXX.YYY.*.*のアドレスブロックのうち、PTRレコー ドが設定されていないホストからの通信はすべて拒否されます。
注意: これはウィルススキャナ(チェッカ)ではありません。ウィルスに感 染したPCの多くは、感染した人のメールアドレスを使用し、悪意のあるファイ ルを送ってきます。antibadmailを導入することで、ウィルススキャナが不要 になるわけではありません。しかし、ウィルススキャナに含まれるコンテンツ フィルタは、常にとても多くのコンピュータ計算資源を浪費します。
antibadmailを使うことで、60-99%の望まないメールを快適に拒否すること ができるでしょう。あなたのメールサーバの資源を節約しましょう!
antibadmailは、tcpserverから起動します。tcpserverは、 ucspi-tcpパッケージに含ま れています。
# gtar zxpf ucspi-tcp-0.88.tar.gz # cd ucspi-tcp-0.88 # vi conf-home (インストール先のプレフィックスを設定するためにconf-homeを編集する) # make && make setup check
smtpデーモンのポート番号を25以外に変更します。 この例では10025番にします。
antibadmailのために、ユーザ(非特権ユーザ)を作成します。
# groupadd abm # useradd -g abm abm
ユーザ名のabmは任意のものでOKです。ここでは、abmユーザ のuidとgidは、それぞれ250と25としておきます。
antibadmailを次のようにして起動します。
RELAYCHECK=1 tcpserver -u 250 -g 25 -x /etc/smtp.cdb 0 25 \ antibadmail mconnect 127.0.0.1 10025
antibadmailとmconnectコマンドが$PATHに含まれていること
を確認してください。`mconnect'はSMTPコネクションクライアン
トで、ucspi-tcpに含まれているものです。
/etc/smtp.cdbは、tcpserverのコネクション制御
ルールのデータベースです。もし、tcpserverについて詳しいこ
とを知らないならば、下記にあるtcpserverルー
ルを見てください。
メールサーバで受け取るドメイン名の列挙
もし、あなたのメールサーバでfoo.example.comと
*.bar.example.netを受け取る(あるいは中継する)ならば、
/var/qmail/control/rcpthostsdir/に下記の空ファ
イル作成します。
foo.example.com .bar.example.net
注意: 下記で説明するbad*dirのパターンとは異なり、アット マーク(@)はドメイン名のパターンには不要です。起動時のコマ ンドラインに含まれるRELAYCHECK=1は、受け入れ可能なRCPT-TO ドメインのチェックを有効にすることを意味します。 RELAYCHECK=1を指定していたとしても、クライアントが SMTP-AUTHをパスしたならば、antibadmailはクライアントが送る あらゆるRCPT-TOドメインを受けとります。
もし、受け入れ可能なドメイン名を"POP before SMTP"で変更するならば、abmusers メーリングリストで聞いてください。
qmail-smtpdデーモンプログラムは、ほかのプログラムでラップされ ることを想定し設計されています。あなたがすべきことは、起動スクリ プトにantibadmailを追加することだけです。例えば、このようなスク リプトがすでにあったとします。
tcpserver -u 250 -g 25 -x /etc/smtp.cdb 0 25 qmail-smtpd
これを次のように書き換えます。
tcpserver -u 250 -g 25 -x /etc/smtp.cdb 0 25 \
antibadmail qmail-smtpd
これだけです。
もしtcpserverについて、まだあまり詳しいことを知らないならば、この簡
単なルールファイル/etc/smtpを試してみてください。
127.0.0.1:allow,RELAYCLIENT="" 10.0.0.:allow,RELAYCLIENT="" all:allow
ここで、10.0.0.はLANのIPアドレスのプレフィックスです。 RELAYCLIENT=""は、当該アドレスからのsmtpコネクションが張られ た際に環境変数を設定することを意味しています。qmail-smtpdのように、 antibadmailは環境変数のRELAYCLIENTが設定されているときは、そのクライア ントがLANに接続されているものと見なし、コネクションが悪用されるのを悪 用されるのを防ぎます。antibadmailは、RELAYCLIENTが設定されている時に、 すべてのメッセージを受け取ります。
もし、/etc/smtpにルールデータベースを書いたならば、下
記のようにしてcdbフォーマットへ変換しなければなりません。
# cd /etc # tcprules smtp.cdb tmp < smtp
tcpserverとantibadmailを起動したあとに、`telnet localhost smtp'を実 行して、動いていることを確認してください。オリジナルのsmtpデーモンから のSMTPのグリーティングメッセージを受け取れたら、ほぼ正常に動いているで しょう。
拒否や受取りの結果を記録するには、下記の行を
/etc/syslog.confへ追加します。
local1.info /var/log/smtp-stat
ログファイルのローテーションのために、
/etc/newsyslog.conf(BSD)や
/etc/logrotate.conf(Linux)のファイルも変更しておいた方が
いいでしょう。
antibadmailは、`datadir'データベース構造を参照します。datadirは、 maildirに似た構造であり、「ファイルの中の行」の代わりに「ディレクトリ の中のファイル」という形でエントリが存在します。デフォルトでは、 antibadmailは三つのディレクトリを参照します。
/var/qmail/control/badhelodir/
SMTP-HELOで拒否するパターンをファイル名に持つファイルを保持し ます。
/var/qmail/control/badmailfromdir/
エンベロープ送信者(SMTPのMAIL FROM アドレス)で拒否するパター ンをファイル名に持つファイルを保持します。
/var/qmail/control/badrcpttodir/
エンベロープ受信者(SMTPのRCPT TO アドレス)で拒否するパターン をファイル名に持つファイルを保持します。
プレフィックスの/var/qmail/controlは、実行時に環境変数
の$CONTROLDIRを設定するか、コンパイル時に`CFLAGS=-DCONTROLDIR=/foo/'の
ように設定することで、変更できます。
ファイル名は下記のうちのいずれかひとつ。
badhelodirとbadmailfromdirとbadrcpttodirでは、 `name'と同じパラメータを送ってきたすべてのクライアン トを拒否します。
badhelodirとbadmailfromdirでは、パラメータとして送ってきたド メイン名が`.name'で終わる場合に、すべてのクライアント を拒否します。つまり、`*.name'というワイルドカードでのマッチング になります。
badmailfromdirでは、`@name'と同じパラメータを送っ てきたすべてのクライアントを拒否します。つまり、`*@name'というワ イルドカードでのマッチングになります。
antibadmailのポリシーは「コンテンツ(メールの中身)はチェックしない」 ということです。
しかしながら、SMTPサーバから転送されてきたメール(badmail)に関しては、 そのメッセージヘッダを見ないことには拒否できません。
antibadmailは、メールヘッダのパターンでメールを拒否することができま す。ただ、このヘッダによる拒否は、一度マッチすると救助することが できないという強力なものなのでデフォルトでONになっています。 有効化したいときは antibadmail 起動時に環境変数 HEADERCHECK=0 と します。
ヘッダーチェックがONの場合、 antibadmailは所定のディレクトリからヘッダ用のパターンを 読みます。 ヘッダでの拒否で使用するdatadir構造は、上記のものと若干異なります。 あるヘッダパターンのdatadirは、次のように構成されます。
$CONTROLDIR/badhdrdir/FieldName/EntryName/p* $CONTROLDIR/badhdrdir/FieldName/EntryName/errmsg
ここでFieldNameはヘッダフィールドの名前をすべて小文字に したもの、EntryNameはパターン集合につける任意の名前です。
`p'から始まるすべての名前のファイル名は、FieldName の値と比較される固定文字列として評価されます。ひとつのパターンは 一行に書きます。パターンを複数行書くとAND条件と見なされ、1行分 のパターンがマッチしたら残りの部分と次のパターン行が照合されます。 別のファイルにあるパターンはOR条件と見なされます。
クライアントが送ってきたヘッダがパターンに一致したときに、 クライアントに送られるSMTPエラーメッセージです。
例えば、拒否したいメールのヘッダが次のようなものだったとします。
Received: from hogehoge.fugafuga.com (HELO oldserver.you.used) ....(1) or Received: from unknown .... by oldserver.you.used ....(2)
ここで`....'は、(省略した)任意の文字列です。メールを転送してきた SMTPサーバ(以前使用していたサーバ)が付加したreceivedヘッダを見て、転送 されてきたメール(badmail)を拒否するとよいでしょう。(1)に対するパターン は次のようになります。
(HELO oldserer.you.used)
ん、何故これが悪いパターンかって? なぜならこのHELOはspammerが
昔使っていた oldserver に対して送ったもので、oldserver にたいして
"HELO oldserer.you.used" と名乗るのは典型的な
spamツールだからです。さて、もう一つの方、
(2)に対するパターンは、
from unknown by oldserver.you.used
注意: パターン2は、二行に渡って書いていますので、それぞれの文字列 ("from unknwn"と"by oldserver.you.used")は、 receivedヘッダに一致しなければなりません。結論として、この設定
--- File: $CONTROLDIR/badhdrdir/received/foo/ptn-1 --- (HELO oldserer.you.used) --- File: $CONTROLDIR/badhdrdir/received/foo/ptn-2 --- from unknwon by oldserer.you.used --- File: $CONTROLDIR/badhdrdir/received/foo/errmsg --- We cannot receive suspicious messages.
は、"(HELO oldserer.you.used)"か、"from unknwon"と"by oldserer.you.used"の両方に一致する receivedヘッダを含むメッセージを拒否し、SMTPのエラーメッセージとして "We cannot receive suspicious messages."を返します。
When you are aware of the power of header rejection, you might want to describe patterns more precisely. The first character in each line of pattern files determines the matching method. There are five methods for matching.
| Pattern line | Meaning |
|---|---|
| =STRING | Whole line is exactly same as STRING |
| ^STRING | Line is beginning with STRING |
| $STRING | Line is ending with STRING |
| /REGEX | Line is matching with regular expression REGEX |
| :STRING | Line has the part which exactly same asSTRING |
| STRING | Same as above |
Note that all header field contents will be joined into one line, converted all lower case. Therefore all matching will be done in case-insensitive.
Regular expression engine is supplied by libc of your driving operating system. So it is different from that of Perl, Emacs-Lisp, (GNU)egrep which you may be experienced with. If you want to examine how regexp pattern matches with, use debugging mode of header module. It is obtained by typing this;
% make h
Using h command interactively as follows.
% ./h Received: from hogehoge.blah.example.org (HELO oldserver.you.used) by oldserver.you.used
The `h' command acquires all patterns in $CONTROLDIR/badhdrdir/*/* and apply all patterns over given strings from stdin.
Be aware that although regular expression is friendly, using regexp easily causes configuration errors. It is difficult enough to confuse system administrators. Absolutely NO errors for mail configurations!
偽りの`*@hotmail.com'のメールを拒否し、しかし正規のhotmailサーバか ら`*@hotmail.com'のメールを受け取りたいと思うかも知れません。この場合 には、次のようにします。
# touch /var/qmail/control/badmailfromdir/@hotmail.com
=.hotmail.com:allow,GOODMAILFROM="@hotmail.com"
もし、とあるサーバからのメッセージをすべて受け入れたい場合には、そ のサーバに対して環境変数RELIABLECLIENTを設定します。
=smtp.server.you.wantto.rely:allow,RELIABLECLIENT=""
RELIABLECLIENTが設定されているとき、安全ではないパラメータを除き、 antibadmailでのメールの拒否チェックは行われません。
誤ったDNSレコードの設定がされているSMTPサーバからのすべてのメールを、 あなたやあなたのSMTPサーバのユーザが受け取りたいとします。例えば、ネッ トショッピングやオークション、メールマガジンなどが考えられます。これら のサイトは概して、不作法なサービスプロバイダです。多くは、正しいDNSの 設定(AレコードやPTRレコード)がなされていなかったり、正しいSMTP-HELOの 設定がなされていなかったりします。デフォルトではantibadmailはこれらの 正しくないサーバからのメールを拒否しますが、特定の受信アドレスに対して 拒否を抑制することが可能です。
下記のようにして「固定受信アドレス」を設定します。
固定受信者のdatadirを作ります。
# mkdir /var/qmail/control/soiledrcpttodir
拒否しない受信アドレスのエントリを作成します。
# mkdir /var/qmail/control/soiledrcpttodir/local-foo@your.domain
このようにして、`local-foo@your.domain'へのすべてのメールはパスしま す。
qmailでは、soiledrcpttodirの受け入れ可能なワイルドカードパターンは 次のようになります。
local-@your.domain
ローカルパート(メールアドレスのドメイン名以外の部分)が`-'で終 わるときには、すべての`local-*@your.domain'をパスします。
@any.domain
すべての`*@any.domain'をパスします。
注意: smtpクライアントが送るパラメータが、badhelodirや badmailfromdirやbadrcpttodirのひとつでも厳密に一致(match strictly)する 場合には、この拒否抑制は起りません。
迷惑メールのデータベースをanoncvsで公開しています。
cvs -d :pserver:anonymous@yatex.org:/qmail co spamdb
データベースはプレインテキスト形式で、datadir構造にはなっていません。 このプレインテキスト形式をf2dコマンドでdatadir構造へ変換できます。f2d コマンドはantibadmailパッケージに含まれています。
例えば、badmailfromファイルをspamdbからbadmailfromdir/構造へ変換す るには、f2dコマンドを使用して次のように行います。
f2d -d ./badmailfromdir badmailfrom
注意: ./badmailfromdir/とbadmailfromは、カレントディレクトリからア クセスできる場合です。
複数のレコードをひとつのファイルに持つあらゆるデータベースは、常に その複雑さに頭を悩ませています。
`Datadir'の構造により、ファイルロックは不要となります。なぜならば、 エンティティのアップデートは、ほかのエンティティの参照なしに行うことが できるからです。すべての追加や削除の操作は、ファイルの作成や削除なので、 自動的にアトミック操作になります。
antibadmailに関連する開発やトラブルシューティングに関する話題を話し 合うためのメーリングリストがあります。antibadmailを育てるためにも是非 とも加入してください!(訳注: 日本語もOKですが、中には英語でのやり取り が行われることもあります。)
antibadmailユーザメーリングリスト(abmusers)に参加するためには、自己 紹介(5行以上)を、"subscribe"という件名 (サブジェクト)で、abmusers@ml.gentei.orgの アドレスへ、送ってください。下記がサンプルです。
To: abmusers@ml.gentei.org
Subject: subscribe
--
(5行以上の自己紹介)
私はFOOという会社の新米管理者です。
emailが大好きです!
でも、spamは大嫌いです!
---
YourMail@foo.comp....
上記の真似はしないでくださいね。:)