postfix logo Postfixのぺーじ
− AMaViSとSophos Anti-Virusによるウィルススキャン
更新: 2005年2月19日 [English Page]


ホームオリジナルドキュメント >AMaViSとSophos Anti-Virusによるウィルススキャン


はじめに

ML の記事 に触発されて、 Postfix にウィルススキャナを導入してみた時の記録です。

ウィルススキャンソフトには、 Sophos Anti-Virus (SAV) for UNIX を用いました。このソフトには30日間のお試し期間があります (以前は FreeBSD/Linux 版の個人利用がフリーと記載された、 SAV の代理店のページが存在しましたが、現在は削除されているようです。 ライセンスに関しては各自でお確かめください)。

ファイルシステム内のみを検索するウィルススキャンソフトでは、 メールに含まれる MIME エンコードされたり uuencode された ウィルスを見つけることはできません。そこで、メールの添付ファイルを デコードしてウィルススキャンソフトに渡すためのインターフェースが 必要となります。

今回は Postfix と SAV のインターフェースには、 Postfix と相性がよいといわれる AMaViS を利用しました。 これは GNU GPL で配布されています。

Postfix-jp ML に山内さんが InterScan VirusWall と組み合わせる方法 を報告されているので、こちらも参照してみて ください。


インストールの前に

Postfix は Release-20010228 PL04 を用いました。

今回のインストールには FreeBSD 4.3 を用いました。 他の環境の方はファイル名などを環境に合わせて読み変えてください。

ダウンロードしたアーカイブは全て /tmp/src にあるものとします。

アーカイブの展開のために unzip などのソフトが必要になるので、 あらかじめインストールしておきます。

また、# はスーパーユーザでの実行をあらわし、% は一般ユーザでの 実行をあらわします。シェルは csh 系を仮定してるので、bsh 系の 方は読み替えて下さい。


Sophos Anti-Virus for UNIX のインストール

アーカイブのダウンロード

ダウンロード のページから、対応するプラットホームの Sophos Anti-Virus (今回は 「Sophos Anti-Virus for FreeBSD (ELFフォーマット)」 [freebsd.elf.tar.Z]) と、「最新ウイルス対応ファイル(IDEファイル)」の 「各バージョンに対応したIDEファイル (IDEファイルを全て含んだZIP圧縮ファイル)」(2001.8.28 現在では 348_ides.zip が最新) をダウンロードします。

Sophos Anti-Virus のコンパイルとインストール

お好みの場所でアーカイブを展開し、コンパイルします。

% setenv SRCDIR /tmp/src
% cd ${SRCDIR}
% tar xvzf freebsd.elf.tar.Z
% cd sav-install
% su
# vi /etc/group   # sweep グループの作成。次の行を追加する。
  sweep:*:12346:
# vipw            # sweep ユーザの作成。次の行を追加する。
  sweep:*:12346:12346::0:0:virus checker:/nonexistent:/sbin/nologin
# rm -f /usr/local/lib/libsavi.*    # アップデートの場合、古いライブラリの削除
# ./install.sh
# less /etc/sav.conf     # 念のために sav.conf の中身をチェック。
# cd ${SRCDIR}
# mkdir ides
# cd ides
# unzip ../348_ides.zip
# cp *.ide /usr/local/sav

(FreeBSD 4 以降の場合のみ)
# /stand/sysinstall
  [Configure] - [Distributions] - [compat3x] を選択し、インストール。

sweep -v で読み込まれている IDE ファイルの情報等が得られます。


AMaViS のインストール

Postfix で AMaViS を利用するには2通りの実装方法があります。

前者はセットアップが簡単ですが、メール配送プログラムとして AMaViS を 使うため、.forward でメールを転送しようとしたり、 procmail などの外部ソフトに渡す場合にはウィルススキャンが 実行されないこと、スキャンのための一時ファイルを world writable な ディレクトリに置く必要があること (sticky bit は使用可能です)、 home_mailbox = Maildir/ が使えないことなどがあります。

後者は Postfix queue デーモンが AMaViS に SMTP でメールを渡し、 Postfix smtpd が AMaViS からスキャンされたメールを受けとるので、 そのような問題はありませんが、若干設定が面倒(らしい)です。

ここではまず、両者に共通な設定を記述します。

AMaViS-perl を利用するには、次の各ソフトが必要になります。

また、次の perl モジュールが必要です。

Perl モジュールを手動でインストールし、 かつ送受信のメールのスキャンをおこなう場合 (AMaViS の configure で --enable-smtp を付ける場合)、

も必要です (参考: [postfix-jp:01318])。 下の自動化をする場合には、Bundle::libnet のインストールに含まれるようです。

CPAN shell で自動的にネットワークから モジュールをインストールすることも可能です。この場合には、

# perl -MCPAN -e shell

を実行してから、プロンプトで

  install Unix::Syslog
  install Convert::UUlib
  install Convert::TNEF
  install Compress::Zlib
  install Archive::Tar
  install Archive::Zip
  install G/GB/GBARR/MailTools-1.15.tar.gz
  install MIME::Tools
  install Bundle::libnet

の順で実行すれば、必要なモジュールが全てインストールされます。 CPAN shell を利用しない場合は、各モジュールのアーカイブを展開し、 全てのモジュールについて以下のコマンドを実行します。

# cd module-dir
# perl Makefile.PL
# make
# make test
# make install

依存関係から、一部のモジュール (MIME-Baes64, IO-stringy, libnet) は 先に入れてやる必要があるかもしれません。

また、ウィルスが検出された時に警告メールが送られる virusalert を aliases に入れておきます。

# vi /etc/aliases   (次の行を追加する)
    virusalert: root

AMaViS のインストール −受信メールのみのスキャン編−

AMaViS の構築

MDA (Mail Delivery Agent) 用のフィルタとして AMaViS を用いるのであれば、 AMaViS の構築はデフォルトのままでよいようです。

AMaViS のダウンロードページ から AMaViS-Perl のソースをダウンロードします (2001.8.28 現在の最新版は amavis-perl-11.tar.gz)。

% setenv SRCDIR /tmp/src
% cd ${SRCDIR}
% tar xvzf amavis-perl-11.tar.gz
% cd amavis-perl-11
% ./configure
% make
% make check
% su
# make install

この設定で AMaViS を使う場合には、ウィルススキャン用の一時ファイルを 置くディレクトリを world-writable にする必要があります。

# chmod 1777 /var/amavis /var/virusmails

Postfix の設定

Postfix 側では、mailbox_command として AMaViS を使うように設定する 必要があります。

# vi /etc/main.cf   (次の行を追加する)
  mailbox_command = /usr/sbin/amavis "$SENDER" "$RECIPIENT"
# postfix reload

Postfix の設定はこれだけです。

ウィルス感染していないメールを送ると、/var/log/maillog には 次のように記録されます。

Aug 28 17:23:07 localhost amavis[55685]: starting.  amavis perl-11 Sat Aug 25 23
:40:10 JST 2001
Aug 28 17:23:08 localhost amavis[55685]: do_exit:400 - ending execution with 0
Aug 28 17:23:08 localhost postfix/local[55683]: BCE053F49: to=<ike@localhost.
localdomain>, relay=local, delay=3, status=sent ("|/usr/sbin/amavis "$SENDER"
 "$RECIPIENT"")

ウィルスに感染したファイルを見つけると、/var/log/maillog には次のように 記録されます。

Aug 28 14:15:43 localhost amavis[55025]: starting.  amavis perl-11 Sat Aug 25 23
:40:10 JST 2001
Aug 28 14:15:44 localhost amavis[55025]: Virus found - quarantined as virus-2001
0828-141544-55025

そして送信者には

    From: postmaster@localhost.localdomain
    To: ike@localhost.localdomain
    Subject: VIRUS IN YOUR MAIL
    Date: Tue, 28 Aug 2001 20:37:21 JST

                            V I R U S  A L E R T

    Our viruschecker found the

            'W32/Sircam-A'

    virus(es) in your email to the following recipient(s):

    -> ike@localhost.localdomain

    Please check your system for viruses, or ask your system administrator
    to do so.

    For your reference, here are the headers from your email:

    ------------------------- BEGIN HEADERS -----------------------------
    (以下略)

という警告メールが、virusalert 宛には

    From: postmaster@localhost.localdomain
    To: virusalert@localhost.localdomain
    Subject: FOUND VIRUS IN MAIL from ike@localhost.localdomain
    Date: Tue, 28 Aug 2001 20:37:21 JST

    A virus was found in an email from:

    ike@localhost.localdomain

    The message was addressed to: 

    -> ike@localhost.localdomain

    The message has been quarantined as:

    /var/virusmails/virus-20010828-203721-56119

    Here is the output of the scanner:

    >>> Virus 'W32/Sircam-A' found in file /var/amavis/amavis-02133168/parts/msg-561
    19-1.com


    Here are the headers:

    ------------------------- BEGIN HEADERS -----------------------------
    (以下略)

というメールが送られます。本来のメールの受信者にはデフォルトでは 送信されません。必要であれば ./configure 時に --with-warnrecip=yes オプションを加えます。


AMaViS のインストール −送受信メールのスキャン編−

AMaViS の README.postfix では送受信両方のメールをスキャンする方法として 2つの方法を上げています。

前者は2つの Postfix を起動する必要がある、ローカルホストから SMTP (port 25) を通さずに送られたメールはスキャンできない、 メールログ解析ツールが(2つの Postfix からのログによって)混乱する おそれがある、といった問題があります。

後者はそれらの問題はありませんが、直接 (デフォルトでは) port 10025 に SMTP 接続されるとウィルススキャンをバイパスできてしまうので、 他のホストからの port 10025 への接続をフィルタリングする必要が あるでしょう。

今回は2つ目の、contents_filter を利用した方法を紹介します。 前者のやりかたは using amavis with postfix (by 佐藤さん) や AMaViS 附属の README.postfix を参照して下さい。

AMaViS の構築

この方法では AMaViS の構築時に、configure にオプションを与える 必要があります。下記の実行例のオプション以外に、AMaViS を動かす デフォルトユーザ vscan、 AMaViS からのメールを受信する SMTP ポート 10025 を変更するには、それぞれ --with-amavis-user=USER--with-smtp-port=PORT といったオプションを与える必要が あります。

% setenv SRCDIR /tmp/src
% cd ${SRCDIR}
% tar xvzf amavis-perl-11.tar.gz
% cd amavis-perl-11
% ./configure --enable-smtp --enable-postfix

ここで

** Configuration summary for amavis perl-11 2001-04-07

で始まる行を見て、configure がうまくいっているか確認してください。

Enable SMTP: no

になっている場合には、libnet モジュール (Bundle::libnet ではない) がインストールされていないかもしれません。 モジュールのインストールの記述を参考に インストールして configure をやり直してください。

% make
% make check
% su
# vipw      # ユーザ vscan の追加。group はとりあえず nobody に入れておく。
  vscan:*:12347:65534::0:0:virus checker:/nonexistent:/sbin/nologin
# make install

こちらの設定では、/var/amavis, /var/virusmails ディレクトリは world-writable にしてはいけません。

% ls -ld /var/amavis /var/virusmails
drwx------  2 vscan  wheel  512   8/28 21:23 /var/amavis/
drwx------  2 vscan  wheel  512   8/28 21:23 /var/virusmails/

Postfix の設定

Postfix 側では、contents_filter 機能を使う設定が必要になります。 詳しくは Postfix のアーカイブに附属の FILTER_README ファイルを 参照して下さい。

# vi /etc/postfix/main.cf   (次の行を追加する)
    content_filter = vscan:
# vi /etc/postfix/master.cf   (以下の行を追加する。継続のための空白も忘れずに。)
    vscan    unix  -   n   n   -   10  pipe user=vscan
       argv=/usr/sbin/amavis ${sender} ${recipient}
    localhost:10025        inet    n   -   n   -   -   smtpd
       -o content_filter=
# postfix reload

これにより、ウィルスに感染したメールが見つかった場合には、 受信専用の設定の時と同じようなログが /var/log/maillog に記録され、警告メールがメール送信者とサーバ管理人 (virusalert) に送られます。


関連リンク



ike@kobitosan.net