ClamAV 0.103.0でウイルススキャンが遅くなった問題の対応 (CentOS 8)

isdはじめに

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

isdClamAV を 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のログメッセージも出力されないようになりました。

ひとまず?、これで解決とします。

isdまとめ

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
 

Follow me!