無料で使えるオープンソースのアンチウイルスソフト「ClamAV」をAWSのAmazon 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」キーを打ちます。