SEEDS Creator's Blog

qmailでbackscatter対策を行う

qmail環境でのbackscatter対策について。

以下のページを参考しました。 Stray Penguin - Linux Memo (qmail) - http://www.asahi-net.or.jp/~aa4t-nngk/qmail.html

qmailではローカル配送時に「存在しないメールアドレス」だった場合に 「正常にメールが配信できなかった」旨を送信元へ連絡します。

[code] (例) ①メールサーバーAはhoge.comというドメインのメールアドレスを管理している ↓ ②abcde1234@hoge.com など、存在しないメールアドレス宛にメールが送信されてきた ↓ ③メールサーバーAは「そんなメールアドレスないよ」と送信元へ通知(バウンスメール) [/code]

メールアドレスを打ち間違えて送信した場合などにバウンスメールが返ってくると間違いに気づく事ができるなどメリットはたくさんあるのですが、スパム配信者など悪意ある送信者の場合、メールアドレスがあるかないかに関わらず手当り次第にメールを送ってくる事があります。

このようなスパム配信者の送信元メールアドレス(リターンパス)は基本的には偽装されており、実際には「存在しないメールアドレス」が設定されている事がほとんどです。メールサーバーAはバウンスメールの送信がタイムアウトになるまで接続を試みる状態となってしまい、結果、キューにメールが溜り続け、メールサーバーはサービスを提供できない状態となってしまいます。

最近ではスパム業者はわざと存在しないメールアドレスへ送信し、送信元やリターンパスを真に送信したいアドレスと設定する事で、バウンスメール送信させる事を目的としている挙動も見られました。このような攻撃をされた場合、最悪の場合はRBL(ブラックリストサーバー)などに登録される恐れもあります。

このように、メールの仕様を逆手にとった攻撃が「backscatter攻撃」で、非常にむかつく攻撃です。 この問題に対応するために行った様々な対策です。

[対策1 バウンスメールを返さない設定にする]

簡単な対策としては、バウンスメールをまったく返さないという設定とする事が考えられます。qmailでは.qmail-defaultというファイルで存在しないメールアドレス宛のメールの挙動を決定しています。存在しないメールアドレス宛のメールを破棄する場合は.qmail-defaultを以下のように編集します。以下の例はvpopmailにて管理してるバーチャルドメインでの.qmail-defaultの例です。

[code] vi .qmail-default

| /var/vpopmail/bin/vdelivermail '' bounce-no-mailbox ↓ | /var/vpopmail/bin/vdelivermail '' delete [/code]

このように設定する事でバウンスメールでキューがたまってにっちもさっちもいかなくなる事はなくなりました。ただこの設定を行うと、宛先アドレスを入力ミスしただけの場合でもバウンスメールは帰ってこない為、メールが届いていないのに届いていると誤解されてしまう恐れもあるので、設定の際は注意して下さい。

[対策2 badmailfromで差出人のメールアドレスでsmtpの時点で拒否する]

上記の対策だけでメール破棄が行われてるわけですが、qmail的にはすべて受け取っている事と同じです。そのため

・スパム業者は「なんでもメールおくれるなーこのサーバー。どんどんやったれ」と思われてどんどん数が増えてくる ・配送を行うプロセスを踏むのでSMTP配送の負荷がかかり、ひどいときにはSMTPに遅延が発生しはじめた

という問題が出てきました。 そこでqmailへの配送前の時点で破棄するようなルールを設定しました。特にqmailの再起動をする必要もなく、以下のファイルを作成しメールの受信を拒否する発信元アドレスを記述するだけで設定できます。 [code] /var/qmail/control/badmailfrom [/code] 以下のような書き方を行うと特定ホスト(hogehoge.com)からのメールを拒否します [code] @hogehoge.com [/code]

[対策3 差出人/送信先のメールアドレスを正規表現で設定しsmtpの時点で拒否する]

上記の対策2では送信元メールアドレスやホストが一定である必要があり、さまざまなメールアドレスからの送信されてきた場合はお手上げでした。また、[ランダム文字列@yahoo.co.jp]など、有名メールサービスのメールアドレスを詐称された場合、ドメイン単位での拒否を行う事はサービス上できないという問題も発生しました。

そこでqmailに新たな機能を追加する為にqregex というパッチを導入しました。このパッチでは以下の機能がqmailに追加されます。 qregex配布元 The Arda Network - http://www.arda.homeunix.net/index.html

[code] ・badmailfrom の送信元を正規表現で記述できる ・badmailto と呼ばれるbadmailfromの逆の動作(送信先で拒否)を行う機能が追加 ・badmailto でも正規表現は記述可能 [/code]

送信元メールアドレスに比べて送信先のメールアドレスは基本的に特定のドメインに集中する為、大きな成果をあげる事ができそうです。

導入方法

以下のサイトからパッチを取得してqmailにパッチをあてます [code] cd /path/to/qmail-1.03/ wget http://www.arda.homeunix.net/store/old_software/qregex-20040601.patch patch < qregex-20040601.patch [/code] この際、すでにsmtpd-authなどのパッチを充てていた場合はMakefileqmail-smtpd.cなどで競合が起きてパッチが正常終了しません。正常終了しなかった部分は*.rejというファイルが出力されますのでそちらを見ながら手動でソースを編集する必要があります。

修正が終わったらインストールを実行。すでにqmailが起動している場合は落としておいて下さい。 [code] make clean make make setup make check [/code] インストール後、qmailを起動したら以下のファイルへメールの受信を拒否する送信先アドレスを記述するだけで設定できます。 [code] /var/qmail/control/badmailto [/code] [code] [a-z]+[0-9]+@hogehoge.com [/code] 例えば上記のように記述すると英字+数字@hogehoge.com という送信先のメールはすべてsmtp接続時点で拒否する事ができるようになります。またこのパッチを充てたことで[対策2]でお伝えしたbadmailfromも正規表現によるフィルタが可能となります。

最後に

qmailはシンプルでバグも見られずとてもよいMTAなのですがITの進歩と共に追加されてきた機能などを追加するときはどうしてもパッチのつぎはぎになってしまうのが難点ですね。

今回、qregexというパッチを使用しましたが、vpopmail環境の場合はchkuserパッチというものも存在し、こちらはsmtp時点でメールアドレスが存在するか確認できるパッチのようですのでまた検証してみたいと思います。

chkuser 2.0 - http://opensource.interazioni.it/qmail/chkuser.html

Postfixではデフォルトの機能でbackscatter対策が可能なようです

Postfix 後方散乱 Howto http://www.postfix-jp.info/trans-2.1/jhtml/BACKSCATTER_README.html