CentOS 5にpostgreyをインストールする手順と、geoipで日本以外の国をgreyとして処理するパッチです。
postgreyはpostfixのpolicyサーバです。greylistingは受信を一旦拒否し、リトライしてきたメールサーバからのみ受信を行うというスパム対策手法です。
さくっとインストールを。
- rpmforgeをリポジトリに加えます
- yum -y install postgrey
- 以下アップデートで修正された模様。不要です。(2007/8/8)
/etc/sysconfig/postgreyに以下の1行を追加
OPTIONS="--unix=$SOCKET --group postgrey" - /etc/postfix/main.cfのsmtpd_recipient_restrictionを以下のようにします
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination,
check_policy_service unix:/var/spool/postfix/postgrey/socket - chkconfig postgrey on
- /etc/init.d/postgrey start
- /etc/init.d/postifix restart
以上でpostgreyが有効になります。
geoipのパッチ
全てのメールをgreylistingするのは無駄なので、選択的にやりたいものです。動的IPアドレスからっぽい奴をフィルタするS25R方式と組み合わせる手法が使われているようですが、ここではgeoipでアクセスしてきたサーバの国を基準にgreyにするかどうかの判定を入れることにします。
以下のパッチでは日本以外は全てgrey行きです。
--- /usr/sbin/postgrey.orig 2007-08-02 18:46:44.000000000 +0900
+++ /usr/sbin/postgrey 2007-08-06 19:34:34.000000000 +0900
@@ -18,6 +18,7 @@
use Sys::Hostname;
use Sys::Syslog; # used only to find out which version we use
use POSIX qw(strftime setlocale LC_ALL);
+use Geo::IP;
use vars qw(@ISA);
@ISA = qw(Net::Server::Multiplex);
@@ -26,6 +27,10 @@
my $DEFAULT_DBDIR = '/var/spool/postfix/postgrey';
my $CONFIG_DIR = '/etc/postfix';
+my $geoip;
+$geoip = Geo::IP->new(GEOIP_STANDARD);
+die("geoip open error") if (!$geoip);
+
sub read_clients_whitelists($)
{
my ($self) = @_;
@@ -293,6 +298,12 @@
my $real_now = $now;
if(defined $attr->{policy_test_time}) { $now = $attr->{policy_test_time} }
+ my $client = $attr->{client_address};
+ my $country = $geoip->country_code_by_addr($client);
+ my $result = ($country =~ /JP/) ? 'DUNNO' : 'GREY';
+ syslog 'info', "address:%s country:%s result:%s",$client,$country,$result;
+ return 'DUNNO' if ($country =~ /JP/);
+
# whitelists
for my $w (@{$self->{postgrey}{whitelist_clients}}) {
if($attr->{client_name} =~ $w) {
後はpostfix停止、postgrey再起動, postfix開始の順で行います。ご利用には適宜国コードや条件をいじってくださいませ。
私のところでは、まずメールが来ないだろう国からのアクセスは即座に拒否。残りについては上のパッチを少しいじってホワイトリストはそのまま通し、日本からのものはDNSBLでチェック後アウトなメールをgrey処理、海外のものはそのままgreyとして処理するようにしています。
各所でレポートされているとおりgreylistingは結構効果があるようですが、最近のスパムの中にはちゃんとリトライする奴がいます。いずれそういう奴が増えてくるのではないかと予想され、やはりいたちごっこになりそうです。ちゃんとしたメールサーバと同じように振る舞い、リソースをたくさん使えばtarpit(接続時の応答を遅らせる手法)もgreylistingも抜けれますからあまり安心できません。