スパム対策の1つである「postgrey(taRgrey)」をインストールして検証した備忘録です。

taRgreyについて
http://k2net.hakuba.jp/targrey/

使用OS
CentOS 64bit 5.5

使用MTA
Postfix-2.7.1
)最新版は以下URL参照のこと
ftp://ftp.ixp.jp/postfix/index.html

使用BerkeryDB
db-4.4.20
)最新版は以下URL参照のこと
http://www.oracle.com/technology/global/jp/software/products/berkeley-db/index.html

※BDBの最新版は「5.1.19(2010年10月30日現在)」ですが、最新版をダウンロードするには、個人情報を登録てアカウントを作成しないといけなく、登録がめんどうだったので古いバージョンを使用しています。

①BerkeryDBのダウンロード

[root@example ~]# wget http://download.oracle.com/berkeley-db/db-4.4.20.tar.gz

②BerkeryDBのインストール
[root@example ~]# tar zxvf db-4.4.20.tar.gz
[root@example ~]# cd db-4.4.20/build_unix/
[root@example build_unix]# ../dist/configure --bindir=/usr/bin/ --sbindir=/usr/sbin/ --libdir=/usr/lib64/ --includedir=/usr/include/ --mandir=/usr/share/man/
[root@example build_unix]# make
[root@example build_unix]# make install

③Postfixをインストールするのに必要なパッケージをインストール
[root@example ~]# yum -y install openssl-devel pcre-devel

④Postfixインストール用アカウント作成
[root@example postfix-2.7.1]# useradd -s /sbin/nologin -d /etc/postfix -M postfix
[root@example postfix-2.7.1]# useradd -s /sbin/nologin -d /etc/postfix -M postdrop

⑤Postfixのダウンロード
[root@example ~]# wget ftp://ftp.ixp.jp/postfix/official/postfix-2.7.1.tar.gz

⑥Postfixのインストール
[root@example ~]# tar zxvf postfix-2.7.1.tar.gz
[root@example ~]# cd postfix-2.7.1
[root@example postfix-2.7.1]# vi setting.sh ← Postfixインストールセッティング用スクリプト作成
set LD_LIBRARY_PATH
make tidy
make -f Makefile.init makefiles \
AUXLIBS='-lpcre -lssl -lcrypto -lz -lm' \
OPT='-pipe -02' \
CCARGS='\
 -DDEF_COMMAND_DIR=\"/usr/local/sbin\"\
 -DDEF_CONFIG_DIR=\"/etc/postfix\"\
 -DDEF_DAEMON_DIR=\"/usr/local/libexec/postfix\"\
 -DDEF_MAILQ_PATH=\"/usr/local/bin/mailq\"\
 -DDEF_MANPAGE_DIR=\"/usr/local/man\"\
 -DDEF_NEWAIAS_PATH=\"/usr/local/bin/newaliases\"\
 -DDEF_SAMPLE_DIR=\"/usr/local/share/postfix\"\
 -DDEF_SENDMAIL_PATH=\"/usr/local/sbin/sendmail\"\
 -DUSE_TLS \
 -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"\
'\
[root@example postfix-2.7.1]# chmod +x setting.sh
[root@example postfix-2.7.1]# wget http://k2net.hakuba.jp/pub/postfix-sleep.patch ← sleepパッチをダウンロード
[root@example postfix-2.7.1]# patch -p1 < postfix-sleep.patch ← パッチを当てる
patching file src/smtpd/smtpd_check.c
Hunk #2 succeeded at 3550 (offset 121 lines).
[root@example postfix-2.7.1]# ./setting.sh ← セッティングスクリプトを実行
[root@example postfix-2.7.1]# make
[root@example postfix-2.7.1]# make install

⑦Postfixの起動スクリプト作成
以下URLの⑦「postfix」起動スクリプトを作成する、を参照
http://www.kurobuti.com/linuxserver/index.php?option=com_content&view=article&id=22&Itemid=22

⑧postgrey(taRgrey)用アカウント作成
[root@example ~]# useradd -s /sbin/nologin -d /var/lib/postgrey -M postgrey

⑨postgrey(taRgrey)に必要なモジュールをインストール
perlモジュールをインストールするのにCPANを使用します。
CPAMのセッティングは以下URLの⑥「CPAN」で「SPF」に必要な「Perlモジュール」をインストールする、を参照
http://www.kurobuti.com/linuxserver/index.php?option=com_content&view=article&id=33:send-policy-framework&catid=2:2010-05-13-11-40-22&Itemid=36
[root@example ~]# cpan -i Net::Server
[root@example ~]# cpan -i IO::Multiplex
[root@example ~]# cpan -i BerkeleyDB

⑩postgrey(taRgrey)のダウンロード
[root@example ~]# wget http://postgrey.schweikert.ch/pub/postgrey-1.33.tar.gz

⑪postgrey(taRgrey)のインストール
[root@example ~]# tar zxvf postgrey-1.33.tar.gz
[root@example ~]# cd postgrey-1.33
[root@example postgrey-1.33]# wget http://k2net.hakuba.jp/pub/targrey-0.31-postgrey-1.33.patch ← targreyにするためのパッチをダウンロード
[root@example postgrey-1.33]# patch -p0 < targrey-0.31-postgrey-1.33.patch ← パッチを当てる
patching file postgrey
[root@example postgrey-1.33]# cp postgrey /usr/local/sbin/postgrey
[root@example postgrey-1.33]# cp postgrey_whitelist_* /etc/postfix/
[root@example postgrey-1.33]# mkdir /var/lib/postgrey ← postgrey(taRgrey)データベース用ディレクトリ作成
[root@example postgrey-1.33]# chown postgrey /var/lib/postgrey/

⑫Postfixをpostgrey(taRgrey)に対応させる
[root@example ~]# vi /etc/postfix/main.cf
---最終行にでも追加---
smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_destination
        check_client_access    regexp:$config_directory/permit_client_nots25r
        check_policy_service   inet:60000
        permit

smtpd_data_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        check_client_access    regexp:$config_directory/permit_client_nots25r
        check_policy_service   inet:60000
        permit
[root@example ~]# vi /etc/postfix/permit_client_nots25r
/\.dip\.t-dialin\.net$/       WARN
/\.dyn\.optonline\.net$/      WARN
!/(^unknown$)|(^[^.]*[0-9][^0-9.]+[0-9].*\.)|(^[^.]*[0-9]{5})|(^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z])|(^[^.]*[0-9]\.[^.]*[0-9]-[0-9])|(^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\.)|(^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9])/ OK
/./                           WARN

⑬postgrey(taRgrey)の起動スクリプト作成
[root@example ~]# vi /etc/rc.d/init.d/postgrey
#!/bin/sh
#
# postgrey(taRgrey) script
#
# chkconfig: 2345 75 25
# description:postgrey(taRgrey) is a filter to remove a spam \
#             mail and a virus email.
#             Please refer to following URL for details.
#             http://k2net.hakuba.jp/targrey/index.en.html
#

# include functions
. /etc/rc.d/init.d/functions

USER=postgrey
GROUP=postgrey
POSTGREY=/usr/local/sbin/postgrey
DBDIR=/var/lib/postgrey
PID=/var/run/postgrey.pid
PORT=127.0.0.1:60000
TARPIT=125
RETRY=2
DELAY=3600
prog=postgrey

r_output() {

          if [ $RESULT -eq 0 ] ; then

                echo -n $"Starting $prog: " && success
                echo ""
                touch /var/lock/subsys/postgrey

          else

                echo -n $"Starting $prog: " && failure
                echo ""

          fi

        }

rr_output() {

          if [ $RESULT -eq 0 ] ; then

                echo -n $"Stopping $prog: " && success
                echo ""
                rm /var/lock/subsys/postgrey
                rm /var/run/postgrey.pid

          else

                echo -n $"Stopping $prog: " && failure
                echo ""

          fi

        }

start() {

        if [ -s "$POSTGREY" ] ; then

                $POSTGREY --user="$USER" --group="$GROUP" --dbdir="$DBDIR" --pidfile="$PID" --daemonize --inet="$PORT" --tarpit="$TARPIT" --targrey --retry-count="$RETRY" --delay="$DELAY"
                RESULT=$?
                r_output


        fi

        }

stop() {

        killall postgrey > /dev/null 2>&1
        RESULT=$?
        rr_output

        }


case "$1" in

        start )
        start ;;

        stop )
        stop ;;

        restart )
        stop
        sleep 1
        start ;;

        * )
        echo $"Usage: $0 {start|stop|restart}" ;;
esac

[root@example ~]# chkconfig postgrey on
[root@example ~]# /etc/rc.d/init.d/postgrey start
postgrey を起動中:                                         [  OK  ]
[root@example ~]# lsof -i:60000
COMMAND    PID     USER   FD   TYPE DEVICE SIZE NODE NAME
postgrey 16368 postgrey    5u  IPv4  91025       TCP example.com:60000 (LISTEN)

ポート:60000でLISTENしていること!

⑭検証結果
1. 逆引きが出来なくて遅延が発生した場合
[root@example ~]# grep "NOQUEUE: warn" /var/log/maillog
Oct 30 20:13:28 mail1 postfix/smtpd[15225]: NOQUEUE: warn: RCPT from unknown[192.168.0.53]: ; from=<root@hogehoge.local> to=<kurobuti@example.com> proto=ESMTP helo=<hogehoge.local>

2. 遅延を待たずに通信を切った場合
[root@example postfix]# grep "NOQUEUE: sleep" /var/log/maillog
Oct 30 20:15:52 mail1 postfix/smtpd[15225]: NOQUEUE: sleep: RCPT from unknown[192.168.0.53]: pipelining after 4 sec; from=<root@hogehoge.local> to=<kurobuti@example.com> proto=ESMTP helo=<hogehoge.local>

3. 連続で送信されてきた場合
[root@example postfix]# grep "NOQUEUE: reject" /var/log/maillog
Oct 30 20:16:47 mail1 postfix/smtpd[15343]: NOQUEUE: reject: RCPT from unknown[192.168.0.53]: 450 4.2.0 <kurobuti@example.com>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/example.com.html; from=<root@hogehoge.local> to=<kurobuti@example.com> proto=ESMTP helo=<hogehoge.local>


こちらにまとめてみました。下記アドレスの方が新しいです。
http://www.kurobuti.com/linuxserver/index.php?option=com_content&view=article&id=60&Itemid=60


10月 30, 2010 at 8:39 pm by 黒ぶちメガネ
Category: Linux, Postfix, spam対策