このパッチはqgreylist(qmailにgreylistingの機能を付加するツール)のパッチです。qgreylistにS25R(選択的SMTP拒否)とホスト名ベースのホワイトリスト・ブラックリスト、tarpitting(応答遅延)との機能を付加します。
元々はこちらのページの機能だけだったのですが、正規表現が使えるホスト名ベースのブラックリストが欲しいなと実装したところ、S25Rもこのロジックの使いまわしで実装できることに気づき、実装してしまいました。
パッチを適用することによって、greylistingする前に以下のことを実行します。
- ホワイトリストに定義されたホスト名からの接続をgreylistingしないようにします。
- S25Rのルールに該当するホストおよび自分で定義したホストのみをgreylistingするようにします。
- ブラックリストに定義されたホスト名からの接続を拒否します。(正規表現可)
- tarpitting(応答遅延)を行うようになります。(もちろん、ロジックを修正することなく、この機能を有効化または無効化することができます)
- greylistingするときにHELOチェックを行い、NGに指定したホスト名を名乗ったときはgreylisttingをキャンセルします。
このパッチを適用するメリットは以下のとおりです。
- S25R
- 実装が正しい正当かもしれないメールサーバー(ホスト名から判断)からの接続に対してgreylistingを行わないようにします。greylistingの副作用を減らします。S25Rについてはこちらが詳しいです。
- ブラックリスト
- 同一ホストから、2分から1日の間隔(qgreylistのデフォルト設定)で送信してくるスパマーを除外できます。(手動登録)
- ホワイトリスト
- 正当なサーバーをgreylistingの罠から救済します。
- tarpitting(応答遅延)
- 同一ホストから、2分から1日の間隔(qgreylistのデフォルト設定)で送信してくるスパマーをSMTP応答遅延で除外できる可能性があります。(blacklist管理の手間が減るかもしれない)
- 再送信できない正当なsmtpサーバーがある場合、応答遅延を待つことができればwhitelistに追加しなくても救済できる(whitelist管理の手間が減るかもしれない)
- HELOの簡易精査
- 接続ホストが定義したホスト名をHELOで名乗ってきたとき、qreylistの登録をキャンセルできます(qreylist未登録状態にする)。このスクリプトを実装するメールサーバーのホスト名を詐称するスパムや、特徴のあるHELOホスト名を名乗るスパムに対して有効です。(但し、qreylistによる接続許可が承認されたホストに対しては、この機能は効きません。qreylistに登録されていない初めて接続するホストに対してだけ有効です。)
ごちゃごちゃ書くより処理順を示したほうがわかりやすいと思うので処理順(ロジック)を示します。
順 | 機能 | 処理内容 | 実装 | その他 |
1 | greylist | greylistからしばらくアクセスがないホストの記録を削除 | qgreylist | |
2 | | 接続ホストがリレークライアント→許可 | qgreylist | |
3 | | 接続ホストがホスト名ベースホワイトリストに登録されている→許可 | このパッチ | |
4 | | 接続ホストがIPアドレスベースホワイトリストに登録されている→許可 | qgreylist | |
5 | S25R | 接続ホストのホスト名がS25Rの条件に該当しない→許可 | このパッチ | |
6 | | 接続ホストがホスト名ベースブラックリストに登録されている→再送要求(拒否) | このパッチ | |
7 | | 接続ホストがIPアドレスベースブラックリストに登録されている→再送要求(拒否) | このパッチ | |
8 | greylist | 接続ホストがgreylistに登録されていない→8-1へ 登録されている→9へ | qgreylist | |
8-1 | tarpitting | tarpitting(指定秒数待つ) (オプションで待てたら→許可 も可) | このパッチ | |
8-2 | greylist | 接続ホストをgreylistに登録 | qgreylist | |
8-3 | greylist | SMTPダミー応答 | qgreylist | |
8-4 | | 接続ホストがHELOで名のったホスト名がブラックリストに登録されている→qreylistから登録を削除&再送要求(拒否) | このパッチ | |
8-5 | greylist | →再送要求(拒否) | qgreylist | |
9 | greylist | 接続ホストの接続が初回接続から近すぎる →再送要求(拒否) | qgreylist | |
10 | greylist | 接続ホストのgreylistのアクセス時間を更新 | qgreylist | |
11 | greylist | →許可 | qgreylist | |
qgreylistはインストールおよび設定済みとして説明します。
- ここからパッチをダウンロード
- ダウンロードしたアーカイブファイルを展開
# tar zxvf s25rtarpit_before_qgreylist0.3-0.3.tar.gz
- 展開したディレクトリに移動
# cd s25rtarpit_before_qgreylist0.3-0.3
- セットアップスクリプトを実行(ホワイトリスト・ブラックリスト・S25R条件リストが/var/qmail以下にコピーされます。)
# ./setup.sh
- qgreylistをバックアップ(ここから先は適当に)
# cd <qgreylistがあるディレクトリ>
# cp -p greylist greylist.org
- パッチ適用
# patch < <アーカイブを展開したディレクトリ>/qgreylist-0.3_s25rbefore-0.3.patch
- 起動スクリプト修正(接続ホストを名前解決できるようにする)
# 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/greylist \
/var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd &
:(中略)
- 名前解決できないと全ての接続がgreylisttingされてしまいます
- greylistはqmail-smtpdの直前(greylistの引数でqmail-smtpdを起動)
- blacklist
- ブラックリストのディレクトリパスです。このディレクトリにIPアドレスをファイル名とするファイルを作成すると、そのアドレスからの接続が拒否されます。(オリジナルのwhitelist、greylistと扱い方は同等です)
- tarpittingmode
-
tarpitting(応答遅延)するタイミングまたは無効化を指定します。0-2を入力します。
- tarpitting(応答遅延)しない。
- 知らないホストだけtarpitting(応答遅延)を実施する。
- 全てのホストにtarpitting(応答遅延)を実施する。
- hostnameblacklist
- ホスト名ベースのブラックリストのファイルパスです。ファイルの内容は1レコード1行(改行区切り)で、接続拒否するホスト名(FQDN)を正規表現で定義します。このブラックリストにホスト名を追記するときは、同じ定義をs25rlist_hostnameファイルにも追記してください(先にS25Rを処理するため)
- hostnamewhitelist
- ホスト名ベースのホワイトリストのファイルパスです。ファイルの内容は1レコード1行(改行区切り)で、接続を許可するホスト名(FQDN)を正規表現で定義します。ここに定義されたホストにはS25Rもtarpittingもgreylisttingも実施しません。
- helohostblacklist
-
HELOコマンドで名乗るホスト名のブラックリストのファイルパスです。ファイルの内容は1レコード1行(改行区切り)で、接続を拒否するHELOホスト名(tarpitting通過後に名乗られる)にを正規表現で定義します。
greylisttingに入る前のSMTPダミー処理にて、接続してきたホストがHELOで名乗るホスト名に対して拒否するホスト名を定義します。定義に一致した場合、接続ホストのgreylist登録をキャンセルします。(要するに何時までたってもgreylistによる接続許可を認めません)
- hostnames25rlist
- S25Rの条件を定義したファイルのパスです。ファイル内の書式は1レコード1行(改行区切り)です。デフォルトで純粋なS25Rの条件のみが定義されています。ブラックリストに登録するホスト名をこのファイルにも定義してください。
- badhelohosts
- ※現バージョンでは未使用です。(上記のhelohostblacklistに統合しました)
- tarpitsec
- tarpitting(応答遅延)する秒数を指定します。
- tarpitwaitaccept
-
tarpitting(応答遅延)を実施した結果、待っていたホストをすぐに次のsmtpdに引き渡すかどうかを指定します。0または1を指定します。
- 続けてgreylistingを実施する
- すぐに次のsmtpdに引き渡す(SMTP接続を許可する)
- badhelohostmode
-
badhelohostsによる接続拒否を有効にするかどうかを定義します。
- 無効にする。
- 有効にする。
- このパッチの適用により、100%スパムを除外できることはありません。もちろん、保障はしません。
- このパッチの適用により、いかなる損害等が発生したとしても私は責任を負いません。自己責任でご使用ください。
本当はqgreylistに頼らないプログラムにしたいのだが、
- 一から作成する時間がない
- qmail自身を改変しない(qmail-sppみたいなことをしない)ポリシー(パッチあてまくりでこれ以上ややこしくなるのが嫌)
などの理由があるので、なかなか手がつけれない。
特に2番目に挙げた”改変しない”が大きく、
qmail自身を改変しないと、
- 全ての接続に対してHELLOの精査
- SMTPコマンドの精査
- メールヘッダーの精査
とかがRFCのルール内で実装できない。
なので、一から作成するメリットが感じられない。
で、やりたいこと
-
SMTP-AUTH対応(自前で認証やるので無いですが・・・AUTHコマンドを使ってきたらgreylistに登録して許可ホストにするなど)