更新日 2004/9/14

qmailとqmail-scannerでのanti-virus

SoftwareDesign 2004年10月号で執筆したものは、postfixの場合だけですが、qmailを使用した場合にantivirusをする場合について記述します。

netqmail

突然ですが、netqmailを皆さんご存じでしょうか?netqmailとはqmail-1.03のそのままのソースと、qmailの主なパッチをセットにした物です。
基本的にqmailと同じインストール方法と同じ使い方で使用できます。

qmailだけでは、Anti-Virusソフトと組み合わせることができないので、ラッパープログラムが必要になります。postfixと違ってqmailでは、これらのラッパープログラムを挟むことができるようはなっていないために、挟み込むためにpatchが必要になります。
普通のqmailではpatchが必要になりますが、説明したnetqmailではそれらのpatchもすでに含まれているために、今回はnetqmailを使用して構築していきたいと思います。

netqmailと組み合わせる物としては、qmail-ScannerとClam AntiVirusを使用します。 これらもすべてオープンソースで構成されているために、基本的にはどのOSでも使用できるはずです。

また、今回はDebian GNU/Linux 3.0上で構築していきます。

netqmailのインストール前の準備

Debianは通常のインストール方法では、eximというMTAが動作しています。netqmailはパッケージ管理しないために、eximをアンインストールしてしまうと、様々なsoftがMTAがないと言うことで問題になるために、eximは停止させておくだけにします。
Debianでは下記のようなコマンドを実行してeximを停止させます。
 # update-rc.d -f exim remove
次に、/etc/inetd.confのsmtpのエントリーがexim用になっているために、それも#でコメントアウトします。その後、inetdを再起動させます。

netqmailの取得

netqmailはqmail.orgにありますので、近くのミラーサイトから取得します。ミラーサイトを使用しない場合には、wgetを使用して下記のように取得します。
 # wget http://www.qmail.org/netqmail-1.05.tar.gz
netqmailでは、まだ一部足りないpatchがあるので、それも取得します。Receivedヘッダをローカルタイムゾーンで表示させるためのpatchとして下記のように取得します。
 # wget http://www.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
取得した2つのファイルは、/tmp/以下に移動させます。
netqmailのアーカイブを展開後、netqmailディレクトリに移動し、collate.shを実行します。collate.shを実行することにより、無垢のqmailにpatchが適用され、netqmailとなります。
 # cd /tmp/
 # tar xvfz netqmail-1.05.tar.gz
 # cd netqmail-1.05/
 # ./collate.sh
次に、ローカルタイムパッチを適用します。
 # patch < /tmp/qmail-date-localtime.patch
あとは、通常のqmailのインストール方法と同じです。qmailのインストール先と、qmailのグループとユーザーを作成します。
 # mkdir /var/qmail
 # groupadd nofiles
 # useradd -g nofiles -d /var/qmail/alias alias
 # useradd -g nofiles -d /var/qmail qmaild
 # useradd -g nofiles -d /var/qmail qmaill
 # useradd -g nofiles -d /var/qmail qmailp
 # groupadd qmail
 # useradd -g qmail -d /var/qmail/ qmailq
 # useradd -g qmail -d /var/qmail/ qmailr
 # useradd -g qmail -d /var/qmail/ qmails
その後、コンパイルをします。
 # cd netqmail-1.05
 # make
インストールをしてチェックをかけます。
 # make setup check
今回このサーバーは、debian.example.comとし、example.comのメールを受信する設定を行います。
 # ./config-fast debian.example.com
これだけだと設定が十分ではないので、/var/qmail/control/以下のlocalsとrcpthostsのファイルにexample.comのエントリを追記します。追記する場合には、1行につき1つを書きます。/var/qmail/control以下のファイルはすべて同様に設定します。
設定が完了したら、下記のコマンドのようにしてqmailを起動させます。
 # /var/qmail/boot/home &
プロセスを確認します。下記のようなプロセスが起動していれば、問題ありません。
 # ps axuww | grep qmail
 qmails    9951  0.7  0.1  1296  364 pts/0    S    11:12   0:00 qmail-send
 qmaill    9952  0.1  0.1  1260  428 pts/0    S    11:12   0:00 splogger qmail
 root      9953  0.0  0.1  1252  300 pts/0    S    11:12   0:00 qmail-lspawn ./Mailbox
 qmailr    9954  0.1  0.1  1248  296 pts/0    S    11:12   0:00 qmail-rspawn
 qmailq    9955  0.1  0.1  1244  320 pts/0    S    11:12   0:00 qmail-clean
 root      9957  0.0  0.1  1332  424 pts/0    S    11:13   0:00 grep qmail
次に、外部からメールを受け取るためのプログラムの用意をしないといけませんが、qmailを使用した場合には通常tcpserverを使用するようになっているかと思います。
確かに、大規模なサイトなどではtcpserverを使用した方が良く、人によってはinetdなどは使用せずに、すべてをtcpserver経由にしてしまう人もいます。
しかし今回は、あまり使用されないxinetd経由でのqmailの使用方法をご紹介しようと思います。

xinetdの設定

通常の最近のディストリビューションでは、xinetdが標準になりつつあります。しかし、Debianではinetdが標準で利用されています。
inetdのままでも良いのですが、他でも使用しやすいように、xinetdにします。
まず、xinetdをインストールします。
 # apt-get install xinetd
途中でinetd.confをxinetd.confに変換するかを聞かれるので、<yes>を選択します。
次に、xinetd.confに下記の設定を追記します。
 service smtp
 {
         disable         = no
         flags           = REUSE NAMEINARGS
         socket_type     = stream
         protocol        = tcp
         wait            = no
         user            = qmaild
         server          = /usr/sbin/tcpd
         server_args     = /var/qmail/bin/tcp-env -R /var/qmail/bin/qmail-smtpd
 }
/etc/hosts.allowに下記を追記します。メールを受信するために一番最後の行は必須です。他の行は、メールのリレーを許可するサーバーやIPを指定します。
 tcp-env : 192.168.1. : setenv = RELAYCLIENT
 tcp-env : localhost : setenv = RELAYCLIENT
 tcp-env: 127.0.0. : setenv RELAYCLIENT
 tcp-env: ALL
この設定後に、xinetdを再起動します。再起動後に、netstatなどで、25番がLISTENされているかを確認する。
最後に、このサーバー内に存在しているユーザーあてにメールを送信して確認します。ユーザーのホームディレクトリ内にMailboxというファイルができて、そのなかに送信したメールが届いていれば完了です。
届いていない場合には、/var/log/mail.logを見て確認してください。

問題なくメールが届くようになったら後は、REMOVE.binmailとREMOVE.sendmailに従って、各種コマンドをqmailのものを使用するようにします。
また、qmailのinitスクリプトを作成して、/etc/init.d/qmailへ配置します。qmailのinitスクリプトは、いろいろなサイトのものを参考に自分に合ったものを作成しましょう。「Life with qmail」というqmailを使用する時の便利な情報がいろいろと書かれているサイトにある物を利用するなどすると良いでしょう。

Clam AntiVirus

Anti-Virusソフトには、postfixの時にも使用したClam AntiVirusを使用します。説明等はpostfixの項目を参照してください。
deb形式のバイナリも配布されているために、今回はパッケージを使用します。

Clam AntiVirusのページからバイナリdownloadのページのlinkをたどり、woody用のバイナリをhttp://people.debian.org/~sgran/debian/からダウンロードします。ダウンロードすべきパッケージはpool/woody/main以下にあり、下記のパッケージです。
 clamav_0.74-1_i386.deb
 clamav-base_0.74-1_all.deb
 clamav-daemon_0.74-1_i386.deb
 clamav-freshclam_0.74-1_i386.deb
 ucf_1.05_all.deb
 libclamav1_0.74-1_i386.deb
ダウンロードが完了したらインストールをします。まずは必要なライブラリをインストールした後に、clamavのパッケージをインストールします。
 # apt-get install libgpm3
 # dpkg -i ./clamav_0.74-1_i386.deb ./clamav-base_0.74-1_all.deb \
   ./clamav-daemon_074-1_i386.deb  ./clamav-freshclam_0.74-1_i386.deb \
   ./ucf_1.05_all.deb  ./libclamav1_0.74-1_i386.deb
インストールすると、Clam AntiVirusのパターンをどのように更新するかを聞かれるので、daemonを選択後、サーバーはそのままEnterを押して、proxyは使用しない場合にはそのままEnterを押します。Clam AntiVirusの動作確認は、postfixで説明したようにeicarのテスト用ウィルスを取得して、clamscanコマンドを実行して動作を確認してください。

Qmail-Scanner

Qmail-Scannerは、さまざまなAnti-Virusと組み合わせができるラッパーソフトです。今回使用するClam AntiVirusは勿論の事、さまざまな商用のAntiVirusのソフトと組み合わせることができます。
今回は、qmailとQmail-Scannerを組み合わせるので、下図のような構成となります。

Qmail-Scannerとqmailを組み合わせるには、先ほど述べたように、qmailに対してpatchが必要なのですが、説明してきたnetqmailを使用する場合にはすでに必要なpatchはすでに適用されている状態になっているために、そのままQmail-Scannerのインストールに進みます。
通常のqmailの場合には、Qmail-ScannerのページにあるQMAILQUEUEパッチを適用後、再度make setup checkをしてインストールしてください。

Qmail-Scannerのインストール

Qmail-Scannerの動作に必要なモジュールがありますので、まずそれらをインストールして行きます。必要なモジュールは下記のモジュールです。
Maildrop
tnef
perl-suid
unzip
perl
libtime-hires-perl

まず、Maildropは全てを使用するわけではなく、reformimeだけを使用するので、アーカイブを取得してmake後に、reformimeだけを取り出します。
bz2なのでbzip2がインストールされていない場合には、展開時にエラーとなるのでインストールをしてください。
 # wget http://keihanna.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2
 # tar xvfj maildrop-1.6.3.tar.bz2
 # cd maildrop-1.6.3
 # ./configure
 # make
 # cp ./rfc2045/reformime /usr/local/bin/
その他のモジュールは、apt-getを使用してパッケージをインストールします。
 # apt-get install perl-suid
 # apt-get install libtime-hires-perl
 # apt-get install tnef
 # apt-get install unzip
Qmail-Scannerをインストールします。Qmail-Scannerは専用のユーザー、グループを作成する必要があるので下記のコマンドで作成します。
 # groupadd qscand
 # useradd -c "Qmail-Scanner Account" -g qscand  -s /bin/false qscand
次に、Qmail-Scannerを取得して、展開後にconfigureスクリプトを実行します。
 # wget http://keihanna.dl.sourceforge.net/sourceforge/qmail-scanner/qmail-scanner-1.22.tgz
 # tar xvfz qmail-scanner-1.22.tgz
 # cd qmail-scanner-1.22
 # ./configure --install
エラーが出た場合には、何かパッケージが足りない場合などがあります。エラー表示にしたがって、インストールするなどの対処をしてください。
問題ない場合には、さまざまな質問が聞かれます。
基本的には、そのままEnterを押して進めていきますが、途中で「scanners="clamdscan_scanner"」と出ているかを確認しながら Enterを押し続ける。インストール時の様子は、ログ5を参照してください。インストールが問題なく完了すると、/var/spool/qmailscanディレクトリに設定ファイルやスキャン履歴ログ、/var/qmail/bin/ディレクトリにqmail-scanner-queue.plが作成されます。

Clam AntivirusとQmail-Scannerの設定

clamAVの設定を一部変更して、Qmail-Scannerと同じ権限で動作するようにします。/etc/clamav/clamav.confのUserエントリを変更して、qscandとします。 /etc/init.d/clamd restartで再起動した後clamAVが動作しているかを確認します。
# ps axuww | grep clam
 clamav     258  0.0  0.3  2036 1000 ?        S    Jul29   0:00 /usr/bin/freshclam \
                                       -d --quiet -p /var/run/clamav/freshclam.pid
 qscand    4618  0.0  5.5 15148 14164 ?       S    10:32   0:00 /usr/sbin/clamd
このように、qscand権限で、clamdが動作しているかを確認します。正しく起動しているかどうかは、clamdのログを参照してください。自分がはまったパターンとしては、ログに下記のよう表示されていて、clamdが起動していなかったことです。ここで正しく起動していないと、次のQmail-Scannerの動作確認時に原因の究明が困難になります。
 Thu xx xx 17:07:56 2004 -> ERROR: Socket file /var/run/clamav/clamd.ctl \
                               could not be bound: Permission denied

Qmail-Scannerの動作確認

clamdが問題なく起動するようになったら、最後に、qmail-scannerのテストを実施します。
 # /root/work/antivirus/qmail-scanner-1.22/contrib/test_installation.sh -doit
root宛に2通のメール(1/4と4/4)が届き、/var/spool/qmailscan/quarantine/new に2通のウィルスつきメール(2/4と3/4)が届きこの結果、configで指定した、つまりvirusadmin@example.com宛てに正常メール(1/4)1通と異常メール(4/4)1通、そして/var/spool/qmailscan/quarantine/newに待避された2通の汚染メール(2/4と3/4)があることが確認できればすべてインストール完了です。各メールのタイトルは下記のようになっています。
Qmail-Scanner test (1/4): inoffensive message
Qmail-Scanner viral test (2/4): checking perlscanner...
Qmail-Scanner viral test (3/4): checking non-perlscanner AV...
[SPAM] Qmail-Scanner anti-spam test (4/4): checking SpamAssassin [if present] (There yours for FREE!)

これで、Qmail-Scannerから先のAnti-Virusの動作の確認は完了しました。

次にqmailに適用したpatchを有効にして、qmail-queueに入る前にQmail-Scannerにメールが流れるように設定します。 qmailの起動スクリプトのコメントではない一番上に下記の行を追記します。
 QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
 export QMAILQUEUE
そして、qmailを再起動します。通常のメーラーからか、telnetでウィルスメールを送って確認してみましょう。telnetでのメール送信、ウィルスメールの送信は、 下記のようにコマンドを実行します。

telnetでのメール送信
  $ telnet 127.0.0.1 25
  MAIL FROM:
  RCPT TO:
  DATA
  Subject: test1
  
   test1
   .

telnetでウィルスメール送信
  # telnet 127.0.0.1 25
  MAIL FROM:
  RCPT TO:
  DATA
  Subject: test2 - virus test pattern
 
  X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Qmail-Scannerのカスタマイズ

Qmail-Scannerはperlですので様々なカスタマイズが可能ですが、主なポイントとしては、/var/spool/qmailscan/quarantine-attachments.txt ファイルがあります。このファイルでは、ウィルスのスキャンの条件等が記載されています。
特定の拡張子のファイルの受け取りを拒否する場合には、このファイルに追記します。 http://www.es.qmail.org/quarantine-attachments.txt などにもありますので、これらを使用するとかこれをベースに設定するなどのが可能です。

他にも、メールのヘッダにX-Qmail-Scannerを付加するようにすることもできます。/var/qmail/bin/qmail-scanner-queue.pl内のmy $descriptive_hdrs=0;となっているのを1とすることによって可能です。


©2003-2004 kensuke.jp all rights reserved. maito:kensuke@kensuke.jp