このプログラムは、qmailのsmtpプログラム(qmail-smtpd)を実行される直前にこのプログラムを実行して、 スパム送信元らしいホストの接続を拒否します。qmail用のホスト選択式スパム対策ソフトです。
このプログラムは拒否するホストの判定にgreylistingというメール再送を要求するアルゴリズムを使用します。(スパマーは早く大量にメールを送信したいので再送信を嫌がり、再送信しません。)
しかし、このgreylistというアルゴリズムだけでは副作用が大きすぎますので、 S25R(選択的SMTP拒否)というアルゴリズムを使用して、スパマーがよく利用する 動的IPアドレスらしいホストのみをgreylistingの対象とするようにします。
また、tarpit(SMTP接続時に意図的に応答を遅らせる)を実施することにより、 スパム送信元ホストの接続を拒否します。(スパマーは早く大量にメールを送信したいので、 応答遅延を嫌がり自ら切断します)
このプログラムはperlスクリプトで実装されています。qmailやその関連ソフトウェアにパッチを適用する方式ではありませんので簡単に導入できます。
このプログラムは佐藤 潔 様の考案された「taRgrey - S25R + tarpitting + greylisting」(Postfix用)のアルゴリズムを参考に、同じく佐藤様の「Qgrey - S25R + qgreylist パッチ」(Qmail用)を参考に、ホスト名ベースのホワイトリスト・ブラックリスト、tarpitting(応答遅延)を追加する形で作成しています。
佐藤様に感謝です。 またS25Rを考案された浅見様にも感謝です。またバグ報告、新機能の提案を提供くださいました皆様にも感謝です。
機能ごとに、その機能を有効にするか無効にするかを切り替えるスイッチがついています。
ここに定義したホストは無条件でqmail-smtpdに引き渡します(拒否しません)。 IPアドレスベースのものとホスト名ベースのものがあります。ホスト名ベースのものは正規表現を使用することができます。
プロバイダから割り当てられたホスト名を使用する正規のメールサーバーや S25Rの条件に該当してしまう正規のメールサーバーをこのホワイトリストに登録することにより greylistの罠に嵌るのを防ぎます。
ここに定義したホストは無条件で接続を切断し拒否をします。正規のメールサーバーのような振舞いをするスパム送信元ホスト等を定義します。 IPアドレスベースのものとホスト名ベースのものがあります。ホスト名ベースのものは正規表現を使用することができます。
ブラックリストにスパム送信元ホストを登録することにより、初回接続から2分から1日の間隔(greylistのデフォルト設定)で再送信してくるホストのメール送信を除外できます。(手動登録)
SMTP接続時に意図的にSMTPグリーティングの応答を遅らせます。スパムを送信するホストはメールを大量送信するため応答の遅延を嫌がり切断します。
スパムを送信するホストは動的IPアドレスという前提で 動的IPアドレスらしいホスト名を持つホストと持たないホストを振り分けます。 動的IPアドレスらしいホスト名を持たないホストは接続が許可されます。 動的IPアドレスらしいホスト名を持つホスト(逆引きできないホストも含む)は 後の処理(ここではgreylist・tarpit)に任されます。
副作用の大きいgreylist処理の対象を減らします。
メール送信ホストの初回接続時にqmailの代わりにこのプログラムが応答し、そのホストに対して再送要求させます(ダミー応答)。 その後、再送してきたホストの接続を許可してqmail-smtpに連携します。 但し、すぐに再送してきたホストは拒否します。 (接続情報(IPアドレス、接続時間)をgreylistで管理します)
スパマーは他のホストにメールを送信することを優先するので再送しないことが多いです。故にこれにてスパムを防ぐことができるかもしれません。
SMTPの仕様外のコマンドを要求して様子を見るホストの接続を拒否し、greylistへの登録をキャンセルします。 そのことにより、このホストからの接続を拒否します。
また、HELOでホスト名を名乗らずにすぐにQUITを発行するホストと、HELOの直後にすぐQUITを発行するホストの接続を拒否し、greylistへの登録をキャンセルします。
接続ホストがHELOコマンドで名乗るホスト名を調べます。greylistingの ダミー応答中のみ実施します。(接続ホストの情報がgreylistに 登録されるときのみ実施。greylistによる接続許可が承認されたホストに 対しては、この機能は効きません。)
ここに定義したHELOホスト名を名乗ったホストの接続を切断して拒否します。
さらにそのホストのgreylistの登録をキャンセル(削除)します。
ホスト名の登録に正規表現を使用することができます。
また、同時にIPアドレスを正規表現で指定することで拒否するホストを限定することもできます(ver1.1追加)。
スパム送信元ホストが特徴あるHELOホスト名を名乗る場合に有効です。
HELOコマンドで名乗るホスト名がFQDNになっているかをチェックします。(実装は上記の「HELOホスト名ブラックリスト」の条件で行ってます) FQDNでない場合、ホストの接続を切断して拒否し、さらにgreylistの登録をキャンセル(削除)します。
正しくないHELOホスト名を名乗るホストに有効です。(スパム送信ホストはFQDNでないHELOホスト名を名乗ることがあります。「localhost」やWindowsのコンピュータ名など。)
HELOコマンドで名乗るホスト名のドメインと、実際の逆引きホスト名のドメインが一致するかチェックします。 一致しない場合、ホストとの接続を切断して拒否し、greylistの登録をキャンセル(削除)します。
正しくないHELOホスト名を名乗るホストに有効です。
HELOコマンドで名乗ったホスト名がIPアドレスだったときに、接続元IPアドレスと比較して異なれば、そのホストとの接続を切断して拒否し、greylistの登録をキャンセル(削除)します。
正しくないHELOホスト名を名乗るホストに有効です。
| 順 | 機能 | 処理内容 | その他 |
|---|---|---|---|
| 1 | greylist | greylistからしばらくアクセスがないホストの記録を削除 | |
| 2 | 接続ホストがリレークライアント→許可 | ||
| 3 | 接続ホストがホスト名ベースホワイトリストに登録されている→許可 | ||
| 4 | 接続ホストがIPアドレスベースホワイトリストに登録されている→許可 | ||
| 5 | S25R | 接続ホストのホスト名がS25Rの条件に該当しない→許可 | |
| 6 | 接続ホストがホスト名ベースブラックリストに登録されている→再送要求(拒否) | ||
| 7 | 接続ホストがIPアドレスベースブラックリストに登録されている→再送要求(拒否) | ||
| 8 | greylist | 接続ホストがgreylistに登録されていない→8-1へ 登録されている→9へ | |
| 8-1 | tarpitting | tarpitting(指定秒数待つ) (オプションで待てたら→許可 も可) (待てない→接続ホストが自ら切断) | |
| 8-2 | greylist | 接続ホストをgreylistに登録 | |
| 8-3 | greylist | SMTPダミー応答 | |
| 8-4-1 | 接続ホストがHELOで名のったホスト名がブラックリストに登録されている。またはHELOホスト名がFQDNでない。→qreylistから登録を削除&再送要求(拒否) | ||
| 8-4-2 | original | 接続ホストがHELOで名のったホスト名がIPアドレスで、かつ実際の接続元IPアドレスと異なる。→qreylistから登録を削除&再送要求(拒否) | ver1.1追加 |
| 8-4-3 | 接続ホストがHELOで名のったホスト名のドメイン部分が逆引きホスト名のドメイン部分と異なる→qreylistから登録を削除&再送要求(拒否) | ||
| 8-4-4 | original | SMTPコマンドの発行数が一定以下→qreylistから登録を削除&再送要求(拒否) | ver1.2追加 |
| 8-4-5 | original | SMTPで未定義のコマンドの発行数が一定以上→qreylistから登録を削除&再送要求(拒否) | ver1.2追加 |
| 8-5 | greylist | →再送要求(拒否) | |
| 9 | greylist | 接続ホストが指定した回数以上、「初回接続から近すぎる」(手順10)になっている →再送要求(拒否) | |
| 10 | greylist | 接続ホストの接続が初回接続から近すぎる →再送要求(拒否) | |
| 11 | greylist | 接続ホストのgreylistのアクセス時間を更新 | |
| 12 | greylist | →許可 |
このプログラムは単一のperlスクリプトですので、簡単にインストールできます。
以下にインストール手順を示します。
# tar zxvf s25rtarpitgreylist_1.0.tar.gz# cd s25rtarpitgreylist_1.0# ./setup.sh7.へ
# cp s25rtarpitgreylist.pl /var/qmail/bin
# chmod 755 /var/qmail/bin/s25rtarpitgreylist.pl
# mkdir /var/qmail/s25rtarpitgreylist
# mkdir /var/qmail/s25rtarpitgreylist/tmp
# cp s25rlist_hostname /var/qmail/s25rtarpitgreylist
# cp whitelist_hostname /var/qmail/s25rtarpitgreylist
# cp blacklist_hostname /var/qmail/s25rtarpitgreylist
# cp blacklist_helohost /var/qmail/s25rtarpitgreylist
# cp greylist /var/qmail/s25rtarpitgreylist
# touch /var/qmail/s25rtarpitgreylist/whitelist
# touch /var/qmail/s25rtarpitgreylist/blacklist
# touch /var/qmail/s25rtarpitgreylist/lastdeletetime
# chown -R qmaild /var/qmail/s25rtarpitgreylist権限の設定は手抜きしてます。
7.へ
# vi /etc/init.d/qmail
:(中略)
# qmail smtpd start
/usr/local/bin/tcpserver -vhR -u ${qmaild_uid} -g ${nofiles_gid} \
-x /home/vpopmail/etc/tcp.smtp.cdb 0 smtp \
/var/qmail/bin/s25rtarpitgreylist.pl \
/var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd &
:(中略)設定項目がたくさんありますが、qmailのインストール先をデフォルトから変更していない場合は、これらの設定項目の値を初期値から変更しなくても正しく動作します。
S25Rリストやホワイトリスト、ブラックリスト、greylistのファイルを格納するディレクトリのパスを指定します。qmaildユーザが読み書きできる必要があります。
qmailのcontrol/ディレクトリのパスを指定します。
このプログラムが一時的に使用するディレクトリのパスを指定します。qmaildユーザが読み書きできる必要があります。
flock関数を使用するかどうかを設定します。
0または1の数値を指定します。
ログ出力のレベル(頻度)を設定します。
IPアドレスベースのホワイトリストファイルのパスを指定します。
ファイルの内容は、許可したいホストのIPアドレスを指定したリスト(改行区切り)です。
ホスト名ベースのホワイトリストファイルのパスを指定します。
ファイルの内容は許可したいホストのホスト名のリスト(改行区切り)です。ホスト名の指定にperlの正規表現が使用できます。書式は異なりますがこちらのホワイトリストもそのまま使用できます(このプログラムにて余計な情報は読み取らないようにしています)
ブラックリストの機能の有効/無効、および動作方法を設定します。
0から2までの数値を指定します。
IPアドレスベースのブラックリストファイルのパスを指定します。
ファイルの内容は、接続を拒否したいホストのIPアドレスを指定したリスト(改行区切り)です。
ホスト名ベースのブラックリストファイルのパスを指定します。
ファイルの内容は接続を拒否したいホストのホスト名のリスト(改行区切り)です。ホスト名の指定にperlの正規表現が使用できます。
greylisting機能の有効/無効を設定します。
0,1の値を指定します。
greylistファイルのパスを指定します。
ファイルの内容はgreylistでアクセス制御するホストの各種情報(改行区切り)のリストです。
レコードの書式は
「IPアドレス 登録日(初回アクセス)の日付 登録日(初回アクセス)の時刻 最終アクセスの日付 最終アクセスの時刻 初回接続に近すぎて失敗した数」
です。
このファイルは、このプログラムによって自動的に更新されます。
greylistの編集中を示すロックファイルのパスを指定します。
このファイルを配置するディレクトリはqmaildユーザが読み書き削除できる権限を必要とします。
greylistの自動更新中に使用する一時ファイルのパスを指定します。
このファイルを配置するディレクトリはqmaildユーザが読み書き削除できる権限を必要とします。
greylistに登録されている期限切れしたホストの情報を削除した日時を管理するファイルのパスを指定します。
このファイルの最終編集時間で日時を管理しています。 このファイルを配置するディレクトリはqmaildユーザが読み書き削除できる権限を必要とします。
greylistに登録されている期限切れしたホストの情報を削除するための検索の間隔(秒数)を指定します。
再送要求後の、メールの受信を許可する、初回接続からの秒数を指定します。
例えば、Sec_Suppression_Connect=120 のとき、
2008-03-20 22:00:00に初めて接続したホストを再送要求したとします。
このとき、再送にあたる2回目の接続が
2008-03-20 22:01:30であれば、初回接続より120秒経過していないので再び拒否し再送要求します。
2008-03-20 22:02:10であれば、初回接続より120秒経過しているのでそのホストの接続を許可します。
greylistに登録されているホストのうち、接続が許可されているホスト(初回接続日時!=アクセス日時)の情報の有効期限(秒数)を指定します。
有効期限が切れたホストの情報はgreylistから削除されます。
greylistに登録されているホストのうち、接続が許可されていないホスト(初回接続日時=アクセス日時、再送待ち状態)の情報の有効期限(秒数)を指定します。
有効期限が切れたホストの情報はgreylistから削除されます。この値をSec_Suppression_Connectより小さくしないでください。
メール送信ホストから接続された時のHELOコマンドで答えるメッセージを設定します。この値が空のままであるとqmailのcontrolディレクトリにあるsmtpgreetingまたはmeファイルの内容が設定されます。
このHELOメッセージには使用しているプログラムの名前やバージョン情報が表示されます。しかし、このプログラムの場合、このプログラムの名前を表示すると、このプログラムに対する対策を講じられる可能性があるため、これらの情報を表示しないほうがよいでしょう。
SMTP接続のタイムアウト秒数を設定します。
このプログラムによるSMTPダミー応答中の、SMTPの各コマンドごとの応答落ち時間(秒数)を指定します。
スパム送信ホストは遅延を嫌がるので自ら切断するかもしれません。
接続を拒否する初回接続に近すぎて拒否した数の閾値を指定します。
初回接続に近すぎて拒否した数がこの値を超えると、初回接続より指定の時間を経過しても接続を拒否します。短い間隔で何度も再送してきて最終的にSec_Suppression_Connectの設定秒数を超えてしまう場合に有効です。
接続ホストをIPアドレスの第3オクテットまで使用して登録情報とマッチングするかどうかを設定します。(第4オクテットはマッチングに使用しない)
greylistに登録されている情報が非常に多く動作が鈍くなっている場合に有効です。
greylistへの登録を拒否する、接続ホストのSMTPコマンド発行数を指定します。
接続ホストが発行するSMTPコマンドがこの設定値より少ない時、接続ホストのgreylistへの登録を、このプログラムはキャンセル(削除)します。
greylistへの登録を拒否する、接続ホストの規格外SMTPコマンド発行数を指定します。
接続ホストが発行する規格外のSMTPコマンドがこの設定値より多い時、接続ホストのgreylistへの登録を、このプログラムはキャンセル(削除)します。
SMTP接続がタイムアウトした接続ホストのgreylistへの登録を拒否する機能の有効と無効の切り替えを指定します。
通常のgreylistのアルゴリズムを接続ホストが回避する場合があるので、接続ホストのSMTP接続がタイムアウトになった時点でgreylistへの登録を拒否します。
S25Rによる動的IPアドレスらしいホストの選別をする機能を有効にするか無効にするかを設定します。
0,1の値を指定します。
S25Rリストのファイルのパスを指定します。
ファイルの内容は動的IPアドレスらしいホスト名のリスト(改行区切り)です。ホスト名の指定にperlの正規表現を使用することができます。 Mode_Blacklistの値を「1」(デフォルト)にしている場合は、ブラックリストの内容も追加で定義してください。 書式は異なりますがこちらの「/etc/postfix/rejectionsファイルの中身」で紹介されているリストも使用することができます。(このプログラムにて余計な部分を読みこまないようにしています)
tarpit(応答遅延)の機能の有効/無効、および動作方法を設定します。
0から2までの数値を指定します。
tarpit(応答遅延)する秒数を指定します。
ここで指定した秒数だけ接続直後のSMTPグリーティングの応答を遅らせます。デフォルトでは65秒ですが125秒ぐらいでも実用範囲だと思います(副作用には注意してください)。
tarpit(応答遅延)を待つことができたホストを許可するかどうかを設定します。
0から1までの数値を指定します。
接続ホストがHELOで名乗るホスト名のブラックリストの機能の有効/無効を設定します。
0から1までの数値を指定します。
HELOで名乗るホスト名ベースのブラックリストファイルのパスを指定します。
ファイルの内容は、接続を拒否したいホストの名乗るHELOホスト名を指定したリスト(改行区切り)です。ホスト名の指定にperlの正規表現を使用することができます。 FQDNチェックもこのファイル内の定義で行っています。
レコードの書式は
「拒否するHELOホスト名 [拒否する逆引きホスト名またはIPアドレス(名前解決不可時)]」
です。左から2カラム目のホスト名は省略できます。省略時は全ホスト対象です。
接続ホストがHELOで名乗るホスト名(FQDN)のドメイン部分と接続ホストの逆引きホスト名(FQDN)のドメイン部分を比較する機能の有効/無効を設定します。
逆引きできないホストにはこの機能は働きません。また、ローカルネットワークに配置された配信専用のメールサーバーはHELOで名乗るホスト名がFQDNでないことが多いので、この機能を有効にした場合、このようなホストから送信されるメールを受信できなくなるリスクがあります。
0-2の値で指定します。
この機能はgTLDであるかccTLDであるかまではチェックしません。よってSLDまでしかチェックしません。
接続ホストがHELOでIPアドレスを名乗った時に、接続元のIPアドレスと比較する機能の有効/無効を設定します。
0-1の値で指定します。
この機能は未完成です。設定値は必ず0にしてください。
出来るだけこのバージョン以上にアップデートしてください。上記にもありますとおり、このバージョン以前では、何らかの原因でgreylistが壊れているとプログラムが強制終了されてします。即ち、greylistが壊れると、greylistの判定が必要なメールは受信できなくなる可能性があります。