home FreeBSD Bike Misc Memorandum About

AntiVir with postfix

コンテンツフィルタの考え方

 postfix のマニュアルを読めばわかるのですが、コンテンツフィルタの考え方は以下のとおりです。

      ..................................
: Postfix :
----->smtpd \ /local---->
: -cleanup->queue- :
---->pickup / ^ | \smtp----->
: | v :
: smtpd smtp :
: 10025 | :
......................|...........
^ |
| v
....|............
: | 10024 :
: contents : : filter :
: :
.................

つまり、SMTPを 25 番ポートと 10025 番ポートの両方で開いておきます。メールを 25 番ポートから受け取り、10024 番ポートで待っているコンテンツフィルタ (ここではウィルススキャンプログラム) に渡します。コンテンツフィルタは所望の処理をした後に、 localhost の 10025 番ポートに渡します。Postfix は受け取ったデータを通常通り配送するだけです。

10025番ポートに直接繋げにこられるとコンテンツフィルタは通らないので、このポートは外部からは接続できないように、しかるべき手段で防衛しておきます。

個人利用登録とダウンロード

まず、ソフトのダウンロードと登録をしてライセンスを入手します。Webから登録をしてライセンスが届くのに少し時間がかかるかもしれないので、先に個人利用登録をします。AntiVir for Linux - Private User Registration

それからダウンロードします。 Downloads 内にある、AntiVir MailGate FreeBSD をダウンロードします。

インストール

適当なディレクトリでダウンロードしたファイルを展開します。

$ tar xvzf avfbmgt.tgz
$ cd antivir-mailgate-2.0.1.16/avmailgate/

このディレクトリ内の INSTALL, INSTALL.postfix, README.FreeBSD を読みます。これらの内容に従えばインストールできるはずです。しかし、多分に趣味的な問題により、いくつかは自分に合わせて読み替えます。以下に記述する内容の中には、必要ないものもあります。

AntiVir を実行するユーザとグループを作成します。私は antivir:antivir としました。

$ su
# vi /etc/group
antivir:*:92:
# vipw
antivir:*:92:92::0:0:virus scan user:/nonexistent:/sbin/nologin

AntiVir の実行バイナリとウィルス定義ファイルを格納するディレクトリを作成し、そこにコピーします。

# mkdir /usr/local/lib/antivir
# cp vdf/antivir.vdf /usr/local/lib/antivir/
# cp bin/antivir /usr/local/lib/antivir/
# chown -R antivir:antivir /usr/local/lib/antivir

設定ファイルを格納するディレクトリを作成し、そこにコピーします。

# mkdir /usr/local/etc/antivir
# cp etc/* /usr/local/etc/antivir/

デーモンとして動作するファイルをコピーします。

# cp bin/avgated /usr/local/sbin/
# cp bin/avgatefwd /usr/local/sbin/

AntiVir が使用するスプールディレクトリを作成します。

# mkdir /var/spool/avmailgate
# mkdir /var/spool/avmailgate/incoming
# mkdir /var/spool/avmailgate/outgoing
# mkdir /var/spool/avmailgate/rejected
# chown -R antivir:antivir /var/spool/avmailgate
# chmod -R 700 /var/spool/avmailgate

AntiVir のPIDを格納するディレクトリをつくります。

mkdir /var/run/antivir
chown antivir:antivir /var/run/antivir

そろそろライセンスが添付されたメールが届いているかもしれません。確認してインストールしましょう。添付されている hbedv.key をコピーします。

# cp hbedv.key /usr/local/lib/antivir/avmgate.key
# chown antivir:antivir /usr/local/lib/antivir/avmgate.key

AntiVirの設定と起動

別にやらなくてもいいのですが、ポートを名前で指定できるように、/etc/services に以下の行を加えます。

# Content Filter for postfix
antivir 10024/tcp #Port for avgated
smtp-backdoor 10025/tcp #Port for postfix backdoor

/usr/local/etc/antivir/avmailgate.conf を編集します。私が編集したのは以下の通りです。

# User uucp
# Group uucp
User antivir
Group antivir
# ------------------------------------------------------------------------
# AntiVirDir /usr/lib/AntiVir
AntiVirDir /usr/local/lib/antivir
# ------------------------------------------------------------------------
# PidDir /var/tmp
PidDir /var/run/antivir
# ------------------------------------------------------------------------
# ListenAddress 0.0.0.0 port 25
ListenAddress localhost port antivir
# ------------------------------------------------------------------------
# ForwardTo SMTP: localhost port 825
ForwardTo SMTP: localhost port smtp-backdoor

/usr/local/etc/antivir/avmailgate.acl を適当に編集します。私の場合は以下となります。

# Access lists for AvMailGate

# These hosts and/or domains are local.
local: localhost
local: f-bell.net

# These hosts and networks are allowed to relay.
relay: 127.0.0.1/8 192.168.1.0/24

ウィルス定義ファイルのアップデート

# /usr/local/lib/antivir/antivir --update

ここまで設定して、AntiVir側を起動します。

# avgated -C /usr/local/etc/antivir/avmailgate.conf -A /usr/local/etc/antivir/avmailgate.acl
# avgatefwd -C /usr/local/etc/antivir/avmailgate.conf -A /usr/local/etc/antivir/avmailgate.acl

改行されていますが、1行で入力します。
なお、このコマンドはなにも指定しないと、/etc/avmailgate.conf, /etc/avmailgate.acl を読み込みますので、READMEどおりインストールしていると、

# avgated
# avgatefwd

だけでOKです。

ウィルス定義ファイルを自動的に取得するように/etc/crontab に以下の行を加えます。各列はタブ区切りにした上、時間は適当に決めてください。

0   4   *   *   *   root   /usr/local/lib/antivir/antivir --update -q

postfixの設定と再起動

この設定が何を意味するかは、postfixのドキュメントをよく読んで理解してください。

/usr/local/etc/postfix/master.cf に以下の設定を加えます。

smtp inet n - n - - smtpd
localhost:smtp-backdoor inet n - n - - smtpd -o content_filter=

/usr/local/etc/postfix/main.cf に以下の設定を加えます。

# Antivir Einbindung
content_filter = smtp:127.0.0.1:10024

postfixを再起動します。

# /usr/local/etc/rc.d/postfix.sh reload

以上で終了です。

確認

このサーバを使って送受信するメイルには以下のヘッダが追加されます。

X-AntiVirus: checked by AntiVir MailGate (version: 2.0.1.16; AVE: 6.22.0.1; VDF: 6.22.0.40; host: pippo.f-bell.net)

また、メールはAntivir と postfix の間を行き交うので、こんなreceivedヘッダもつきます。

Received: from localhost (localhost [127.0.0.1])
by mail.f-bell.net (Postfix)
with ESMTP id C86F75B for <bell@f-bell.net>;
Tue, 18 Nov 2003 00:33:30 +0900 (JST)
Received: from mail.f-bell.net (localhost [127.0.0.1])
by localhost (AvMailGate-2.0.1.16) id 32130-35B4063D;
Tue, 18 Nov 2003 00:33:30 +0900

再起動したときに AntiVir も自動的に立ち上がるように私は以下のスクリプトを/usr/locale/etc/rc.d/antivir.sh として利用しています。ただし、rc.subr を利用しているので、FreeBSD のportから sysutils/rc_subr をインストールしてください。

#!/bin/sh
#
# PROVIDE: AntiVir
# REQUIRE: DAEMON
# KEYWORD: FreeBSD
#
# Add the following line to /etc/rc.conf or /etc/rc.conf.local
# to enable antivir:
#
# avgated_enable="YES"
# avgated_flags="-C /usr/local/etc/antivir/avmailgate.conf
# -A /usr/local/etc/antivir/avmailgate.acl"
# avgatefwd_enable="YES"
# avgatefwd_flags="-C /usr/local/etc/antivir/avmailgate.conf
# -A /usr/local/etc/antivir/avmailgate.acl

. /usr/local/etc/rc.subr

name=avgated
rcvar=`set_rcvar`

command=/usr/local/sbin/avgated
pidfile=/var/run/antivir/avgated.pid

load_rc_config $name
run_rc_command "$1"

name=avgatefwd
rcvar=`set_rcvar`

command=/usr/local/sbin/avgatefwd
pidfile=/var/run/antivir/avgatefwd.pid

load_rc_config $name
run_rc_command "$1"

rc.subr がなくてもこんな単純なのでも一応起動できるでしょう。

#!/bin/sh

# AntiVir start
if [ -x /usr/local/sbin/avgated ]; then
/usr/local/sbin/avgated
fi

if [ -x /usr/local/sbin/avgatefwd ]; then
/usr/local/sbin/avgatefwd
fi

以上で終了です。

説明

AntiVir は適当な MTA と組み合わせて使う、ウィルススキャンメイルゲートウェイです。ここではPostfixのコンテンツフィルタの機能を使います。

Linux / FreeBSD / OpenBSD 版の個人利用に関しては、レジストレーションをすることで無料で利用できます。

FreeBSD 5.1-Release

Creative Commons License
This work is licensed under a Creative Commons License.