Clam AntiVirusをAmazon Linux2へ導入する

無料で使えるオープンソースアンチウイルスソフトClamAV」をAWSAmazon Linux2へインストールして動かすところまでをまとめます。

ウイルスはWindowsをターゲットとしたものが多く、限られたユーザーしか利用しないLinux環境だと入れないことが多かったりしますが、今回は専門学校の実習で50名前後の生徒にWebサーバーとして開放する関係で導入することにしました。さすがに意図的にウイルスをアップすることは無いと思いますがw 万全を期するに越したことはないですからね。

Clam AntiVirusをインストール

必要なソフトを入れる

EPELを有効にします。

$ sudo amazon-linux-extras install epel

次に今回のメインディッシュであるClamAVを入れます。

$ sudo yum install clamav clamav-update clamd

定義ファイルの更新

ClamAVは定義ファイルに存在する内容が、スキャンするファイル内に存在する場合にウイルスであると判断します。この定義ファイルをネットワーク経由で最新の状態に更新します。

$ sudo freshclam

設定ファイルの編集

バックアップを取ったら、スキャン時の設定を変更します。ExcludePathはスキャンを除外する場所ですね。

$ sudo cp /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.back
$ sudo vi /etc/clamd.d/scan.conf
LogFile /var/log/clamd.scan
LogFileMaxSize 10M
LogTime yes
LogSyslog no
LogRotate yes
TCPSocket 3310
TCPAddr 127.0.0.1
ExcludePath ^/proc/
ExcludePath ^/sys/
# User clamscan

また今回はリアルタイムにファイルを監視する設定(オンアクセススキャン)を入れます。OnAccessIncludePathで対象とする場所を指定します。

$ sudo vi /etc/clamd.d/scan.conf
OnAccessExtraScanning yes
OnAccessExcludeRootUID yes
OnAccessIncludePath /var/www
OnAccessIncludePath /home

デーモンを起動する

ClamAVはそのままでもスキャンが可能ですが、デーモンを起動しておくと動作速度がやたら早くなります。ただしその代償としてメモリを1Gほど消費しますのでくれぐれもご注意を。

$ sudo systemctl start clamd@scan

ついでに自動起動の設定も行います。

$ sudo systemctl enable clamd@scan

スキャンしてみる

試験用ウイルスファイルを取得

まずはアンチウイルスソフトのテスト用に開発されたテストファイルを取得します。

以下のどれかを取ってきます。もちろん無害です。あくまでアンチウイルスソフトのテスト用のファイルなのでご安心ください。

$ curl -O http://www.eicar.org/download/eicar.com
$ curl -O http://www.eicar.org/download/eicarcom2.zip
$ curl -O http://www.eicar.org/download/eicar.com.txt

手動でスキャン

clamdscanにスキャンしたいディレクトリやファイルを指定するだけ。めっちゃ簡単ですね。

$ sudo clamdscan -c /etc/clamd.d/scan.conf /home
/home/ec2-user/eicar.com: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.014 sec (0 m 0 s)
Start Date: 2021:05:06 10:16:58
End Date:   2021:05:06 10:16:58

なお「clamdscan」はデーモンを利用してスキャンするコマンドになります。デーモンを利用しない場合は「clamscan」コマンドを実行します(真ん中にdが無い)

どれくらい時間がかかるの?CPUやメモリ使用率は?

ほぼ素の状態のAmazon Linux2で全体をスキャンしてみるとおよそ7分ほどでした。思ったよりはかからなかったですね。

$ sudo clamdscan -c /etc/clamd.d/scan.conf --move /var/tmp/clamav/danger /

----------- SCAN SUMMARY -----------
Infected files: 2
Time: 432.851 sec (7 m 12 s)
Start Date: 2021:05:06 14:11:31
End Date:   2021:05:06 14:18:44

htopコマンドで実行中の様子を眺めていると、手元の環境ではCPUはコアの1つが70〜100%となり実質的に専有状態となります。マルチコアなら良いのですがシングルコアの場合はちょっと厳しいですね。メモリ使用率はデーモンを立ち上げた時とほぼ変わりませんでした。

見つかったら削除する

clamdscanはでデフォルトだと見つかったことはわかりますが特に何もしてくれません。もし削除したい場合は以下のように--removeオプションを追加します(発見されたことはログに残ります)。

$ sudo clamdscan -c /etc/clamd.d/scan.conf --remove /home

この方法は何の確認も無しにいきなり削除されます。誤検知された場合でも問答無用で消えて無くなります。

見つかったら移動する

いきなり削除されるのは誤検知が怖いので、指定したディレクトリへ退避させることも可能です。以下のように退避用のディレクトリを作成、パーミションはroot以外が覗けないようにしておきます。

$ sudo mkdir -p /var/tmp/clamav/danger
$ sudo chmod 0600 /var/tmp/clamav/danger

また退避用のディレクトリを設定ファイルに追記しスキャン対象から外します。これで準備が整いました。

$ sudo vi /etc/clamd.d/scan.conf
ExcludePath ^/var/tmp/clamav/danger/

今度は--moveオプションを付けて実行します。

$ sudo clamdscan -c /etc/clamd.d/scan.conf --move /var/tmp/clamav/danger

無事に移動できたのが確認できました。

$ ls /var/tmp/clamav/danger
eicar.com

こちらも見つかったことがログファイルにも記録されます。

定期的にスキャン

手動で実行しclamdscanに問題がなければ、コマンドをcronに登録してタイマーで実行します。以下の例だと3時間置きに実行されます。

$ sudo su -
# crontab -e
30 */3 * * * /usr/bin/clamdscan -c /etc/clamd.d/scan.conf --move /var/tmp/clamav/danger /

オンアクセススキャン

特定のディレクトリを監視し、危険なファイルが見つかったら警告してくれるオンアクセススキャンも試してみます。

テストする

事前にtailコマンドを準備しておき、ダウンロードしたファイルを監視対象のディレクトリにコピーした際にClamAVが反応しログに書きまれれば成功です。

$ cp eicar.com /home/ec2-user/
$ sudo tail -f /var/log/clamd.scan
Thu May  6 09:13:24 2021 -> instream(127.0.0.1@41030): Win.Test.EICAR_HDB-1 FOUND

どこで見つかったの??

ただし、ご覧の通りどこでどのファイルが見つかったかログに記録されません。仕方ないので手動でclamdscanを実行して対象のファイルを見つけます。

$ clamdscan /var/www/html /home
/home/ec2-user/eicar.com: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.064 sec (0 m 0 s)
Start Date: 2021:05:06 09:38:11
End Date:   2021:05:06 09:38:11

どのファイルか判明したらあとは煮るなり焼くなりします。

その他

定義ファイルの自動更新

yumでインストールした時点でcronに登録されています。

$ ls /etc/cron.d/
0hourly  clamav-update  raid-check  sysstat  update-motd

スキャン中に途中経過を知りたい

スキャン中にclamdtopコマンドを実行すると今どのファイルをチェックしているか、どの程度のCPUやメモリを消費しているかなどを表示してくれます。

$ clamdtop

以下のような画面になります。終了する時はtopコマンドと同じく「q」キーを打ちます。

参考ページ