qmail+vpopmail環境にPostfixを導入する(その1)

目標:現在のサーバー環境:qmail+vpopmail+Spamassassin+Courier-IMAP環境に、Postfixを導入しSMTPフロントエンドとして稼働させる。

期待できる効果:外部向けSMTPで現行技術への対応の簡素化・SPAM対策の強化。

まず、SPAM対策の強化として、こちら(http://k2net.hakuba.jp/targrey/)のページで紹介されている、taRgrey手法を利用することにします。taRgreyとは、動的IPっぽいアドレスからの接続に対して、tarpitting(応答の故意遅延)を行い、遅延に対応して待機した場合は受信開始、待機しなかった場合はGreylistを適応して再送させ、再送された場合は受信するような方式です。SPAM対策と、誤判定への対処のバランスが非常に良いと思われ、今回の導入となりました。
taRgreyのため、postgreyを導入します。postgreyの導入に際して、Perl(5.6.0以上)と、Net::Server・IO::Multiplex・BerkeleyDBのPerlモジュールが必要になります。BerkeleyDBのライブラリはデフォルトで導入されていますので、今回はインストールしていません。必要であれば、yumやapt-getを利用してインストールします。(例:yum install db4 db4-utils db4-devel)

[server@hatena hatena]$ wget -q http://postgrey.schweikert.ch/pub/postgrey-1.31.tar.gz
[server@hatena hatena]$ wget -q http://k2net.hakuba.jp/pub/targrey-0.31-postgrey-1.31.patch
[server@hatena hatena]$ tar xzf postgrey-1.31.tar.gz
[server@hatena hatena]$ cd postgrey-1.31
[server@hatena postgrey-1.31]$ patch < ../targrey-0.31-postgrey-1.31.patch
patching file postgrey
[server@hatena postgrey-1.31]$ su
Password:
[server@hatena postgrey-1.31]# perl -MCPAN -e shell
cpan[1]> install Net::Server
  (中略)
cpan[2]> install Net::Server
  (中略)
cpan[3]> install BerkeleyDB
  (中略)
cpan[4]> quit
[server@hatena postgrey-1.31]# mkdir -p /var/spool/postfix/postgrey
[server@hatena postgrey-1.31]# /usr/sbin/groupadd -g 288 nogroup
[server@hatena postgrey-1.31]# /usr/sbin/groupadd -g 288 -u 288 -d /var/spool/postfix/postgrey -s /sbin/nologin -M postgrey
[server@hatena postgrey-1.31]# chown postgrey:nogroup /var/spool/postfix/postgrey
[server@hatena postgrey-1.31]# cp postgrey /usr/local/sbin/
[server@hatena postgrey-1.31]# mkdir /etc/postfix
[server@hatena postgrey-1.31]# cp postgrey_whitelist_* /etc/postfix/

とりあえず、taRgreyのために、パッチを当ててます。グループ・ユーザーの作成時に、ID:288を指定してますが、特別な意味はありません。システムに合わせて適当に設定します。postgrey自体は、バイナリ(Perlスクリプト)のコピーのみです。RedHat系システム用に、initスクリプトを準備しました。

#!/bin/sh
#
#
# chkconfig: 2345 79 31
# description: Postfix Greylisting Policy Server
#
# processname: postgrey
# pidfile: /var/run/greylist.pid
#

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

prog=postgrey
postgrey=/usr/local/sbin/$prog
DBPATH=/var/spool/postfix/postgrey
SOCKET=$DBPATH/socket
DOPT="--inet=10023 -d --unix=$SOCKET --pidfile=/var/run/postgrey.pid"
OPTIONS=""

# Source an auxiliary options file if we have one, and pick up OPTIONS,
if [ -r /etc/sysconfig/$prog ] ; then
        . /etc/sysconfig/$prog
fi

[ -x $postgrey ] || exit 0
[ -d $DBPATH ] || exit 0

RETVAL=0

start() {
        echo -n $"Starting $prog: "
        daemon $postgrey $OPTIONS $DOPT
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stopping $prog: "
        killproc $postgrey
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog /var/run/$prog.pid
}

restart() {
        stop
        start
}

reload() {
        echo -n $"Reloading $prog: "
        killproc $prog -HUP
        RETVAL=$?
        echo
        return $RETVAL
}

# See how we were called.
case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
restart)
        stop
        start
        ;;
reload)
        reload
        ;;
status)
        status $prog
        ;;
*)
        echo "Usage: $prog {start|stop|restart|reload|status}"
exit 1
esac

exit $? 

(postgrey=/usr/local/sbin/$progの行と、DBPATH=/var/spool/postfix/postgreyの行は、インストールした環境に応じて変更が必要です。)

さらに、/etc/sysconfig/postgrey を作成し、taRgreyの設定をします。

# options for postgrey
OPTIONS="--tarpit=125 --targrey"

これで、postgreyの準備ができましたので、起動してみます。問題ないようであれば、chkconfigで自動起動設定します。

[server@hatena postgrey-1.31]# /etc/init.d/postgrey start
Starting postgrey:                                         [  OK  ]
[server@hatena postgrey-1.31]# /sbin/chkconfig --add postgrey

続いてPostfixを準備します。tarpittingで遅延時に、相手からの切断を検出してこちらも切断するようにパッチを当てます。また、SMTP-AUTHとSTARTTLSに対応するように、ソースからインストールします。

と思いましたが、続きは次回に。