[ 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/ ディレクトリの中で

cvs -z1 up -Pd

を繰り返せば常に最新版のソースが得られます。自分で改良したい場合は abmusers-ML まで御連絡下さい。cvsアカウントを差し上げます。

ソースコードのスナップショット
antibadmail-1.43.tar.gz

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

特徴

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

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

注意: これはウィルススキャナ(チェッカ)ではありません。ウィルスに感 染したPCの多くは、感染した人のメールアドレスを使用し、悪意のあるファイ ルを送ってきます。antibadmailを導入することで、ウィルススキャナが不要 になるわけではありません。しかし、ウィルススキャナに含まれるコンテンツ フィルタは、常にとても多くのコンピュータ計算資源を浪費します。

antibadmailを使うことで、60-99%の望まないメールを快適に拒否すること ができるでしょう。あなたのメールサーバの資源を節約しましょう!

インストール

antibadmailは、修正版tcpserverから起動します。修正版は ホスト名マッチとIPアドレスマッチ両方を調べて環境変数をセットします。

cvs -d :pserver:anonymous@yatex.org:/qmail \
  co -r paranoid+bsd ucspi-tcp
cd ucspi-tcp
vi conf-home
(インストール先のプレフィックスを設定するためにconf-homeを編集する)
make && make setup check

なお、FreeBSDを利用している場合は以下のようにチェックアウトします。

cvs -d :pserver:anonymous@yatex.org:/qmail \
  co -r paranoid+freebsd ucspi-tcp
  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を次のようにして起動します。

      HOSTANDIP=1 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
    

    これを次のように書き換えます。

    HOSTANDIP=1 tcpserver -u 250 -g 25 -x /etc/smtp.cdb 0 25 \
        antibadmail qmail-smtpd
    

    これだけです。tcpserver を上記修正版に置き換えることを 忘れずに!

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/v*:VAR
$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の受け入れ可能なワイルドカードパターンは 次のようになります。

また、特定のvirtualdomainに閉じたヨゴレ設定ができます。 これには virtualdomain の名前のディレクトリを作り、その中に ヨゴレ受信アドレスやそのワイルドカード、逆にヨゴレリストからの 除外を指定したいローカル部の名前のファイルを作ります。 @example.com というドメインのヨゴレ設定を例に示します。

mkdir /var/qmail/control/soiledrcpttodir/@v.example.com
cd /var/qmail/control/soiledrcpttodir/@v.example.com
touch foo bar- ./-bar-baz ./'!bar-foo'
ls
!bar-foo  -bar-baz  bar-      foo

上記4つの空ファイルを作った場合の、各アドレスの取り扱いは 以下のようになります。

ローカル部spam検査受信? 拒否?
fooなし (免除)受信
bar-bazありspam検査の結果次第
bar-fooなし拒否
bar-anyなし (免除)受信

ファイル名に指定できるパターンは以下のとおりです。

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

存在しない宛先へのメイルの拒否

qmailでは存在しない宛先でもいったん受け取ります。セキュリティ上 これは非常に好ましい動作ですが、spamをよく受けるサーバではランダムな 宛先アドレスで辞書攻撃を食らってエラーメイルが大量に発生します。 これはqmailに限ったことではなく、別のSMTPサーバのセカンダリMXを 受け持っているサーバも事情は同じです。つまり、セカンダリサーバに プライマリサーバ(Best preference MX)宛てのメイルが来た場合、 プライマリサーバ上にメイルアカウントがあるか どうかは分からないのでたらめアドレスでも取り敢えずは受け取ってしまうため セカンダリサーバはspamによるエラーメイルだらけになります。これを いやがってセカンダリサーバの設置をやめてしまうのは非常に後ろ向きな 対処です。

antibadmail はqmailサーバでも、セカンダリサーバでも、実在しない宛先 のメールを拒否できます。

挙動を決める環境変数

When each variables in this table is set, antibadmail alter the action. These variables can be set via antibadmail start-up script or tcpserver according to client's IP-address/hostname.

VariableAction when setNegation
RELAYCLIENT
RELIABLECLIENT
Accept all message except when the client sends seriously bad parameter.no
CHECKHELODOMAIN
CHD
Expect HELO paramter has correct DNS recordyes
REJECTNODOTHELO Reject HELO without dots.yes
REJECTIPINHELO Reject HELO which contains client IP address that is presumably hostname with dynamically allocated IP address.yes
PERMIT_STATIC In the case of REJECTIPINHELO, permit if client's PTR-record has substring "static".yes
PASSKNOWNNODOTHELO By default, antibadmail rejects no-dot HELO from unknwon host. Set this variable when overlook it.yes
PASSUNKOWNIPHELO By default, antibadmail rejects IP-address formed HELO from unknown host. Settng this variable passes it.yes
NOMFDCHECK Stop MAIL-FROM domain check.yes
PERMIT_NXRCPT By default, antibadmail disconnect session when clients sends non-exixtent RCPT for protection from `random dictionary attack'. When a good user sends to multiple recipients with some of them misspelled, the SMTP session will end in rejection. To rescue this, set this variable. But it is subject to dictionary attack. yes
BADHOSTReject.yes
NOTERM Keep SMTP session after it is proved to be spam.yes
QUICKREJECT Reset TCP quickly before all SMTP parameters are accepted. yes

Negating effect of each variable can be accomplished by set its value to "0".

迷惑メールサーバ公開データベース(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....

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

出版物など


82046
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]