ANTI BAD Mail!

    [ English / Japanese ]

# - Anti bad-mail SMTP wrapper -

注意: 訳しきれていません。完全なドキュメントは英語版を参照して下さい。

## 新機能

- REJECTIPINHELO変数がセットされているときはHELO文字列にそのホストの IPアドレスの数値が含まれている場合に受取拒否する(1.38)
- PERMIT_NXRCPT変数がセットされているときはRCPT TOに存在しないアドレ スが含まれていても残りのRCPT TOが正しければ配送する(1.36)
- ヘッダによる拒否パターンで正規表現が使用可能に(1.33)

## これは何?

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

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

## 特徴

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

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

- badhelo 拒否

  $CONTROLDIR/badhelodir/ディレクトリにあるファイル名に一致する 名前を、HELOのパラメータとして送ってきたホストからのメールを拒否 します。また、. (ドット)から始まるエントリは、ワイルドカードとし て扱われます。

  偽ったIPアドレスをHELOのパラメータとして使用して、迷惑メール を送ってくる場合もあります。これらのほとんどは迷惑メールです。こ のメールを拒否します。

  unknown-host(IPアドレスに対応するPTRレコードが登録されていない ホスト)に対しては、より厳密な下記のHELOメッセージチェックが行な われます。

  HELOのパラメータに「.(ドット)」が含まれていない場合は 迷惑メールと見なします。

  unknown-hostからのHELOパラメータに対して、より広範囲なワイル ドカードマッチング(例: `.jp')が適用されます。 $CONTROLDIR/badhelodir/unknown/ディレクトリに、ワイルドカードパ ターンをファイル名として、空ファイルのファイルを作ります。

  環境変数REJECTIPINHELOがセットされている場合は、HELO文字列に IPアドレスの4つの各オクテット値が全て含まれているときに 受信を拒否します。これは動的IPアドレスからのspamを拒否する 場合に効果的です。変数に1から3までの整数nを代入すると、 その数だけ先頭のオクテットを飛ばし末尾の4-n個の オクテット値だけを探します。

  上記のいずれの場合においても、qmailのルールと同様に $RELAYCLIENT か $RELIABLECLIENT がセットされている場合には、badhelo チェックはされません。

- badmailfrom 拒否

  badhelo拒否と同様に、MAIL-FROM アドレスで拒否することができま す。$CONTROLDIR/badmailfromdir/に拒否したいメールアドレスを置く ことで実現できます。「@」から始まるパターンは当該ドメインのすべ てのメールアドレスを意味します。「.(ドット)」から始まるパターン は、そのドメイン下のすべてのドメインに一致します。

      (例)
      @hotmail.com      -> すべての *@hotmail.com アドレスに一致します
      .biz              -> すべての *@*.biz アドレスに一致します

  ランダム@hotmail.comと言ったアドレスからの非常に多くの迷惑メー ルがあることに気付くでしょう。そのときに、すべての @hotmail.com のメールを受信をあきらめるのは賢い選択です。 え、やりすぎだと思いますか?? では次を読んでください。

- $GOODMAILFROM 許可されたMAIL-FROMドメイン

  tcpserverのルールファイルの中で、GOODMAILFROMに受け入れを許可 するドメイン名を設定します。この変数にリストアップされたドメイン は、`$CONTROLDIR/badmailfromdir/`のリストに含まれてい たとしても受け入れられます。この特徴により、正規のhotmailサー バから@hotmail.comのメッセージを受け取りつつ、偽物の @hotmail.com をすべて拒否することができます。 これを行なうためには、

      =.hotmail.com:allow,GOODMAILFROM="@hotmail.com"

  をtcpserverのルールに書き`badmailfrom`データベースに @hotmail.com を入れます。ただしこの場合antibadmailを-Hオプションを *つけずに* 起動します(-Hオプションはリモートホストの逆引きをしないオ プション)。

- $GOODHELO 許可されたHELOパラメータ

  $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"

  このような行を tcpserver のルールファイルに追加することで、 頭を悩ませるようなサーバからもメールを受け取ることができます。

- ドメイン部がない送信者からのメールを拒否

  bounceメッセージやRELAYCLIENTからのメッセージを除き、 ローカルパートのみの送信者を持つメールを拒否します。

- 複数の受信者(rcptto)へ送ろうとする、バウンスメールの偽装を拒否

  bounceメールにはnull送信者が使われます。迷惑メールを送信する サーバによっては、null送信者を使い複数の受信者へメールを送ります。 これはspamの手口です。 antibadmailは、null送信者から送られてきたメールが、複数のRCPT TO(受信者)アドレスを要求したら、そのメールを拒否します。

- 信頼できるLANのホスト

  $RELAYCLIENT や $RELIABLECLIENT を設定してある場合、MAIL-FROMド メインチェックはキャンセルされます。これは、信頼できる メールサーバからのバウンスメールを受け取るのに役立つでしょう。

- 特定のサーバから来るメールのMAIL FROMドメイン限定

  以前使っていた古いメールアカウントを持っているならば、そのメー ルを今使っているメールサーバへ転送したくなるでしょう。 このような場合、「転送されてきたメールは迷惑メールでいっぱい」 ということはありませんか。なぜならば、転送メールを受け取るメールサーバは、 メールを転送してくるサーバを信頼するので、転送されて来る迷惑メールも 素通しすることになるからです。 この問題に対処するため、antibadmailは、$PASSONLY に列挙されたホストを 除くすべての転送されてきたメールを拒否します。古いサーバから転送 されてくるメールを、*.jpと*.orgドメインに制限したいならば、下記 をtcpserverのルールファイルへ記述してください。

      =old.server.previously.used:allow,PASSONLY=".jp/.org"

- badrcptto

  $CONTROLDIR/badrcpttodir/に列挙されたRCPT-TO受取人アドレスを 拒否します。

- $BADHOST 拒否

  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レコー ドを返したとしても受け取ります。

- SMTPクライアントのアドレスブロックに対するPTRレコードの要求

  多くの場合、迷惑メールを送ってくるコンピュータは、(IPアドレス の逆引きホスト名が登録されていない)unknownホストです。この unknownホストからのメールを拒否するのは賢い方法です。 しかし、実際には、受け取りたいメッセージの多くもunknownホストか ら送られてきます。正しいDNSの設定の重要性を認識していないメール サーバの管理者がいるのです。

  そこで、聞き慣れない国のIPアドレスブロックだけに対して PTRレコードを要求した方がよいでしょう。もし、あなたや あなたのサイトのユーザ全員が、あるAAAという国の人とメールの やり取りをする必要が乏しい場合に、 `XXX.YYY.*.*' というIPアドレスブロックがAAA国のものと 分かっているのであれば 下記のような設定を tcpserver のルールファイルへ追加します。

      XXX.YYY.:allow,REQPTR=""

  この設定により、XXX.YYY.*.* のアドレスブロックのうち、PTRレコー ドが設定されていないホストからの通信はすべて拒否されます。 もちろんPTRレコードがあれば拒否しません。

- Require correct FQDN HELO for some address block of SMTP client

  In most case, polite SMTP clients send correct FQDN as HELO parameter. But not all. So, we can not reject all connections that send wrong HELO parameter even if it is effective.

  Requiring correct FQDN HELO can be partially activated against clients when environment variable CHECKHELODOMAIN is set.

      =*.ppp.example.net:allow,CHECKHELODOMAIN=""

  This rule request correct FQDN HELO for clients whose PTR record matches with `*.ppp.example.net`.

  Note that it is bad idea to apply CHECKHELODOMAIN to very wide range because some `good honest' clients don't send correct FQDN. Apply this for block that is apparently allocated to end-user. This rule is weeker than you imagine, because most decisions of rejection are done by other rules before this rule is applied.

注意: これはウィルススキャナ(チェッカ)ではありません。ウィルスに感 染した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/badhelodir/`

  SMTP-HELOで拒否するパターンをファイル名に持つファイルを保持し ます。

- `/var/qmail/control/badmailfromdir/`

  エンベロープ送信者(SMTPのMAIL FROM アドレス)で拒否するパター ンをファイル名に持つファイルを保持します。

- `/var/qmail/control/badrcpttodir/`

  エンベロープ受信者(SMTPのRCPT TO アドレス)で拒否するパターン をファイル名に持つファイルを保持します。

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

### ブラックリスト (Blacklist)

ファイル名は下記のいずれかの形式とします。

- nameの形式

  badhelodirとbadmailfromdirとbadrcpttodirでは、 `name'と同じパラメータを送ってきたすべてのクライアン トを拒否します。

- .nameの形式

  badhelodirとbadmailfromdirでは、パラメータとして送ってきたド メイン名が`.name'で終わる場合に、すべてのクライアント を拒否します。つまり、`*.name'というワイルドカードでのマッチング になります。

- @nameの形式

  badmailfromdirでは、`@name'と同じパラメータを送っ てきたすべてのクライアントを拒否します。つまり、`*@name'というワ イルドカードでのマッチングになります。

### ヘッダでの拒否

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はパターン集合につける任意の名前です。

- パターンを表す`p*'ファイル

  `p'から始まるすべての名前のファイル名は、FieldName の値と比較される固定文字列として評価されます。ひとつのパターンは 一行に書きます。パターンを複数行書くとAND条件と見なされ、1行分 のパターンがマッチしたら残りの部分と次のパターン行が照合されます。 別のファイルにあるパターンはOR条件と見なされます。

- 環境変数 VAR がセットされている場合のみ検査される `v*:VAR' ファイル

  `v' で始まり `:VAR' で終わるファイルは環境変数 `VAR' がセットされている場合のみ評価されます。おそらく `$REQPTR` (上述)をセットしている対象ホストはなじみのない国からのものなので、 国内からのものよりずっと厳しくヘッダチェックをしたくなるはずでしょう。 そのような場合 `v-hogehoge:REQPTR` のような名前のファイルに きびしめのパターンを書いておくとよいでしょう。

- `errmsg'ファイル

  クライアントが送ってきたヘッダがパターンに一致したときに、 クライアントに送られる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' メールを受け取りたいと思うでしょう。 この場合には、次のようにします。

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

- `local-@your.domain`

  ローカルパート(メールアドレスのドメイン名以外の部分)が`-'で終 わるときには、すべての`local-*@your.domain'をパスします。

また、特定の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 | なし (免除) | 受信

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

- - で終わるファイル

  その名前で始まる拡張アドレス(qmail)をすべて受け取る

- - で始まるファイル

  その名前をヨゴレにしない

- ! で始まるファイル

  その名前は即座に受信拒否

- ALL

  いずれのファイル名にもマッチしない宛先をすべてヨゴレにする

- その他任意の名前

  その名前をヨゴレにする(ALLがある場合はあまり意味ない)

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

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

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

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

- プライマリサーバ(qmail)で運用する場合

  antibadmailが自動的に宛先チェックを行ないます。ただし、 `alias'ユーザを含めた各ユーザのホームディレクトリにある dot-qmail ファイルがあるかどうか、 `/var/qmail/control/virtualdomains`, `/var/qmail/users/assign` ファイルの中味を検査するので、 antibadmailプログラムの動作するuidでこれらのディレクトリや ファイルが読めることを確認して下さい。vpopmailを使っていると dot-qmail を置くディレクトリを other に対して読めなくしている ことが多いので、少なくとも chmod o+x しておいて下さい。

- セカンダリサーバで運用する場合

  特定の宛先アドレスがプライマリサーバにあるかを調べるプログラムを 導入します。ソース配布の `./qserver/` ディレクトリに そのクライアント/サーバプログラム。クライアントプログラムを セカンダリサーバに置き、サーバプログラムをプライマリサーバで 動かしておきます。以下の例は `@example.com' のプライマリサーバが 192.168.1.11 であると仮定した場合の導入手順です。

  - サーバプログラム(プライマリサーバで)

    現状ではプライマリサーバガqmailを使っている場合の アカウントチェックプログラムのみがあります(sendmailや postfixはqmailよりは簡単なはずなので需要があればすぐ 作れるはずです)。ucspi-tcp(tcpserver)が既に インストールされているものとします。

    1. `cd qserver; make`

    2. クライアント(セカンダリサーバ)のIPアドレスを LOCAL.tcprule ファイルに追加し再度 make します。

    3. `./run`

    daemontools を動かしている場合はrunスクリプトを 手動で動かさずに、

        ln -s $PWD /service

    とする方がよいでしょう。

  - クライアントプログラム(セカンダリサーバで)

    1.     cd qserver
           make all install
           mkdir $CONTROLDIR/rq

    2. メイルドメインと同じ名前のファイル `$CONTROLDIR/rq/example.co.jp` を作り 以下の内容にします。

           #!/bin/sh
           rq 192.168.1.1

  サーバ上で run スクリプトが正常に機能しているか 確認しましょう。

      secondary% telnet 192.168.1.1 9999
      Trying 192.168.1.1...
      Connected to tmax.
      Escape character is '^]'.
      foobarbazhogehoge
      NG
      root
      OK Maybe

  セカンダリ側で動かしている antibadmail は、プライマリサーバの run スクリプトに接続できないときは、たとえ実在しないものでも メイルを拒否しません。事前によく確認して下さい。

## 挙動を決める環境変数

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.

Variable | Action when set | Negation
--- | --- | ---
`RELAYCLIENT` RELIABLECLIENT | Accept all message except when the client sends seriously bad parameter. | no
`CHECKHELODOMAIN` `CHD` | Expect HELO paramter has correct DNS record | yes
`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
`BADHOST` | Reject. | 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....

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

## 出版物など

- Implementation and Verification of SMTP Wrapper for Spam Rejection - IPSJ Sig.DSM #35@Akita University
- 迷惑メイルからの保護(仮) - ソフトバンクパブリッシング UNIXUSER 2004年11月号 第1特集 Part4