環境は以下のとおり。
- linux-3.12.13 (amd64: これが重要!)
- clamav-0.98.1
1. fanotify サポートの有効化
1.1 カーネルオプション
gentoo-sources ではデフォルト無効だった。File systems ---> [*] Filesystem wide access notification
1.2 ClamAV
Gentoo ebuild では 2014 年 3 月現在、clamav の fanotify サポートが無効化 (--disable-fanotify
) されており、オンアクセス スキャンが使用できない。けれども、x86 / amd64 では fanotify サポートを無効化しなくとも動作させることができるので、当該オプションを削除して fanotify サポートを有効化させることが可能。2. サブディレクトリの検索
オンアクセス スキャンの対象ディレクトリは clamd.conf の OnAccessIncludePath で指定することになるが、当該ディレクティブはサブディレクトリを対象としない。つまり、OnAccessIncludePath /
と指定しても ~/eicar.com へのアクセスはスキャンされない。これは期待された動作らしい (!)。私が期待する動作は (サブディレクトリも含めて) ファイルシステム全体をスキャンすることだったため以下のようにコードを変更した。--- a/clamd/fan.c 2014-01-13 12:02:18.000000000 -0500
+++ b/clamd/fan.c 2014-03-23 20:33:12.382967001 -0400
@@ -134,7 +134,7 @@
if((pt = optget(tharg->opts, "OnAccessIncludePath"))->enabled) {
while(pt) {
- if(fanotify_mark(fan_fd, FAN_MARK_ADD, fan_mask, fan_fd, pt->strarg) != 0) {
+ if(fanotify_mark(fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT, fan_mask, fan_fd, pt->strarg) != 0) {
logg("!ScanOnAccess: Can't include path '%s'\n", pt->strarg);
return NULL;
} else
FAN_MARK_MOUNT はマウントポイント全体を対象にするオプションのためサブディレクトリの検索とは異なるが、まあファイルシステム全体を対象にしてスキャンする使い方には問題がない。3. ebuild とパッチ
ClamAV か関連の上記 2 点に対応した ebuild とパッチ (x86 / amd64 用) を https://github.com/drmn/portage/tree/master/app-antivirus/clamav に置いた。参考
- Bug 487016 - app-antivirus/clamav-0.98 - In file included from fan.c:38:0: fan-syscalllib.h:14:3: error: #error "System call numbers not defined for this architecture": https://bugs.gentoo.org/show_bug.cgi?id=487016
- Re: [clamav-users] On access scan: OnAccessIncludePath not recursive?: http://lurker.clamav.net/message/20140211.000257.074083c7.ja.html
履歴
- 2014/03/26: カーネルオプションについて追記、FAN_MARK_MOUNT に関する説明の誤りを訂正 (K 氏ご指摘)