連載
» 2001年11月06日 00時00分 UPDATE

実用qmailサーバ運用・管理術(3):SPAMメール徹底対策 (2/3)

[鶴長鎮一,@IT]

対SPAMプログラムの利用

qmailの受信拒否リスト対応

 どうしても、設定の調整だけでは賄い切れない問題があります。先ほどの/var/qmail/control/badmailfromでは、事が起こるたびに対処を強いられることになります。これは、毎日のようにbadmailfromの編集を行うことを意味します。

 世界のメールサーバ管理者が、毎日同じような作業を行うのも非効率的です。そこで、共通のリストを作成して共有しようというのがMAPS RBL()です。このリストを利用してqmailで受け取り拒否を行うには、「rblsmtpd」を利用します。

注:Mail Abuse Prevention System Realtime Blackhole Listhttp://mail-abuse.org/

 rblsmtpdはucspi-tcp-0.88パッケージに含まれており、実はtcpserverをインストールした際にrblsmtpdも/usr/local/bin/rblsmtpdにインストールされています。ですから、新たにインストール作業を行う必要はなく、起動スクリプトに変更を加えるだけで使えます。第1回の最後で紹介したqmailスクリプトの該当の個所に、下記のような修正を加えます。

tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb \
    0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
修正前

tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb \
    0 smtp /usr/local/bin/rblsmtpd /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
修正後

 また、Mail Abuse Prevention System LLC(http://mail-abuse.org/)にはMAPS RBL以外にも、ダイヤルアップ経由で送信されるSPAMメールの受け取り拒否を目的にしたMAPS DULフィルタ(http://mail-abuse.org/dul/)や、不正中継を許可しているメールサーバ経由で送信されたSPAMメールの受け取り拒否のためのMAPS RSS(http://work-rss.mail-abuse.org/rss/)があります。

 受信拒否リストには、MAPS以外にORDBhttp://ordb.org/)があります。これは、何度か形態を変えながら続いてきたORBSから派生したものです。こちらのリストを使用する場合は、下記のように参照サーバをORDBのものにします。

tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb \
    0 smtp /usr/local/bin/rblsmtpd -r relays.ordb.org /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
修正後

iftoccを利用したフィルタリング

 次に、「mess822」の「iftocc」を使ってみましょう。mess822は、もともとメッセージを解析するためのツール群です。例えば、「822date」はメールからDateフィールドを抜き出し、「822header」は全ヘッダフィルードを取り出します。

 今回利用するiftoccは、所定のあて先がToやCcに含まれているかどうかの判定を行います。メールを送信するには、ToやCc、Bccいずれかのフィールドに相手のメールアドレスを記入する必要があるのはご存じだと思います。そこで、iftoccを使って自分あてのメールなのか否かを、ToまたはCcフィールドに自分のメールアドレスが指定されているかどうかで確認します。SPAMの中にはBccフィールドを利用して送信しているものがあるので、それを逆手に取ってフィルタを掛けるわけです。

 ではiftoccの導入手順です。ftp://ftp.jp.qmail.org/qmail/からmess822-0.58.tar.gzをダウンロードし、/usr/local/bin/にインストールします。

$ tar xvzf mess822-0.58.tar.gz
$ cd mess822-0.58
$ make
# make setup check

 フィルタを掛けるためには、各ユーザーのホームディレクトリに.qmailファイルを作成します。.qmailファイルは、ユーザー単位で配送方法を細かく制御するためのドットファイルです。sendmailの.forwardファイルと同様、転送やプログラムの起動も可能ですが、フォーマットは.forwardと異なるので注意が必要です。まず次の点を押さえておきましょう()。

  1. コメントは「#」で始める
    例:# this is a comment
  2. プログラムは「|」で始める
    例:| qbiff
  3. 転送は「&」で始める
    例:&someone@example.jp
注:qmailファイルの詳細については、http://www.jp.qmail.org/q103/jman5/dot-qmail.htmlを参照してください

 では、.qmailファイルを利用して実際に「To/Ccフィールドに自分のメールアドレスがなかった場合、つまりBccで送られてきた場合はメッセージ『I accept neither Bcc or ML』を相手に送り返し、To/Ccで送られたメールは受信する」ようにしてみましょう。

#vi .qmail
|/var/qmail/bin/bouncesaying 'I accept neither Bcc or ML' except /usr/local/bin/iftocc
./Maildir/

 /var/qmail/bin/bouncesayingは、

bouncesaying 'メッセージ' 判定条件

のように使用します。ここでは、iftoccをフルパスで指定して実行させます。exceptが付いているため、iftoccの結果の逆を判定結果として/var/qmail/bin/bouncesayingに渡します。つまり「To/Ccフィールドに自分のアドレスが含まれなかったら」が条件になり、その条件に合った場合は/var/qmail/bin/bouncesayingが実行され、指定されたメッセージが送り返されます。To/Ccフィールドに自分のアドレスが含まれていた場合、1行目は無視されて2行目が実行されます。すなわち、通常のメールとして./Maildir/に保存されます。

 では実際に、メールソフトで上記の設定を施したメールアドレスに対して別のメールアドレスを使い、Bccでメールを送信してみましょう。すると、次のようなエラーメールが戻ってくるはずです。

Hi. This is the qmail-send program at [サーバ名].
I'm afraid I wasn't able to deliver your message to the following
addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<送ったメールアドレス>:
I accept neither Bcc or ML (ここに指定したメッセージが入る

--- Below this line is a copy of the message.
(省略)

 しかしながら、この場合はメーリングリストからのメールも拒否されます。では「メーリングリストもちゃんと受信できる」ようにするにはどうしたらよいでしょうか? この場合はiftoccの引数にメーリングリストのアドレスを指定します。

#vi .qmail
|/var/qmail/bin/bouncesaying 'I accept neither Bcc or ML' except /usr/local/bin/iftocc メーリングリストで送られるアドレス 自分のアドレス
./Maildir/

 自分のiftoccに引数を渡した場合は、自分のアドレスも明示的に指定することを忘れないでください。また、ドメイン名は大文字・小文字にかかわらず、アドレスとして一意に解釈されます。

 次に「To/Ccに自分のアドレスがないもの(つまりBccで送られてきたもの)は指定されたアドレスに転送し、それ以外を受け取るようにする」場合の.qmailを見てみましょう。

#vi .qmail
|/var/qmail/bin/condredirect 転送先のアドレス except /usr/local/bin/iftocc
./Maildir/

 ここでは、/var/qmail/bin/condredirectを使用しています。condredirectは次のようにして使います。

condredirect 転送先のアドレス 判定条件

 判定結果が「0」を返した場合、condredirectはメール文を転送先のアドレスに転送し、以降の行は実行しません。判定結果がそれ以外(「111」を返すという条件もあります)なら、condredirectは「0」を返して以降の処理を続けます。 間違っても転送先のアドレスに自分のアドレスを指定しないでください。自分のアドレスを指定した場合、メールは送信サーバと受信サーバの間をループします(実際には、qmailの「loop」を防ぐ機能によりループはしません)。

 これで、Bccで送信されてきたものは転送され、それ以外はMaildirで受け取ります。

 逆に、「Bccで送られてきたものは受け取り、To/Ccで送られてきたものは転送する」ようにするには、

#vi .qmail
|/var/qmail/bin/condredirect 転送先のアドレス /usr/local/bin/iftocc
./Maildir/

とします。では、「To/Ccに自身のアドレスがないものをゴミ箱行きにする」場合を見てみましょう。ゴミメールを集めるためのファイルを/各ホームディレクトリ/Maildir/trushとします(自動で生成されるので、作成する必要はありません)。

|/var/qmail/bin/condredirect 転送先のアドレス /usr/local/bin/iftocc
/各ホームディレクトリ/Maildir/trush

 trushはディレクトリでなく、mbox形式のファイルであることに注意してください。これで、Bccで送られてきたものはtrushファイルへ、To/Ccで送られてきたものは転送先のアドレスへ転送します。ゴミメールを蓄える必要がなく、そのまま削除しても構わない場合は次のようにします。

#vi .qmail
/var/qmail/bin/condredirect 転送先のアドレス /usr/local/bin/iftocc
/dev/null

 これで、Bccで送られてきたものはtrushファイルへ残しもせず削除、To/Ccで送られてきたものは転送先のアドレスへ転送します。

 しかし、これでは転送か削除処理のどちらかが行われるだけで、送られたユーザーのMaildirには1通のメールも残りません。それなら、逆にゴミメール専用のあて先を作り、公開されたメールアドレスでは通常どおりメールを受け取るようにした方が実用的です。そこで、「Bccで送られてきたものはゴミ箱へ、To/Ccで送られてきたものを受け取る」ようにする場合を見ていきましょう。

 まずゴミ処理用アカウントを作ります。ここでは例として「trush」とします。trushユーザーのホームディレクトリの.qmailには、「#」とだけ記述します。これは無条件に削除することを意味します。次に受け取りたいユーザーの.qmailを下記のようにします。

#vi .qmail
|/var/qmail/bin/condredirect ゴミ処理ユーザー except /usr/local/bin/iftocc
./Maildir/

 以上で完了です。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。