[ English / Japanese ]

- Anti bad-mail SMTP wrapper -

新機能

これは何?

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.34.tar.gz

abmusersメーリングリストへの加入もどうぞ。

特徴

下記のようにしてantibadmailを利用することでqmail/sendmail/postfixで 簡単に迷惑メールを拒否することができます。

($CONTROLDIR のデフォルト値は /var/qmail/control)

注意: これはウィルススキャナ(チェッカ)ではありません。ウィルスに感 染した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
  1. sendmail/posttfix smtpdをラップするインストール手順
  2. qmail-smtpdをラップするインストール手順
  1. sendmail/posttfix smtpdをラップするインストール手順

    1. smtpデーモンのポート番号を25以外に変更します。 この例では10025番にします。

    2. antibadmailのために、ユーザ(非特権ユーザ)を作成します。

      # groupadd abm
      # useradd -g abm abm
      

      ユーザ名のabmは任意のものでOKです。ここでは、abmユーザ のuidとgidは、それぞれ250と25としておきます。

    3. 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ルー ルを見てください。

    4. メールサーバで受け取るドメイン名の列挙

      もし、あなたのメールサーバで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 メーリングリストで聞いてください。

  2. qmail-smtpdをラップするインストール手順

    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ルール

もし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)のファイルも変更しておいた方が いいでしょう。

badmailデータベースの構築

antibadmailは、`datadir'データベース構造を参照します。datadirは、 maildirに似た構造であり、「ファイルの中の行」の代わりに「ディレクトリ の中のファイル」という形でエントリが存在します。デフォルトでは、 antibadmailは三つのディレクトリを参照します。

プレフィックスの/var/qmail/controlは、実行時に環境変数 の$CONTROLDIRを設定するか、コンパイル時に`CFLAGS=-DCONTROLDIR=/foo/'の ように設定することで、変更できます。

ブラックリスト (Blacklist)

ファイル名は下記のうちのいずれかひとつ。

ヘッダでの拒否

antibadmailのポリシーは「コンテンツ(メールの中身)はチェックしない」 ということです。

しかしながら、SMTPサーバから転送されてきたメール(badmail)に関しては、 そのメッセージヘッダを見ないことには拒否できません。

antibadmailは、メールヘッダのパターンでメールを拒否することができま す。ただ、このヘッダによる拒否は、一度マッチすると救助することが できないという強力なものなのでデフォルトでONになっています。 有効化したいときは antibadmail 起動時に環境変数 HEADERCHECK=0 と します。

HEADERCHECK=0 tcpserver ..... antibadmail .....

ヘッダーチェックがONの場合、 antibadmailは所定のディレクトリからヘッダ用のパターンを 読みます。 ヘッダでの拒否で使用するdatadir構造は、上記のものと若干異なります。 あるヘッダパターンのdatadirは、次のように構成されます。

$CONTROLDIR/badhdrdir/FieldName/EntryName/p*
$CONTROLDIR/badhdrdir/FieldName/EntryName/errmsg

ここでFieldNameはヘッダフィールドの名前をすべて小文字に したもの、EntryNameはパターン集合につける任意の名前です。

例えば、拒否したいメールのヘッダが次のようなものだったとします。

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.

STRING
Pattern lineMeaning
=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
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'のメールを受け取りたいと思うかも知れません。この場合 には、次のようにします。

  1. 拒否パターンをbadmailfromdir/に追加します。。
    # touch /var/qmail/control/badmailfromdir/@hotmail.com
    
  2. PTRレコードが*.hotmail.comに一致するクライアントを許可します。 下記の行を/etc/smtpへ追加し、それをsmtp.cdbへ変換します。
    =.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はこれらの 正しくないサーバからのメールを拒否しますが、特定の受信アドレスに対して 拒否を抑制することが可能です。

下記のようにして「固定受信アドレス」を設定します。

  1. 固定受信者のdatadirを作ります。

    # mkdir /var/qmail/control/soiledrcpttodir
    
  2. 拒否しない受信アドレスのエントリを作成します。

    # mkdir /var/qmail/control/soiledrcpttodir/local-foo@your.domain
    

このようにして、`local-foo@your.domain'へのすべてのメールはパスしま す。

qmailでは、soiledrcpttodirの受け入れ可能なワイルドカードパターンは 次のようになります。

注意: smtpクライアントが送るパラメータが、badhelodirや badmailfromdirやbadrcpttodirのひとつでも厳密に一致(match strictly)する 場合には、この拒否抑制は起りません。

公開迷惑メールデータベース(Public spamdb)

迷惑メールのデータベースを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構造

複数のレコードをひとつのファイルに持つあらゆるデータベースは、常に その複雑さに頭を悩ませています。

  1. ファイルのロック。非現実的な目標です(the goal of `Don Quixote')。
  2. ひとつのファイルの欠損が、すべてのデータを壊します。
  3. アトミックな操作なしにデータファイルを更新することは、ほかの参照 しているものに混乱をきたします。

`Datadir'の構造により、ファイルロックは不要となります。なぜならば、 エンティティのアップデートは、ほかのエンティティの参照なしに行うことが できるからです。すべての追加や削除の操作は、ファイルの作成や削除なので、 自動的にアトミック操作になります。

Antibadmailユーザメーリングリスト

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....

上記の真似はしないでくださいね。:)

出版物など