2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

SPAM撃退モジュール postgrey を Postfix で使用する!

Postgreyとは、Postfix Greylisting Policy Serverと言う。
postgreyは、SPAMの挙動を上手く利用して、それ自身を撃退するモジュールである。SPAM業者独自のアバウトなメールサーバからSPAMを配送するSPAMメールパケットには一度宛先に配送して失敗すると以降再送しないと言う特性がある。この特性を上手く利用したのがpostgreyである。また、SPAM業者はSPAMメールのヘッダーの偽造を当たり前のように行う。したがって、従来からのメールヘッダや本文の文字列や語句でSPAMを拒否するベイジリアン型フィルタ等では限界が有る。
しかし、ベイジリアン型フィルタもそれなりの優秀な面もあるため、これらと併用するのがもっともベストではないだろうか。Postgreyは、通常サービスポートで動作するのでprocmailで起動するようなSPAMフィルタとは併用が出来る。例えば、Bogofilter と併用するなどしたら90%近くの確率でSPAM撃退が可能であると考える。

良いことばかり言ってきたが、欠点もある。
1) Postgreyは全ての受信メールを初回時は拒否する。それで二回目の再送パケットで受信しDBに書き込み登録する、そして一定の期間(デフォルトで35日)DBと照合してそのメールを受け取るが、期間を過ぎてもメールがない場合はDBから抹消される。そんなアルゴリズムになっているため初回のディレイでメール配送のスループットは確実に落ちる。
2) SPAMメールでも守りの弱い他人のサーバを不正に中継したSPAMメールに対しては効果がない。つまり、再送を行うからである。それと、hotmailとかyahooメールのような、ただメールのアカウントで送信されるSPAMは防ぎようがない。

導入環境OS:Nature’s Linux1.3.3
      MTA:Postfix+Procmail
ベイジリアンフィルタ:Bogofilter


1.必要モジュールのゲットと準備

1) postgreyの入手。
本家ポータル
日本語ポータル
postgrey-1.22.tar.gz(2005年11月現在最新版)

2) DB4の入手及びインスコ
http://www.sleepycat.com/download/db/index.shtml
db-4.3.29.tar.gz(2005年11月現在最新)

# tar zxvf db-4.3.29.tar.gz
# cd db-4.3.29
# cd build_unix
# ../dist/configure
# make
# make install

3)必要なPerlモジュール&ライブラリ
Perlは、最新の物を入れる。2005年11月現在最新でPerl5.8.xだと思う。その他、必要なPerlモジュールをCPANから入れる。

# /usr/local/bin/perl -MCPAN -e shell
cpan> install Net::Server
cpan> install IO::Multiplex
cpan> install BerkeleyDB


2.postgrey のインストール

Postreyグループとユーザを作る。
# groupadd postgrey
# useradd -g postgrey -s /bin/false postgrey

このとき、postgrey_greylist_clients ファイルという、チェックする対象を指定したファイルもコピーする。
# tar zxvf postgrey-1.22.tar.gz
# cd postgrey-1.22
# cp postgrey /usr/local/sbin

標準で、postgreyユーザで動くため、postgreyアカウントを作成greylistsのDBを置くディレクトリを作成し、owner、groupをpostgreyにする。
# mkdir /var/spool/postfix/postgrey
# chown postgrey.postgrey /var/spool/postfix/postgrey

設定ファイルをコピーする。デフォルトは /etc/postfix
# cp postgrey_whitelist_clients postgrey_whitelist_recipients postgrey_greylist_clients /etc/postfix/     ← 実際には一行で


3.自動起動させる

自動起動設定する。本来なら、/etc/init.dへスクリプトを置くのが正統的だが、自分は以下のようにした。以下を参考に正統的な方法で起動するかは、スキなようにして欲しい。
/etc/rc.d/rc.local に追加。

# postgrey (postfix access policy server) start
if [ -x /usr/local/sbin/postgrey ]; then
/usr/local/sbin/postgrey –inet=10023 -d –pidfile=/var/run/postgrey.pid
fi
echo -n ‘postgrey’


4.起動してみる

postgrey を起動する。
# /usr/local/sbin/postgrey –inet=10023 -d

■ 起動オプション

-h, –helpヘルプ表示
–versionバージョン表示
-v, –verbose増加冗長レベル
-u, –unix=PATHUnix Socketのパス指定
-i, –inet=[HOST:]PORTホストとポート指定実行
-d, –daemonizeバックグラウンドで動作させる(daemon化)
–pidfile=PATHpidファイルのパス指定
–user=USERpostgrey実行ユーザ指定(デフォルト:postgrey)
–group=GROUPpostgrey実行グループ指定(デフォルト:nogroup)
–dbdir=PATHデータベースディレクトリ指定(デフォルト:/var/spool/postfix/postgrey)
–delay=Ngreylisting許否時間指定(デフォルト:300秒)
–max-age=N許可メールアドレスのデータベース保存期間指定(デフォルト:35日)
–retry-window=N最初のリトライまでの期間指定、「h」を指定すると時間指定となる(デフォルト:2日)
–greylist-action=Agreylistingしたときの、postfixへのリターンアクション(デフォルト:DEFER_IF_PERMIT)
–greylist-text=TXTメールがgreylistingされたときのmaillogへの出力フォーマット (デフォルト:Greylisted for %s seconds + help url, see below)
–lookup-by-subnetIPアドレスの最後の8ビットを省く(デフォルト)
–lookup-by-hostIPアドレスの最後の8ビットを省かない
–whitelist-clients=FILEpostgrey_whitelist_clientsファイルの代替えパス指定(デフォルト:/etc/postfix/postgrey_whitelist_clients)
–whitelist-recipients=FILEpostgrey_whitelist_recipientsファイルの代替えパス指定(デフォルト:/etc/postfix/postgrey_whitelist_recipients)
–auto-whitelist-clients=N最初に、旨く配送されてその後、最小 N 回メールを配送後whitelistホストはwhitelistedされる(デフォルト:5 N=0はdisable)
–privacy一方向ハッシュ関数を使用することでデータを保存する指定

5.Postfix側の設定

postfix の設定、main.cf に追加

# for use Greylisting
smtpd_recipient_restrictions = permit_mynetworks, 途中省略 reject_unauth_destination, check_policy_service inet:127.0.0.1:10023

postfix を再起動するのを忘れずに。
# postfix reload


6.本当に動作してるのか確認する

初回一発目受信のメールがリジェクトされているところがlogに残っている。デフォルトで300秒(5分間)の間は再送されても受信を拒否する。デフォルトエントリ期間は35日。

Nov 13 16:36:01 sub postfix/smtpd[4856]: connect from unknown[210.xxx.xxx.xxx]
Nov 13 16:36:02 sub postfix/smtpd[4856]: NOQUEUE: reject: RCPT from unknown[210.xxx.xxx.xxx]: 450 <hoge@hogehoge.com>: Recipient address rejected: Greylisted for 300 seconds (see http://isg.ee.ethz.ch/tools/postgrey/help/hogehoge.com.html); from=<mh@hogehoge.net> to=<hoge@hogehoge.com> proto=ESMTP helo=<ns.hogehoge.net>

初回拒否されて再送で受信されたメールヘッダー

X-Greylist: delayed 904 seconds by postgrey-1.22 at sub.hogehoge.com; Sun, 14 Nov 2005 11:36:13 JST

こんな感じに遅延表示がくっついてる。


7.信頼できる人にはあらかじめ配信を許可したい

Postgrey whitelistsはPostfix accesstablesとして同様の構文規則に従う。
/etc/postfix/postgrey_whitelist_clients
/etc/postfix/postgrey_whitelist_recipients

1) 正当なメールサーバを許可するためのホワイトリスト情報(postgrey_whitelist_clients)
信頼できる人はあらかじめ許可したい。greylistingさせたくないドメインリストを設定する。/regexp/ Postfixの「regexp」と同じで完全にパターンマッチしているもの。ちなみに、Whitelistは ここ のを使うと良いと思う。

■ 書式:
domain.addr
(ドメイン名 or サブドメイン名)
“domain.addr” domain and subdomains.

IP1.IP2.IP3.IP4(IPアドレス)
IPアドレスを指定します。始めから読み出すので、後ろのIPアドレスは省略できます。ただし、その場合はネットワークアドレスとして判断されます。

注1:
ごく当たり前の事だが、マスカレードしてるゲートウェイサーバのIPアドレスが逆引き出来ないホストは、当然そのIPアドレス指定となる。whitelistにホスト名設定かIPアドレス設定かを間違え無いようにすること。気が付かないうちに、whitelistしてるつもりがgreylistしてしまうので注意が必要。

■ 例:
# vi /etc/postfix/postgrey_whitelist_clients

省略

# hoge.hogehoge.net
/\.hogehoge\.net$/

# IP Address NNN.NNN.NNN.NNN
/^NNN\.NNN\.NNN\.NNN$/

省略

注2:
これを設定したときは、起動オプションに、–whitelist-clients=FilePath を付けて起動すること。

2) あらかじめ信頼してるメールアドレスを許可する(postgrey_whitelist_recipients)
信頼できるメールアドレスはあらかじめ許可したい。greylistingさせたくないメールアドレスの設定。/regexp/ Postfixの「regexp」と同じで完全にパターンマッチしているもの。

■ 書式:

name@ (ユーザ名)
“name@.*” and extended addresses “name+blabla@.*”.

name@domain.addr (完全なメールアドレス)
“name@domain.addr” and extended addresses.


■ 例:
# vi /etc/postfix/postgrey_whitelist_recipients

省略

# ユーザ名のみ指定
postmaster@
abuse@
root@
# 完全なメールアドレス指定
hoge@hogehoge.com

省略

注3:
これを設定したときは、起動オプションに、–whitelist-recipients=FilePath を付けて起動すること。


8.俺のNature’s Linuxでの起動スクリプト

[VFS-root@sub src]# more /etc/init.d/postgrey
#!/bin/bash

# chkconfig: 2345 36 36
# description: Postgrey Script

start() {
echo -n “Starting Postgrey: “
/usr/local/sbin/postgrey –inet=10023 -d
return 0
}
stop() {
killall postgrey
return 0
}
case “$1” in
start)
start
;;
stop)
stop
;;
esac


9.その他

1) BerkeleyDBのWARNING

2006年3月時点のPostgrey1.24は、BerkeleyDB4.1でpostgreyソースが作られているので、BerkeleyDB4.2以降のバージョンを使うとメールログに、

fatal: Your vendor has not defined BerkeleyDB macro DB_AUTO_COMMIT, used at (eval 7) line 1 BerkeleyDB::DB_AUTO_COMMIT

のようなWARNINGが出る。これは、postgreyのソースの497行目でBerkeleyDBのサブルーチンDB_AUTO_COMMITが有るかどうか評価している。DB_AUTO_COMMITが有れば実行するし、無ければWARNINGが出る。エラーではないので動かないわけではないが、気になる人は、以下のようにpostgreyソースの497行目の if文 をコメントしてpostgreyを再起動すると良いだろう。多分、BerkeleyDB4.2以降のバージョンは、サブルーチンDB_AUTO_COMMITを実行しなくても問題無いのではと思う。以下をコメントして、俺が動かしてる分には正常に現在も動いている。

497行目、以下コメント。

# if(defined $BerkeleyDB::{DB_AUTO_COMMIT}) {
# $setflags |= eval “BerkeleyDB::DB_AUTO_COMMIT”;
# }
# else {
# warn “WARNING: disabling DB_AUTO_COMMIT because you are using BerkeleyDB version $
BerkeleyDB::db_version. Version 4.1 is required for DB_AUTO_COMMIT. You might have problem
s in case of system failures to recover the database.\n”;
# }

2) postgreyのDBの中身を見る

ちなみにpostgreyのDBの中身がどのように登録されてるかを見てみると、

# cp /usr/local/BerkeleyDB.3.3/bin/db_dump /usr/bin/
俺の場合、コマンドがなかったので/usr/binへコピーして使用した。

# db_dump -p /var/spool/postfix/postgrey/postgrey.db

途中省略

83.57.245.209/sticky310@gmail.com/xxxx@kozupon.com
1143350388,1143350388
83.57.245.209/sticky310@gmail.com/xxxx@kozupon.com
1143350389,1143350389
83.57.245.209/sticky310@gmail.com/xxxx@kozupon.com
1143350390,1143350390
84.133.220.0/tueucawtho@cvpl.com/xxxx@kozupon.com
1143311223,1143311223,254
84.9.233.151/sam@u-d.com/xxxx@kozupon.com
1143189645,1143189645
86.216.110.0/goronwy@wcnet.net/xxxx@kozupon.com
1143189682,1143189682,229
DATA=END

こんな感じかな。

以上

コメント