SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

CentOS7でclamAVインストール(2)

問題

CentOS7にclamAVをインストールして、ファイルのウイルススキャンなどをしたいです。

答え

半年前確認したときとは少し様子が違う気がしたので改めてメモ。

インストール

yum install clamav clamav-update clamd

以下も依存関係でついてきます。

clamav-filesystem
pcre2
clamav-lib

設定

vim /etc/clamd.d/scan.conf

8行目「Example」をコメントアウトしようと思ったら、すでにされてるのでそのまま。

ログは「LogSyslog yes」になっているのでそのままでも /var/log/messages に出力される。

別のファイルに出力したい場合は、「LogFile」などの項目を設定する。

ユーザーをコメントアウトするとrootで動作する。

# User clamscan

もしくは User root と書く。

スキャンしたくないディレクトリがあれば設定

ExcludePath ^/proc/
ExcludePath ^/sys/

ウイルススキャンテスト用のファイルを入手

wget http://www.eicar.org/download/eicar.com 

ここでファイルを指定してスキャンしてみると

この段階でいきなりファイルのウイルススキャンを実行すると、以下のように失敗する、データベースを更新してから実行しましょう。

# clamscan eicar.com
 LibClamAV Error: cli_loaddbdir(): No supported database files found in /var/lib/clamav
 ERROR: Can't open file or directory
 ----------- SCAN SUMMARY -----------
 Known viruses: 0
 Engine version: 0.101.5
 Scanned directories: 0
 Scanned files: 0
 Infected files: 0
 Data scanned: 0.00 MB
 Data read: 0.00 MB (ratio 0.00:1)
 Time: 0.006 sec (0 m 0 s)

ウイルスデータベースを更新

起動前にウイルスデータベースを更新するため、freshclam コマンド実行。

# freshclam
ClamAV update process started at Thu Mar 12 01:48:22 2020
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.101.5 Recommended version: 0.102.2
DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
Downloading main.cvd [100%]
main.cvd updated (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)
Downloading daily.cvd [100%]
ERROR: During database load : WARNING: [LibClamAV] mpool_malloc(): Can't allocate memory (262144 bytes). [...] ERROR: Failed to load new database: Malformed database
WARNING: Database load exited with status 55
ERROR: Failed to load new database

メモリが足りないといわれた。

メモリは1GBあるが、MySQLやApache、他のウイルス対策ソフトが起動していたので、いったん他のサービスを停止して改めて freshclam を実行。→ 成功。

# freshclam
ClamAV update process started at Thu Mar 12 01:57:17 2020
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.101.5 Recommended version: 0.102.2
DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
main.cvd is up to date (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)
nonblock_connect: connect(): fd=4 errno=101: Network is unreachable
Can't connect to port 80 of host database.clamav.net (IP: 2606:4700::6810:db54)
Downloading daily.cvd [100%]
daily.cvd updated (version: 25748, sigs: 2214420, f-level: 63, builder: raynman)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 331, sigs: 94, f-level: 63, builder: anvilleg)
Database updated (6779416 signatures) from database.clamav.net (IP: 104.16.218.84)

このサーバーでは、swapがないのも問題だったので、後でswapも追加した。

dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

常駐(デーモンとして動かす)

ローカルソケットを使う設定にする。

vim /etc/clamd.d/scan.conf
LocalSocket /run/clamd.scan/clamd.sock

clamdを常駐させる。

systemctl start clamd@scan #clamd起動
systemctl status clamd@scan #clamd稼働状況
systemctl enable clamd@scan #clamd自動起動設定
systemctl list-unit-files | grep clamd* #自動起動の確認

デーモンを利用しないでウイルススキャンをすると遅い。

# clamscan -i eicar_com.zip
eicar_com.zip: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 6519624
Engine version: 0.101.4
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 81.986 sec (1 m 21 s)

常駐させておくとメモリなどは常に使用するがスキャンは速い。

# clamdscan eicar_com.zip
/root/f-secure/eicar_com.zip: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.017 sec (0 m 0 s)

デーモンを使うかどうかで、コマンドが1文字違う。

clamscan
clandscan

日々のウイルススキャン

OnAccessMountPath を有効にして、アクセスのたびにチェックするのもよさそう。

指定時刻に定期的にチェックでよければ、cronに設定するのもよい。

例)毎日4時に /home 以下をスキャン

0 4 * * * /usr/bin/clamdscan /home/

ウイルスを発見した時の動作

設定しなければ、標準出力に結果を表示、ログファイルに結果を出力して、駆除などはしないで終了する。

–move オプションで疑わしいファイルの隔離先を指定すると、隔離してくれる。

/usr/bin/clamdscan --move=/var/lib/clamav/infected /home/xxxx

–remove オプションを指定すると、疑わしいファイルを即削除する。

通知をしてくれるオプションはないようなので、clamscan(clamdscan)の実行結果や戻り値(0: ウイルスなし, 1: ウイルス発見)を利用して通知を送る仕組みを作るのがよいでしょう。

Linuxのコマンドは、「コマンド1 || コマンド2」と書くと、「コマンド1が成功したらそこで終了、コマンド1が失敗したらコマンド2を実行する」ということができる。

戻り値を利用して、|| で次の処理を書いておくと、通知スクリプトなどを実行することができる。clamdscan が、正常終了 0 以外の時(1:ウイルス発見、2:エラー発生)に、続いて通知スクリプトが呼ばれるように || で続けてコマンドを書いておく

clamscan(clamdscan)は、戻り値0(正常終了)でウイルス発見なし、戻り値 1はウイルス発見、 戻り値 2 はエラー発生。

なので例えば以下のように書いておくと、ウイルス発見時にmailコマンドが呼ばれる。

/usr/bin/clamdscan /home/xxxx > kekka || cat kekka | mail -s clamav  test@example.jp

メモリ消費量について

メモリ1GB、スワップ1GBでは、ギリギリな感じでした。

MySQLなど他のサービスが起動している状態だと、clamdはメモリ不足で常駐に失敗してました。

daemonize() failed: Cannot allocate memory

他のサービスを落としてから起動するか、遅いですがswapを2GBに増やすと起動しました。

メモリ消費量を抑える設定はどうやらなさそうなので、メモリは多めに用意するしかなさそうです。

LocalSocket or TCPSocket

clamd を常駐させる場合、LocalSocket を使う設定と TCPSocket を使う設定ができる。

rootでスキャンをするだけならLocalSocketでも問題なさそうだが、一般ユーザーもclamdscanしたいとき、/run/clamd.scan/clamd.sock にアクセスできなくて失敗した。

ERROR: Could not connect to clamd on LocalSocket /run/clamd.scan/clamd.sock: Permission denied

設定で何とかできないかと試行錯誤したが、結局どうにもできなかったので、TCPSocketを使ってみた。

TCPSocket 3310
TCPAddr 127.0.0.1

TCPSocketを使うと、誰からでもすんなりアクセスできるようになった。

TCPSocketを使う場合は、ファイアウォールの設定などには注意。

関連するメモ

コメント