2010年7月11日日曜日

amavisd-milter と clamav でウイルス検査を試してみる

Ubuntu 10.04 で Postfix との連携を試しています。
パッケージに、amavisd-new-milter が用意されているのですが、うまく動作しなかったのでソースからインストールすることとしました。
なお、milter manger との連携を考慮しているので、milter manager もインストールしています。


amavisd-new のインストール、設定

amavisd-new と clamav-daemon をインストールする。
$ sudo apt-get install amavisd-new clamav-daemon

clamav でアーカイブの解凍に使用するパッケージをインストールする。
$ sudo apt-get install arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip zoo

amavisd-new と clamav を連携できるように補助グループに加える。
$ sudo adduser clamav amavis

設定ファイルを変更する。

$ sudo vi /etc/amavis/conf.d/50-user
$ perl -ne 'print if (/#----/.../#----/)' /etc/amavis/conf.d/50-user
#------------ 既定値を上書きする設定をこの下に記述する -------------
# 自ホスト名を設定する。
$myhostname = "imap.example.com";
# content_filter は使用しないので、リッスンしない。
$inet_socket_port = undef;
# ウイルス検査を有効にする。
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
# 送信ドメイン認証 (DKIM) を無効にする。
$enable_dkim_verification = 0;
# Don't be verbose about sending mail:
#@whitelist_sender_acl = qw( .$mydomain );
@whitelist_sender_acl = qw( );
$final_virus_destiny = D_REJECT; # (defaults to D_BOUNCE)
$final_banned_destiny = D_REJECT; # (defaults to D_BOUNCE)
$final_spam_destiny = D_PASS; # (defaults to D_REJECT)
$final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested
$virus_admin = 'root@example.com';
$spam_admin = 'root@example.com';
$forward_method = undef;
$notify_method = 'smtp:[127.0.0.1]:25';
#------------ Do not modify anything below this line -------------

clamav-daemon と amavisd-new を起動する。
$ sudo service clamav-daemon restart
$ sudo service amavis restart


amavisd-milter のインストール、設定

開発環境と必要なライブラリをインストールする。
$ sudo apt-get install build-essential libmilter-dev

ソースをダウンロード、展開、ビルド、インストールする。
$ wget http://sourceforge.net/projects/amavisd-milter/files/amavisd-milter/amavisd-milter-1.5.0/amavisd-milter-1.5.0.tar.gz/download
$ tar xzf amavisd-milter-1.5.0.tar.gz
$ cd amavisd-milter-1.5.0
$ ./configure
$ make
$ sudo make install

起動用スクリプトを作成する。
amavisd-new-milter をパッケージでインストール時に作成されるファイルを変更して使っています。
$ sudo vi /etc/init.d/amavisd-new-milter
$ sudo chmod 755 /etc/init.d/amavisd-new-milter
$ cat /etc/init.d/amavisd-new-milter
#! /bin/sh
## amavisd-new-milter をパッケージでインストール時に作成されるファイルを
# 変更して使っています。
### BEGIN INIT INFO
# Provides: amavisd-new-milter
# Required-Start: $syslog
# Required-Stop: $syslog
# Should-Start: $local_fs
# Should-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts the milter for amavisd-new
# Description: milter for sendmail/postfix and amavisd-new
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sbin/amavisd-milter
PARENTDAEMON=/usr/sbin/amavisd-new
NAME=amavisd-milter
DESC="AMaViS Daemons (milter)"
PIDFILE=/var/run/amavis/amavisd-new-milter.pid
WORKDIR=/var/lib/amavis/tmp
PARAMS="-p ${PIDFILE} -w ${WORKDIR} -S /var/lib/amavis/amavisd.sock -s inet:10026@0.0.0.0"
test -f ${PARENTDAEMON} || exit 0
test -f ${DAEMON} || exit 0
set -e
START="--start --quiet --pidfile ${PIDFILE} --chuid amavis --startas ${DAEMON} --name ${NAME} -- ${PARAMS}"
case "$1" in
start)
echo -n "Starting $DESC: "
sudo chmod 750 ${WORKDIR}
if start-stop-daemon ${START} >/dev/null 2>&1; then
echo "${NAME}."
else
if start-stop-daemon --test ${START} >/dev/null 2>&1; then
echo "(failed)."
exit 1
else
echo "(already running)."
exit 0
fi
fi
;;
stop)
echo -n "Stopping $DESC: "
if start-stop-daemon --stop --quiet --retry 10 --name ${NAME} \
--pidfile ${PIDFILE} \
--startas $DAEMON >/dev/null 2>&1; then
echo "${NAME}."
else
if start-stop-daemon --test ${START} >/dev/null 2>&1; then
echo "(not running)."
exit 0
else
echo "(failed)."
exit 1
fi
fi
;;
restart|force-reload)
$0 stop
exec $0 start
;;
*)
N=/etc/init.d/amavisd-new-milter
#echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0

amavisd-milter をサーバ起動時に起動するように設定する。
$ sudo update-rc.d amavisd-new-milter defaults


Postfix の設定

milter manager を使用せず、直接 amavisd-milter と接続する方法です。
$ sudo vi /etc/postfix/main.cf
$ perl -ne 'print if (/# for milter/.../^\s/)' /etc/postfix/main.cf
# for milter
milter_default_action = tempfail
smtpd_milters = inet:[127.0.0.1]:10026

※ amavisd-milter サーバがローカルでなければ、[127.0.0.1] の代わりに amavisd-milter サーバに接続するためのアドレスを指定します。

milter-manager を使用する場合の設定です。
$ sudo vi /etc/postfix/main.cf
$ perl -ne 'print if (/# for milter/.../^\s/)' /etc/postfix/main.cf
# for milter manager
milter_protocol = 6
milter_default_action = tempfail
milter_mail_macros = {auth_author} {auth_type} {auth_authen}
smtpd_milters = unix:/private/milter-manager.sock

設定を変更したら Postfix の設定を読み直します。
$ sudo service postfix reload


milter manager の設定

現在の設定を確認します。
$ milter-manager --show-config | egrep -v '^\s*#|^$' | perl -ne 'print if (/amavisd-new-milter/...'end')

ソケットを指定が正しくなかったので、上記の設定の確認の出力を /etc/milter-manager/milter-manager.local.conf に貼り付けて編集します。

$ sudo vi /etc/milter-manager/milter-manager.local.conf
$ cat /etc/milter-manager/milter-manager.local.conf
define_milter("amavisd-new-milter") do |milter|
milter.connection_spec = "inet:10026@[127.0.0.1]"
milter.enabled = true
end


詳細は、こちらを参照してください。


参考

0 件のコメント: