manekineko倉金家ホームページ

趣味の部屋/インターネットサーバー/サーバー構築メモ その2

ウィルス対策

2010年10月12日(火) 2010年10月27日(水)更新
サーバーのウィルスチェックをやります。
Clam AntiVirus(clamav)を使うことにします。
併せてメール用のスキャナclamsmtpも設定しておきます。


サーバーのウィルスチェックにウィルス対策ソフトを導入します。
Linuxに容易に?インストール、稼働できてしかも無料といえば真っ先に思いつくのが Clam AntiVirus(clamav)ですが、今回もこれを使います。
併せてメールのウィルスチェック用にclamsmtpもインストールしておきます。

インストール
当初できるだけrpmでインストールしようと思い、clamav関係とclamsmtpのrpmパッケージがあるEPELよりすべてインストールしてみました。しかし、
1.EPELのclam関係はかなり大幅に改変されており、その意図もよくわからず、今までと違いすぎてたいへん使いにくい。
2.バージョンが古く、freshclamによるデータアップデートのたびに警告が出る。 今後バージョンアップフォローがちゃんとなされるのか非常に不安。(ちなみにインストールされたバージョンは1年以上前のもの。)
3.情報が少なく設定や稼働に不安。
ということがあり、特にウィルススキャナは常に最新であることが重要なため、どうしても遅れがちな(あるいはフォロー不足の)ディストリビューションのrpmは使わないのが賢明そうだという印象を得ました。
で、EPELからいれたのは思い切りすべてアンインストール。
気をとりなおして再挑戦。
次にrpmforgeを見てみるとclamavのバージョンは最新ですが、clamsmtpはありません。別途考えることにします。
yumex(Yum Extender)でclamav,clamd,clamav-dbをインストール。今回のバージョンは0.96-3でした。

設定
まずはウィルスデータベースの更新を設定します。
/etc/freshclam.conf を編集。...と思いましたが、そのままでいいようです。

データベースを更新してみます。
# freshclam
なんたらかんたら言いながらデータベースを更新しています。
# freshclam
ClamAV update process started at Tue Oct 19 20:39:05 2010
main.cvd is up to date (version: 52, sigs: 704727, f-level: 44, builder: sven)
WARNING: getfile: daily-11979.cdiff not found on remote server (IP: 120.29.176.126)
WARNING: getpatch: Can't download daily-11979.cdiff from db.jp.clamav.net
WARNING: getfile: daily-11979.cdiff not found on remote server (IP: 203.178.137.175)
WARNING: getpatch: Can't download daily-11979.cdiff from db.jp.clamav.net
WARNING: getfile: daily-11979.cdiff not found on remote server (IP: 219.94.128.99)
WARNING: getpatch: Can't download daily-11979.cdiff from db.jp.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 12154, sigs: 140550, f-level: 53, builder: ccordes)
Downloading bytecode.cvd [100%]
LibClamAV Warning: Cannot prepare for JIT, because it has already been converted to interpreterbytecode.cvd updated (version: 82, sigs: 10, f-level: 53, builder: edwin)
Database updated (845287 signatures) from db.jp.clamav.net (IP: 203.212.42.128)
WARNING: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.sock
connect(): No such file or directory
clamdのソケットがないのでつなげられないよと言っています。
少し早いけどclamdの起動設定もしておきます。
# chkconfig --list clamd で確認。
自動起動は設定されていました。

/etc/clamd.conf を確認。ほとんどそのままでいいようですが、少し好みで変更。
LogFileMaxSize 1M
SelfCheck 3600

clamdを起動してみます。
# service clamd start
Starting Clam AntiVirus Daemon: WARNING: Running on 32-bit system, and RLIMIT_DATA > 2GB, lowering to 2GB!
LibClamAV Warning: Cannot prepare for JIT, because it has already been converted to interpreter    [ OK ]
いちおう起動するのですが、なにかがちゃんと設定されてないのかなと思いつつ、設定ファイルなどを見てみました。

WARNING: Running on 32-bit system,... についてはわかりません。検索してみるとどうやらバグのようです。実害はなさそうなので気にしないことにします。
LibClamAV Warning: Cannot prepare for JIT,... については、freshclam.confの最後のほうにある
#Bytecode yes を
Bytecode no とし、
/var/clamav の bytecode.cvd を捨ててしまえば出なくなることまではわかりましたが、出ても問題はなさそうなのでそのままにしておきます。
[追記]2010.10.27 clamav,clamdのバージョンアップが出ていましたのでアップデートしたらこれらのWARNINGは出なくなりました。

設定の確認をしていて、ふと設定ファイル /etc/clamd.conf と起動スクリプト /etc/rc.d/init.d/clamd とでソケットの記述が違うのに気がつきました。
停止時の設定なのでそのままでも実害はないとおもわれますが、いちおう起動スクリプトのほうを訂正しておきます。
stop() { } の中の
  rm -f /var/clamav/clamd.socket を設定ファイルにあわせて
  rm -f /var/run/clamav/clamd.sock に訂正。

動作テスト
ためしにスキャンしてみます。
# clamscan -i -r --log=/var/log/clamav/clamscan.log /home/kiyoshi
----------- SCAN SUMMARY -----------
Known viruses: 843313
Engine version: 0.96.3
Scanned directories: 119
Scanned files: 448
Infected files: 0
Data scanned: 33.39 MB
Data read: 32.26 MB (ratio 1.03:1)
Time: 9.219 sec (0 m 9 s)
ということで、ウィルスはみつかりません。
/var/log/clamav/clamscan.log にログが記録されています。

http://www.trendmicro.co.jp/download/test-virus.asp よりテスト用ウィルスをダウンロードし、検出できるか試してみます。同様にスキャン。
# clamscan -i -r --log=/var/log/clamav/clamscan.log /home/kiyoshi
/home/kiyoshi/eicar.testvirus: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 843313
Engine version: 0.96.3
Scanned directories: 119
Scanned files: 449
Infected files: 1
Data scanned: 33.39 MB
Data read: 32.26 MB (ratio 1.03:1)
Time: 9.384 sec (0 m 9 s)
OK!

Daily Check
隔離ディレクトリ/var/tmp/clamav/clamscanを作り、UID:GIDをclamav:clamavとし、書込権限を与えておきます。
以下の方針でウィルスチェックを定期的に行うようにスクリプトを書いて /etc/cron.daily に置いておきます。
1.指定したフォルダをチェックします。全部やるとすごい時間がかかるので、最低限外部からデータの入ってくるフォルダのみとします。
2.スキャンした記録を/var/log/clamscan.logに累積で記録。
 一回のみの結果を /var/log/viruscheck.log に記録。
3.ウィルスが見つかったら/var/tmp/clamav/clamscanへ隔離し、rootへメール。
4.他の動作が遅くならないよう低優先度で動作。

スキャンスクリプトを
結果、ためしに置いたウィルスはちゃんと隔離され、警告メールを受け取り。ログもちゃんと記録されています。
実行優先度を下げても他のプロセスが動いてなければ時間は変わりませんでしたが、実行中にブラウザなどを使ってみると少し遅くなる程度で優先度を指定しておくのは正解そうです。
さらに/etc/logrotate.d/clamscanをつくり、ログがrotateされるように変更しておきます。

ログローテートスクリプトを

以上でclamavのインストールと設定は完了。
引き続いてメールスキャン用のclamsmtpをやっておきます。

clamsmtpdインストールと設定
EPELにclamsmtpのrpmがあったのでそのままインストールしようとしたらFile conflictとやらでエラーになりましたのでソースからビルドし、インストールします。

http://www.inet.lt/clamsmtp/ にclamsmtpのソースと簡単なインストール手順があります。
最新ソースをゲット。
$ cd ~/rpm/SRPMS/
$ wget http://www.inet.lt/clamsmtp/clamsmtp-1.10-1.src.rpm
いちおう展開してspecなど見てみましたが特に変更するところもなさそうなので引き続きビルド
$ rpmbuild --rebuild clamsmtp-1.10-1.src.rpm
~/rpm/RPMS/i386 にclamsmtp-1.10-1.i386.rpm ができますのでインストール。
$ cd ../RPMS/i386/
$ su
念のためテスト。
# rpm -ivh --test clamsmtp-1.10-1.i386.rpm
OKのようなのでインストール。
# rpm -ivh clamsmtp-1.10-1.i386.rpm

/etc/clamsmtpd.conf を編集。変えたところ:
Header: X-Virus-Scanned: ClamAV using ClamSMTP
TempDirectory: /var/tmp/clamav/clamsmtp
Action: drop
Quarantine: on
User: clamav
VirusAction: /usr/local/bin/virusalert.sh

感染ファイル隔離用ディレクトリ /var/tmp/clamav/clamsmtp をつくり、UID:GIDをclamav:clamavとし、書込権限を与えておきます。
ウィルスが見つかったときのメール通知スクリプトvirusalert.shをつくり、/usr/local/binに置いておきます。
/etc/yum.confと/etc/yumex.confの各々のexcludeにclamsmtp*を追加し、アップデート対象から外しておきます。
通知スクリプト
ちょっと早いけど、起動設定とテスト起動。
# chkconfig clamsmtpd on
# service clamsmtpd start
OKです。
このあとpostfixにclamsmtpdを使ってのメールスキャンの設定をします。

その他
VineLinux4ではcrondのソケットやclamsmtpdの作業ディレクトリがなぜか時折(月に1回くらい)落ちていることがあります。
データベースのアップデート中にチェックが重なると落ちることがあるとの噂。
CentOS5ではまだわかりませんが、念のためチェックスクリプトを作って/etc/cron.hourlyに置いておきます。
チェックスクリプト