メモ > サーバ > 構築: 攻撃からの防御 > ClamAV(アンチウィルスソフト)導入
■ClamAV(アンチウィルスソフト)導入
ユーザがWebサーバにファイルをアップロードするようなサービスの場合、
アンチウィルスソフトを導入しておくといい
■検証サーバについて
2020年3月時点で、AWSのEC2を使って検証
t2.micro だとメモリ不足でデーモンを起動できなかった
t2.small なら起動できた
他の解説でも「t2.microでは動かなかった」のように書かれている
■前準備
HTTPで疎通確認できるようにしておく
$ sudo su -
# localectl set-locale LANG=ja_JP.UTF-8
# timedatectl set-timezone Asia/Tokyo
# amazon-linux-extras list
# amazon-linux-extras install nginx1.12 -y
# systemctl start nginx
# systemctl enable nginx
http://203.0.113.1/
■インストール
Amazon Linux 2にClamAVをインストールする - Qiita
https://qiita.com/aosho235/items/e70ccf3b7464369bebab
# amazon-linux-extras install -y epel … epelをインストール
# yum install -y clamav clamav-update clamd … ClamAVをインストール
# vi /etc/freshclam.conf … 定義ファイル更新の設定ファイルを編集(何も変更しなくても動く)
# freshclam … 定義ファイル更新(20秒程度で更新できた。大した負荷も無かった)
# vi /etc/cron.d/clamav-update … 自動更新のファイルが自動で作られている
# vi /etc/clamd.d/scan.conf … スキャンの設定ファイルを編集
ログは以下で表示できる
#LogFile /var/log/clamd.scan
↓
LogFile /var/log/clamd.scan
#LocalSocket /run/clamd.scan/clamd.sock
↓
LocalSocket /run/clamd.scan/clamd.sock
#LocalSocketMode 660
↓
LocalSocketMode 660
#ExcludePath ^/proc/
#ExcludePath ^/sys/
↓
ExcludePath ^/proc/
ExcludePath ^/sys/
User clamscan
↓
#User clamscan
# systemctl start clamd@scan … デーモンを起動
# systemctl enable clamd@scan … 自動起動を設定
# journalctl -u clamd@scan
上記の手順で設定した場合、以下からもログを表示できる
# vi /var/log/clamd.scan
上記設定で freshclam は自動更新されるが、この実行タイミングはウイルススキャンの実行タイミングとは別物
あくまでもウイルス定義ファイル更新に関する設定
■手動スキャン
以下でスキャンを手動実行できる。15秒程度で完了した
# clamscan -r -i ~
----------- SCAN SUMMARY -----------
Known viruses: 6775136
Engine version: 0.102.2
Scanned directories: 2
Scanned files: 6
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 15.473 sec (0 m 15 s)
以下でウイルスの検出をテストできる。自動で隔離されたりはしなかった
# curl -O https://www.eicar.org/download/eicar.com
# clamscan -r -i ~
/root/eicar.com: Win.Test.EICAR_HDB-1 FOUND
----------- SCAN SUMMARY -----------
Known viruses: 6775136
Engine version: 0.102.2
Scanned directories: 2
Scanned files: 7
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 15.932 sec (0 m 15 s)
以下で「/root/test 内をスキャンして、ウイルスがあれば /root/infected に隔離する」となる
# clamscan -i -r /root/test --move=/root/infected
/root/test/eicar.com: Win.Test.EICAR_HDB-1 FOUND
/root/test/eicar.com: moved to '/root/infected/eicar.com'
----------- SCAN SUMMARY -----------
Known viruses: 6775136
Engine version: 0.102.2
Scanned directories: 1
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 15.889 sec (0 m 15 s)
■メモリ使用量の検証
スキャンを手動実行すると、実行するたびにウイルス定義ファイル(500〜700MBくらい)を読み込んでからスキャンする
デーモンとして起動しておくと
・起動時に1度だけウイルス定義ファイルを読み込んで常駐する(ただし読み込み内容を、デーモンがメモリ上に保持し続ける)
・1日1回アクセスの少ない早朝の時間帯にフルスキャンを行ってくれる
となる
ウイルス定義ファイルの読み込みには時間がかかるので、毎回読み込むと
「送受信するメールのスキャンに時間がかかり、メールの送受信が遅延する」
となってしまう可能性がある
よって迅速なスキャンが必要でメモリが潤沢にあるサーバの場合、デーモンとして起動しておくといい
迅速なスキャンが不要で、メモリが潤沢でなく、1日に数回スキャンすれば十分…のような場合、手動スキャンも検討する
誤検知によって無害なファイルを削除してしまわないように、検出しても自動で削除せずにメールで通知するなどする
ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
nginxとPHPだけを入れた程度のEC2(t2.small)を用意し、
ClamAVをインストールしてデーモンとして実行すると、メモリ2GBのうち1GBくらいが常に使用中になった
psコマンドで確認すると、以下のプロセスがあった
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3875 0.0 43.7 1088308 892968 ? Ssl Mar17 0:14 /usr/sbin/clamd -c /etc/clamd.d/scan.conf
以下のコマンドでClamAVを終了させると上記プロセスは無くなり、
使用中のメモリも100MBくらいになった
# systemctl stop clamd@scan
# systemctl disable clamd@scan
以下はデーモン起動中のメモリ
# free
total used free shared buff/cache available
Mem: 2039156 997756 289164 456 752236 883624
Swap: 0 0 0
以下はデーモン終了後のメモリ
# free
total used free shared buff/cache available
Mem: 2039156 105792 1180996 456 752368 1775596
Swap: 0 0 0
上記の
「デーモン化すると、ウイルス定義ファイルの内容をメモリ上に保持し続けている」
と思われる挙動が確認できた
■手動スキャンとメモリ使用量の考察
なるべくメモリの消費を抑えるスキャンを検証
全体をスキャン
# clamscan -i -r /
以下のようにしても同じ
# clamscan --infected --recursive /
全体をスキャンすると、以下のようなエラーが大量に表示される
ファイルシステム sysfs・proc などは仮想ファイルが置かれる場所で実態が存在しないため、スキャンするとエラーになる
WARNING: Can't open file /sys/module/crc_ccitt/uevent: Permission denied
LibClamAV Warning: fmap_readpage: pread fail: asked for 4095 bytes @ offset 1, got 0
ファイルシステムを跨がないで全体をスキャン。6分ほどでスキャンできたが、長く使っているサーバならもっと時間がかかる
# clamscan --infected --recursive --cross-fs=no /
/root/infected/eicar.com: Win.Test.EICAR_HDB-1 FOUND
----------- SCAN SUMMARY -----------
Known viruses: 6779666
Engine version: 0.102.2
Scanned directories: 5416
Scanned files: 47703
Infected files: 1
Data scanned: 1700.70 MB
Data read: 1537.74 MB (ratio 1.11:1)
Time: 345.612 sec (5 m 45 s)
対象を限定してスキャン。大したコンテンツ量では無いので、20秒ほどでスキャンできた
# clamscan --infected --recursive --cross-fs=no /usr/share/nginx
----------- SCAN SUMMARY -----------
Known viruses: 6779666
Engine version: 0.102.2
Scanned directories: 30
Scanned files: 367
Infected files: 0
Data scanned: 8.62 MB
Data read: 5.54 MB (ratio 1.56:1)
Time: 19.300 sec (0 m 19 s)
巨大過ぎるファイルはスキャンに失敗するので、2MB以上のファイルはスキャン対象から省く
# clamscan --infected --recursive --cross-fs=no --max-filesize=2048M --max-scansize=2048M /usr/share/nginx
----------- SCAN SUMMARY -----------
Known viruses: 6779666
Engine version: 0.102.2
Scanned directories: 30
Scanned files: 367
Infected files: 0
Data scanned: 8.62 MB
Data read: 5.54 MB (ratio 1.56:1)
Time: 17.805 sec (0 m 17 s)
ウイルスが検出された例
# clamscan --infected --recursive --cross-fs=no --max-filesize=2048M --max-scansize=2048M /usr/share/nginx
/usr/share/nginx/html/clamav/eicar.com: Win.Test.EICAR_HDB-1 FOUND
----------- SCAN SUMMARY -----------
Known viruses: 6779666
Engine version: 0.102.2
Scanned directories: 30
Scanned files: 368
Infected files: 1
Data scanned: 8.62 MB
Data read: 5.54 MB (ratio 1.56:1)
Time: 18.102 sec (0 m 18 s)
運用の際は上記コマンドをスクリプトから実行し、「FOUND」という文字があればメールで通知…とすれば良さそう
誤検知によって無害なファイルを削除してしまわないように、検出しても自動で削除せずにメールで通知するなどする
システム全体をスキャンすると時間がかかるので、一般ユーザがコンテンツを配置する可能性のある場所のみスキャンするか
(Webサーバなら、「公開ディレクトリのみ」「アップロードファイルの保存場所のみ」など)
ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
IT とかその他もろもろ: ClamAV でウィルススキャン
http://fishrimper.blogspot.com/2014/10/clamav.html
■エラー
# systemctl start clamd@scan … デーモンを起動したときにエラーになった
Job for clamd@scan.service failed because the control process exited with error code.
See "systemctl status clamd@scan.service" and "journalctl -xe" for details.
# journalctl -xe … 詳細を表示。メモリ不足で動かないみたい。t2.microでは厳しいのだと思われる
■メモ
Amazon Linux 2にClamAVをインストールする - Qiita
https://qiita.com/aosho235/items/e70ccf3b7464369bebab
Linuxアンチウイルスソフト ClamAV - Qiita
https://qiita.com/bezeklik/items/4696e15c889ffff6bc41
clamscanとclamdscanの使用方法 - tech.farend
http://tech.farend.jp/blog/2015/12/28/using-clamav/
アンチウイルスソフト導入(Clam AntiVirus) - CentOSで自宅サーバー構築
https://centossrv.com/clamav.shtml
ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
CentOS 7: ClamAVでウィルススキャンを実行する - Narrow Escape
https://www.hiroom2.com/2017/06/06/centos-7-clamav%E3%81%A7%E3%82%A6%E3%82%A3%E3%83%AB%E3%82%B9%E3%8...
VirtualBox+CentOS7環境に、ClamAVをdaemonで起動するようにインストールする - Qiita
https://qiita.com/mopoki2696/items/dfc19a4a0b51b3bbace6
ClamAVのエラー LibClamAV Error: mpool_malloc(): Attempt to allocate bytes. | OrangeGardenRoom
http://blog.grandaria.com/?p=204
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: mpool_malloc(): Can't allocate memory (262144 bytes).
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: cli_parse_add(): Problem adding signature (2).
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: Problem parsing database at line 89191
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: Can't load main.ndb: Malformed database
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: cli_tgzload: Can't load main.ndb
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: Can't load /var/lib/clamav/main.cvd: Malformed database
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: LibClamAV Error: cli_loaddbdir(): error loading database /var/lib/clamav/main.c
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: Malformed database
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal clamd[513]: ERROR: Malformed database
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal systemd[1]: clamd@scan.service: control process exited, code=exited status=1
Mar 17 04:28:06 ip-10-0-1-170.ap-northeast-1.compute.internal systemd[1]: Failed to start clamd scanner (scan) daemon.
-- Subject: Unit clamd@scan.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit clamd@scan.service has failed.
--
-- The result is failed.