きまぐれほげほげひろば

qmail と clamav(アンチウィルスソフト)の連携で、届いたメールをウィルススキャン

Qmail-Scannerというツールを使って、qmailに届いたメールを途中で横取りしてclamavでメールをウィルススキャンさせます。ほんとならスパムメールも回避させることもできるらしいですが誤判断で削除されるのも嫌なんで今回はパスします。

構築時のOS
FedoraCore2
必要なものはこれだけです(qmail-scannerのREADMEより) qmail-1.03とclam antivirusは既に入っているという前提で。

やっぱり先の見える人はゲゲッとしそう?それよりsuidperlかな・・・仕方ない

完全にインストールせず、コンパイルしたところでreformimeだけ頂きます。ダウンロードから取得するところまで一気に。
$ wget http://optusnet.dl.sourceforge.net/sourceforge/courier/maildrop-1.7.0.tar.bz2
$ bzip2 -cd  maildrop-1.7.0.tar.bz2 | tar xvf -
# cd maildrop-1.7.0
# ./configure
# make
# cp ./rfc2045/reformime /usr/local/bin  #ここで取得。/usr/local/binに移しちゃいます。
これもダウンロードからインストールするところまで一気に。
$ wget http://optusnet.dl.sourceforge.net/sourceforge/tnef/tnef-1.2.3.1.tar.gz
$ tar zxvf tnef-1.2.3.1.tar.gz
# cd  tnef-1.2.3.1
# ./configure
# make
# make check
# make install
これもダウンロードからパッチをあて、インストールするところまで一気に。
あ、qmail稼動してたら止めて下さいね。
$ wget http://www.qmail.org/qmailqueue-patch
$ cd qmail-1.03
$ patch -p1 < ../qmailqueue-patch  #パッチを当てる
$ su -
# cd qmail-1.03
# make clean
rm -f `cat TARGETS`                #cleanしたかったら、代わりにこのコマンドを実行しろってことらしい
# rm -f `cat TARGETS`              #ってことで実行
# make setup 2>&1           #再コンパイル&インストール
# make check
コンパイル後に環境変数QMAILQUEUEに値を設定せずに稼動させても問題なく動きますのでご安心を。qmailのホームディレクトリが/var/qmailではないときは例外

あ、qmailの再起動をお忘れずに

これもダウンロードからインストールするところまで一気に。しかしちょっと方法が違います。この手順でダウンロードからインストールまでしてくれます♪
# perl -MCPAN -e shell 
←はじめてだったらこの間に設定の質問を沢山聞かれる。サーバーの選択以外ほとんどデフォルトでOK
cpan> o conf prerequisites_policy follow
cpan> install  Time::HiRes
cpan> q
まずはsuidperlが入っているか確認します。
# which suidperl   ←存在しないかチェック
ここで何も表示されなかったら、インストールされていないのでインストールします。
RPMがあるので、これでOK!
# yum install perl-suidperl
はじめにダウンロード・展開します
# wget http://optusnet.dl.sourceforge.net/sourceforge/qmail-scanner/qmail-scanner-1.23.tgz
$ tar zxvf qmail-scanner-1.23.tgz
次にrootになってqmail-scannerで利用するユーザを作成します。(ログイン不可の設定で)
# groupadd qscand
# useradd -g qscand -s /bin/false -d /dev/null qscand
次にconfigureを実行してインストールしますが、ここでqmailにパッチが当たっていないとエラーとなります。(この手順で行っていればパッチは当たっているはず)
#./configure --scanners clamdscan --lang ja_JP.EUC --admin root  --domain メールを送信するドメイン --notify admin --install

--admin --domainオプションで、通知メールの管理者宛アドレスが決まります。--notifyオプションで誰に通知メールを送るか決めれます。詳しくは付属のドキュメントを(爆)

最後に以下のコマンドを実行すると設定を初期化して使えるようになります。
# setuidgid qmaild /var/qmail/bin/qmail-scanner-queue.pl -g
perlscanner: generate new DB file from /var/spool/qmailscan/quarantine-attachments.txt
perlscanner: total of 9 entries.

Can't do setuid
と出た場合suidperlのインストールが必要です。

ウィルススキャンさせるには、当然clamdが起動していなければなりませんし、qmailがqmail-scannerを実行できるように起動しなければなりません。

まずはqmailの起動スクリプトの編集から・・・
パッチで設定できるようになった環境変数QMAILQUEUEの値にqmailscannerのパスを設定します
# vi /etc/rc.d/init.d/qmail
#!/bin/sh
PATH=PATH:〜(省略)〜
QMAILQUEUE=/var/qmail/bin/qmail-scanner-queue.pl ←はじめの方に追加
export QMAILQUEUE                                ←はじめの方に追加
 
 (省略)
  
qmailの起動
# service qmail start
次にclamdを起動
# clamd
最後に起動確認。
以下のコマンドを実行すると、正常メールとスパムメール、テストウィルスつきのメールがrootに向けて飛びますので、正常に稼動しているか確認できます。
# ./contrib/test_installation.sh -doit
計4通飛んで1通目(正常)と4通目(スパムもどき)が--adminで設定したアドレスに届きます。2通目と3通目が、テストウィルス付きで隔離ディレクトリに隔離され宛先には届きません。
メールヘッダーに X-Qmail-Scanner を付加するには
# vi /var/qmail/bin/qmail-scanner-queue.pl
my $descriptive_hdrs=1; ←該当行:0から1に値を変更
ウィルス駆除報告メールの表題(タイトル)の文字化けをなくす
# vi /var/qmail/bin/qmail-scanner-queue.pl
my $qmailinject = '/usr/bin/nkf -j | /var/qmail/bin/qmail-inject';←該当行:qmail-injectの前にnkfコマンドで文字コードをJISに変換
タイムアウトで落ちたスキャンファイルがゴミとして残るので掃除させます
#crontab -e
0 0 * * * /var/qmail/bin/qmail-scanner-queue.pl -z
隔離ディレクトリにたまったウィルス付きメールを30日たったら削除
#crontab -e
0 * * * * find /var/spool/qmailscan/quarantine/new/* -mtime +30 -exec rm '{}' \;
戻る