ClamAV 0.103.0でウイルススキャンが遅くなった問題の対応 (CentOS 8)
はじめに
CentOS 8サーバーのアンチウイルスソフトClamAVを 0.103.0 から 0.102.4 にダウングレードしたお話。
2021年1月、僕が管理しているCentOS 8サーバーで、ClamAVによるウイルススキャン処理に時間がかかるようになりました。
ClamAVのインストール手順は、以前の記事「ClamAVによる定期ウイルススキャンの設定」のとおりです。
毎日早朝にディスクのフルスキャンを実施しているのですが、ClamAVを導入しているすべてのサーバーで遅くなりました。
一番遅くなったサーバーでは、スキャン処理時間が約2倍となりました。
1月13日のスキャン結果。
----------- SCAN SUMMARY ----------- Known viruses: 8789367 Engine version: 0.102.4 Scanned directories: 28225 Scanned files: 166799 Infected files: 0 Data scanned: 8808.94 MB Data read: 9800.51 MB (ratio 0.90:1) Time: 2745.122 sec (45 m 45 s)
1月14日のスキャン結果。
----------- SCAN SUMMARY ----------- Known viruses: 8779646 Engine version: 0.103.0 Scanned directories: 28226 Scanned files: 166807 Infected files: 0 Total errors: 1 Data scanned: 11588.95 MB Data read: 9704.37 MB (ratio 1.19:1) Time: 5385.990 sec (89 m 45 s) Start Date: 2021:01:14 04:30:43 End Date: 2021:01:14 06:00:29
45分45秒が、89分45秒となり、約2倍の時間がかかっています。
定期ウイルススキャンのログを調べてみると、ClamAVのバージョンが、0.102.4-1 から、0.103.0-1 にアップグレードされてから、遅くなったようです。
Upgraded: clamav-0.103.0-1.el8.x86_64 clamav-filesystem-0.103.0-1.el8.noarch clamav-lib-0.103.0-1.el8.x86_64 clamav-update-0.103.0-1.el8.x86_64
また、合計データ量が660GBあるサーバーでは、スキャン処理中のメモリ使用量が1GBぐらい増えました。
さらに、ログに以下のようなメッセージが出力されるようになりました。
LibClamAV Warning: fmap: map allocation failed LibClamAV Error: CRITICAL: fmap() failed
ClamAVの不具合ではないかと思いましたが、0.103.0の変更点 を見ても関連しそうな変更はありませんし、ネット検索してもそのような報告はヒットしません。
clamscanコマンド実行時のオプションで解決するかもしれませんが、1日1回のフルスキャンで原因を調査するのは大変そうなので、ClamAVのバージョンを 0.102.4 に戻すことにしました。
以下、ClamAV を 0.103.0 から 0.102.4 にダウングレードする手順を記載しますが、このサーバーでは、以下の以前の記事の手順で、EPELリポジトリの ClamAVをインストールし、定期ウイルススキャンの設定がされていたものとします。
(設定手順は、CentOS 7とCentOS 8で同じです。)
・ClamAVによる定期ウイルススキャンの設定
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
ClamAV を 0.103.0 から 0.102.4 に戻す手順
方針
もともと、ClamAVはEPELリポジトリからインストールしていました。
dnf downloadコマンドで、0.102.4 のRPMパッケージをダウンロードしようとしたのですが、古いRPMパッケージはすでになくなっていました。
# dnf --enablerepo=epel download clamav-0.102.4-1.el8.x86_64 利用可能なパッケージ clamav-0.102.4-1.el8.x86_64 はありません。 厳密な設定により終了中です。 エラー: 利用可能なパッケージ clamav-0.102.4-1.el8.x86_64 はありません。
Google検索したところ、pkgs.orgにより、Atomicリポジトリには ClamAV 0.102.4 が存在することがわかりました。
・Search Results for clamav – pkgs.org
https://pkgs.org/search/?q=clamav
このため、現在のClamAV 0.103.0 をアンインストールし、AtomicリポジトリのClamAV 0.102.4 をインストールすることにしました。
また、定期ウイルススキャン処理において、ClamAVプログラム自体は、当面アップデートしないようにしました。
ClamAV 0.103.0 をアンインストール
clamavパッケージを検索します。
# rpm -qa | grep clam clamav-0.103.0-1.el8.x86_64 clamav-lib-0.103.0-1.el8.x86_64 clamav-filesystem-0.103.0-1.el8.noarch clamav-update-0.103.0-1.el8.x86_64
これらのパッケージを削除します。
# dnf remove clamav clamav-lib clamav-filesystem clamav-update 削除済み: clamav-0.103.0-1.el8.x86_64 clamav-filesystem-0.103.0-1.el8.noarch clamav-lib-0.103.0-1.el8.x86_64 clamav-update-0.103.0-1.el8.x86_64 libprelude-5.1.1-1.el8.x86_64
Atomic版ClamAV 0.102.4 のインストール
先ほど見つけた、pkgs.org より、
clamav-0.102.4-14050.el8.art.x86_64.rpm のページ
https://centos.pkgs.org/8/atomic-x86_64/clamav-0.102.4-14050.el8.art.x86_64.rpm.html
に進み、RPMのダウンロードURLを取得します。
wgetコマンドでRPMをダウンロードします。
# cd /tmp/ # wget http://www6.atomicorp.com/channels/atomic/centos/8/x86_64/RPMS/clamav-0.102.4-14050.el8.art.x86_64.rpm # wget http://www6.atomicorp.com/channels/atomic/centos/8/x86_64/RPMS/clamav-db-0.102.4-14050.el8.art.x86_64.rpm
※RPMのダウンロードは、以下のように、、Atomicリポジトリを登録して、dnf downloadコマンドでも可能です。
# wget http://www.atomicorp.com/installers/atomic # /bin/bash -n atomic # chmod 755 atomic # ./atomic # dnf --enablerepo=atomic download clamav-0.102.4-14050.el8.art.x86_64 clamav-db-0.102.4-14050.el8.art.x86_64
ダウンロードしたRPMをローカルインストールします。
# dnf localinstall \ clamav-0.102.4-14050.el8.art.x86_64.rpm \ clamav-db-0.102.4-14050.el8.art.x86_64.rpm インストール済み: clamav-0.102.4-14050.el8.art.x86_64 clamav-db-0.102.4-14050.el8.art.x86_64
インストールの内容を確認します。
# rpm -ql clamav /etc/freshclam.conf /usr/bin/clambc /usr/bin/clamscan /usr/bin/clamsubmit /usr/bin/freshclam /usr/bin/sigtool ... /usr/lib64/libclamav.so /usr/lib64/libclamav.so.9 /usr/lib64/libclamav.so.9.0.4 /usr/lib64/libclammspack.so /usr/lib64/libclammspack.so.0 /usr/lib64/libclammspack.so.0.1.0 /usr/lib64/libclamunrar.so /usr/lib64/libclamunrar.so.9 /usr/lib64/libclamunrar.so.9.0.4 /usr/lib64/libclamunrar_iface.so /usr/lib64/libclamunrar_iface.so.9 /usr/lib64/libclamunrar_iface.so.9.0.4 /usr/lib64/libfreshclam.la /usr/lib64/libfreshclam.so /usr/lib64/libfreshclam.so.2 /usr/lib64/libfreshclam.so.2.0.0
# rpm -ql clamav-db /etc/cron.hourly/freshclam /etc/logrotate.d/freshclam /var/clamav /var/clamav/ASL.hdb /var/log/clamav /var/log/clamav/freshclam.log
ウイルス定義の定期自動更新を停止
僕の運用方法では、ウイルス定義更新は1日1回のスキャン実行直前に実施すればよいので、cronによるウイルス定義の定期自動更新は停止します。
先ほど確認したインストール内容のうち、/etc/cron.hourly/freshclam がウイルス定義の定期自動更新に相当するので、コマンドの実行権限を外します。
(ファイルを削除してもよいのですが、パッケージの更新時に、勝手に同じファイルを置かれてしまいそうなので、実行権限を外すことにします。)
# chmod a-x /etc/cron.hourly/freshclam
ウイルス定義更新設定
ウイルス定義更新 freshclam の初期設定から、以下を変更します。
- Exampleをコメントアウト。
- DBミラーサイトにJPを追加。
- syslog書き出しを無効として、ログファイルへの書き出しを指定。
- ログ記録時に時刻を記録。
- clamdへの通知を無効に。
# cp -p /etc/freshclam.conf /etc/freshclam.conf.default # vim /etc/freshclam.conf ... #Example // コメントアウトする。 ... UpdateLogFile /var/log/freshclam.log // ログはsyslogではなく/var/log/freshclam.logに書き出す ... LogTime yes // コメントアウトを外す(ログ記録時に時刻を記録) #LogSyslog yes LogSyslog no // syslogは無効とする。 ... #DatabaseOwner clamav // ウイルス定義のOwnerは clamavユーザー # DatabaseMirror db.jp.clamav.net // 日本のDBミラーサイトをデフォルトの前に追記 DatabaseMirror database.clamav.net // database.clamav.net を追記 #DatabaseMirror db.local.clamav.net // db.local.clamav.net はコメントアウト ... #NotifyClamd /path/to/clamd.conf // コメントアウト ...
ウイルス定義ファイルの取得
0.103.0 のウイルス定義ファイルが存在すれば、いったん削除します。
# ls -l /var/lib/clamav/ -rw-r--r-- 1 clamupdate clamupdate 296388 9月 17 15:59 bytecode.cvd -rw-r--r-- 1 clamupdate clamupdate 117859675 9月 17 15:59 main.cvd # rm /var/lib/clamav/*.cvd
fleshclamコマンドでウイルス定義ファイルを取得する前に、先ほど /etc/freshclam.conf で指定したログファイルを作成します。
ファイルOwnerは、/etc/freshclam.conf の DatabaseOwner で定義されていた clamav とします。
# touch /var/log/freshclam.log # chown clamav.clamav /var/log/freshclam.log # ls -l /var/log/freshclam.log
ウイルス定義ファイルを取得します。
# time freshclam Mon Jan 18 16:04:36 2021 -> ClamAV update process started at Mon Jan 18 16:04:36 2021 Mon Jan 18 16:04:36 2021 -> daily database available for download (remote version: 26052) Time: 2.7s, ETA: 0.0s [=============================>] 105.90MiB/105.90MiB Mon Jan 18 16:04:42 2021 -> Testing database: '/var/clamav/tmp.131ce/clamav-bb18db05911d1db002b7910256d9e7f3.tmp-daily.cvd' ... Mon Jan 18 16:05:00 2021 -> Database test passed. Mon Jan 18 16:05:00 2021 -> daily.cvd updated (version: 26052, sigs: 4213648, f-level: 63, builder: raynman) Mon Jan 18 16:05:00 2021 -> main database available for download (remote version: 59) Time: 2.6s, ETA: 0.0s [=============================>] 112.40MiB/112.40MiB Mon Jan 18 16:05:08 2021 -> Testing database: '/var/clamav/tmp.131ce/clamav-aada3d51d752f62f592fe03f60775997.tmp-main.cvd' ... Mon Jan 18 16:05:19 2021 -> Database test passed. Mon Jan 18 16:05:19 2021 -> main.cvd updated (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr) Mon Jan 18 16:05:19 2021 -> bytecode database available for download (remote version: 331) Time: 0.2s, ETA: 0.0s [=============================>] 289.44KiB/289.44KiB Mon Jan 18 16:05:19 2021 -> Testing database: '/var/clamav/tmp.131ce/clamav-b2cac719d33acd8cadebcd82846eb991.tmp-bytecode.cvd' ... Mon Jan 18 16:05:19 2021 -> Database test passed. Mon Jan 18 16:05:19 2021 -> bytecode.cvd updated (version: 331, sigs: 94, f-level: 63, builder: anvilleg) real 0m42.798s user 0m34.593s sys 0m2.659s
ウイルススキャンのテスト
以前の記事
・ClamAVによる定期ウイルススキャンの設定
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
のとおり、スキャンのテストを実施し、正しく動作することを確認します。
スキャン実行スクリプトの修正
スキャン実行スクリプト /root/bin/scanvirus.sh については、スキャンの前にClamAVのアップデートを実施すると、0.103.0 に戻されてしまうので、コメントアウトしてアップデートしないようにします。
# vim /root/bin/scanvirus.sh ... # 1. ClamAVプログラムのアップデート #echo "`date` Update ClamAV start" >> ${LOGFILE} #yum -y --enablerepo=epel update clamav 1>> ${LOGFILE} 2>&1 #echo "`date` Update ClamAV end" >> ${LOGFILE} ...
定期スキャンの結果を確認
ダウングレード後の定期スキャン結果を確認し、ダウングレード前の結果と比較します。
ダウングレード前、1月18日のスキャン結果。
ClamAV 0.103.0。
----------- SCAN SUMMARY ----------- Known viruses: 8762986 Engine version: 0.103.0 Scanned directories: 28226 Scanned files: 166865 Infected files: 0 Total errors: 1 Data scanned: 11632.58 MB Data read: 9794.94 MB (ratio 1.19:1) Time: 5608.332 sec (93 m 28 s) Start Date: 2021:01:18 04:30:31 End Date: 2021:01:18 06:03:59
ダウングレード後、1月19日のスキャン結果。
ClamAV 0.102.4
----------- SCAN SUMMARY ----------- Known viruses: 8763306 Engine version: 0.102.4 Scanned directories: 28216 Scanned files: 166850 Infected files: 2 Data scanned: 8925.45 MB Data read: 9967.93 MB (ratio 0.90:1) Time: 2786.139 sec (46 m 26 s)
ダウングレード後、スキャン処理時間は46分と、以前と同じぐらいの時間に戻りました。
ダウングレードした他の全てのサーバーでも同様に処、理時間が元どおりとなり、スキャン処理中のメモリ使用量も以前と同じぐらいに戻り、fmapのログメッセージも出力されないようになりました。
ひとまず?、これで解決とします。
まとめ
ClamAVによる定期ウイルススキャン処理で、処理時間やメモリ使用量の増大という問題が発生したため、ClamAVをバージョンダウングレードすることで解決しました。
なお、この記事では、サーバーは CentOS 8としましたが、CentOS 7でも 0.103.0 で同じ現象が発生していました。
CentOS 7でも、Atomic版ClamAV 0.102.4が存在するので、同じ手順でダウングレードできるはずです。
・clamav-db-0.102.4-14050.el7.art.x86_64.rpm – pkgs.org
https://centos.pkgs.org/7/atomic-x86_64/clamav-db-0.102.4-14050.el7.art.x86_64.rpm.html
※僕が管理するCentOS 7サーバー2台では、たまたま?CentOS 8サーバーほど問題が大きくなかったので、CentOS 7サーバーではダウングレードしていません。
ClamAVプログラムをバージョンアップしないことについては、以下の理由で、あまり気にしないことにします。
- スキャン処理そのものには大きな変更はないはず。
- 最新のウイルス定義ファイルを取得できれば、スキャン処理は正しく実行されるはず。
0.103.0 の次のバージョンがリリースされたら、テストしてみたいと思います。
それにしても、この現象に遭遇したのは、僕だけなのでしょうか??
(関連記事)
・ClamAVによる定期ウイルススキャンの設定
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html
・ClamAVによるリアルタイムスキャンの設定
https://inaba-serverdesign.jp/blog/20210409/clamav-realtime-scan.html