2014年10月12日日曜日

ClamAV でウィルススキャン

Ubuntu に ClamAV をインストールしてウィルスチェックをしてみました。

ClamAV ではスキャンに時間がかかり過ぎないように、例えば 25MB 以上のファイルはスキャンしないようなデフォルト設定となっているようです。

今回は時間がかかっても、より多くのファイルをスキャンするようにオプションの値を変更したりしてみました。

環境

Ubuntu 14.04 Server

パッケージをインストール

$ sudo apt-get install clamav

ウィルス定義を更新

$ sudo freshclam

試しに / 配下の全てのファイルをスキャン

こんな感じでスキャンしてみました。

$ sudo clamscan -r / | tee result
  • tee により、ファイル毎のスキャン結果を表示しながら result ファイルに結果を保存します。

全てのファイルのスキャンが完了するとサマリが表示されます。

----------- SCAN SUMMARY -----------
Known viruses: 3585372
Engine version: 0.98.1
Scanned directories: 18369
Scanned files: 62580
Infected files: 0
Total errors: 11459
Data scanned: 1277.88 MB
Data read: 1442.80 MB (ratio 0.89:1)
Time: 255.807 sec (4 m 15 s)
  • スキャンされたファイル数は 62,580 でした。
  • 感染していたファイルは 0 でした。
  • しかし、「 Total errors: 11459 」となっており、気になります。

エラーファイルの確認

エラーになってるものを確認するために、結果が保存された result ファイルの中身を確認すると以下のようなものが多数ありました。

/sys/fs/ecryptfs/version: Can't read file ERROR
/sys/fs/ext4/dm-0/inode_readahead_blks: Can't read file ERROR
/sys/fs/ext4/dm-0/mb_max_to_scan: Can't read file ERROR

/sys を mount コマンドで確認してみました。

$ mount | grep ' on /sys'
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /sys/fs/pstore type pstore (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)

/sys は type sysfs で、システム関連の特殊なファイルシステムなのでスキャン対象外とすべきようですが、それ以外の /sys 配下にマウントされたファイルシステム (/sys/fs/cgroup とか) はスキャンしたいです。

また、もう少し clamscan の出力を確認してみると

/proc/sysrq-trigger: Excluded (/proc)
/proc/partitions: Excluded (/proc)
/proc/diskstats: Excluded (/proc)

これらはエラーとしてはカウントされていないようですが、/proc も type proc でマウントされていてシステム関連の特殊なファイルシステムなのでスキャン対象から外すことにします。

まとめると、type sysfs と type proc 以外をスキャン対象とすることにします。

clamscan の man コマンドで調べると --cross-fs=no でファイルシステムをまたいだスキャンはしなくなるようです。

$ man clamscan
... snip ...
       --cross-fs=[yes(*)/no]
              Scan files and directories on other filesystems.
... snip ...

また、以下のようにすると sysfs, porc 以外のファイルシステムのマウントポイントを取得することができます。

$ mount | egrep -v ' type +(sysfs|proc) ' | cut -d ' ' -f 3
/
/sys/fs/cgroup
/sys/fs/fuse/connections
/sys/kernel/debug
/sys/kernel/security
/dev
/dev/pts
/run
/run/lock
/run/shm
/run/user
/sys/fs/pstore
/boot
/sys/fs/cgroup/systemd

ということで、以下のようにスキャンすることにしました。

$ sudo clamscan --cross-fs=no -r $(mount | egrep -v ' type +(sysfs|proc) ' | cut -d ' ' -f 3) | tee result_$(date +%Y-%m%d-%H%M%S)
... snip ...
----------- SCAN SUMMARY -----------
Known viruses: 3605610
Engine version: 0.98.1
Scanned directories: 15368
Scanned files: 62607
Infected files: 0
Data scanned: 1369.05 MB
Data read: 1604.62 MB (ratio 0.85:1)
Time: 193.088 sec (3 m 13 s)
  • Total errors 」の行が出なくなりました。

. (ドット) で始まるファイルやディレクトリ配下をスキャン

. (ドット) で始まるファイルや、. (ドット) で始まるディレクトリ配下のファイルをちゃんとスキャンするか調べてみました。

以下のようにファイルを用意しました。

$ tree -a -F TestDir/
TestDir/
└── .DotDir/
        ├── .DotFile
        └── File

1 directory, 2 files

ちゃんとスキャンしてくれました。

$ clamscan -r TestDir/
TestDir/.DotDir/.DotFile: OK
TestDir/.DotDir/File: OK

----------- SCAN SUMMARY -----------
Known viruses: 3611274
Engine version: 0.98.1
Scanned directories: 2
Scanned files: 2
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 11.781 sec (0 m 11 s)

サイズが大きなファイルをスキャン

サイズが大きなファイルをスキャンしてみました。

以下のように 500M バイトのファイルを作成しました。

$ dd if=/dev/zero of=TestDir/BigFile bs=1M count=500

$ ls -lah TestDir/BigFile
-rw-rw-r-- 1 worker worker 500M Oct  9 21:53 TestDir/BigFile

ディレクトリ構成はこんな感じです。

$ tree -a -F TestDir/
TestDir/
└── BigFile

0 directories, 1 file

この BigFile をスキャン

$ clamscan -r TestDir/
TestDir/BigFile: OK

----------- SCAN SUMMARY -----------
Known viruses: 3611274
Engine version: 0.98.1
Scanned directories: 1
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 500.00 MB (ratio 0.00:1)
Time: 11.346 sec (0 m 11 s)

一見うまくスキャンできているように見えますが、「 Data scanned: 0.00 MB 」となっているのが気になります。

clamscan を man で調べると関連がありそうな以下の2つのオプションがありました。

--max-filesize=#n
        Extract and scan at most #n kilobytes from each archive. You may pass the value in megabytes in format xM or xm,
        where x is a number. This option protects your system against DoS attacks (default: 25 MB, max: <4 GB)

--max-scansize=#n
        Extract  and  scan at most #n kilobytes from each scanned file. You may pass the value in megabytes in format xM
        or xm, where x is a number. This option protects your system against DoS attacks (default: 100 MB, max: <4 GB)

以下のようにしてみました。

$ clamscan --max-filesize=4095M --max-scansize=4095M -r TestDir/
TestDir/BigFile: OK

----------- SCAN SUMMARY -----------
Known viruses: 3615974
Engine version: 0.98.1
Scanned directories: 1
Scanned files: 1
Infected files: 0
Data scanned: 502.58 MB
Data read: 500.00 MB (ratio 1.01:1)
Time: 27.623 sec (0 m 27 s)
  • Data scanned: 502.58 MB となったのでうまくスキャンできてるようです。
  • --max-filesize, --max-scansize を別々に指定してもスキャン対象とならないようなので両方指定しました。
  • 指定できるサイズは最大で 4GB 未満で、4096M だと大きすぎるとワーニングが出るので 4095M としています。

結局こんな感じでスキャンすることにしました

$ sudo freshclam && sudo clamscan \
--max-filesize=4095M --max-scansize=4095M \
--max-files=1000000 --max-recursion=1000 --max-dir-recursion=1000 \
--allmatch --infected \
--cross-fs=no \
-r $(mount | egrep -v ' type +(sysfs|proc) ' | cut -d ' ' -f 3)
  • freshclam してから clamscan するようにしてます。
  • --max-files, --max-recursion, --max-dir-recursion の値も増やしてます。
  • --infected を付けたので、感染していないファイルは表示されません。
  • --allmatch も付けてみました。


0 件のコメント:

コメントを投稿