ClamAVによるリアルタイムスキャンの設定(ClamAV 1.0版)

  1. はじめに
  2. ClamAVのリアルタイムスキャン機能
  3. ClamAVのインストール
  4. ウイルスデータベースの取得と自動更新設定
  5. ウイルススキャナーの設定と動作確認
  6. リアルタイムスキャンの設定と動作確認
  7. おわりに

isd1. はじめに

ClamAV は、オープンソースのアンチウイルスソフトウェアです。

以前、「ClamAVによるリアルタイムスキャンの設定」という記事を書きました。

当時は以下の問題があり、運用環境にリアルタイムスキャンを導入するには少し厳しいかな、という印象でした。

  • 検証用ウイルスファイルのダウンロード、アップロード、コピー時にウイルスをリアルタイムで検知しないことがある。
  • ウイルス検知時にファイルパスを取得しにくい。

そのときのClamAVのバージョンは 0.103.1 でしたが、最近、バージョン1.0系がリリースされているとの情報をいただき、RHEL9系のEPELリポジトリからも1.0系が配布されていることがわかったので、再度設定と動作確認を試みました。

今回使用したOSはRHELクローンの AlmaLinux 9.3。
ClamAVのバージョンは、この記事を書いている2023年11月時点のEPEL版では最新の 1.0.4 です。
サーバーはAWS EC2の低スペックインスタンス t2.micro(2vCPU、メモリ1GB)を使用しました。
メモリ1GBではおそらく clamd が起動しないため、スワップ領域を2GBとしています。

以下、ClamAVのインストールやスキャン実行設定は、rootユーザー(もしくはsudoによるroot権限)で実行します。

結論を先に書いておきますと、
「ClamAV 1.0のリアルタイムスキャンおよび通知は、意図したとおり正しく機能する」
といえそうです。

isd2. ClamAVのリアルタイムスキャン機能

ClamAVでは、リアルタイムスキャン機能を「On-Access Scanning」といっています。

公式ドキュメントはこちら。
・On-Access Scanning – ClamAV Documentation
https://docs.clamav.net/manual/OnAccess.html

clamonacc というサービスがリアルタイムスキャン機能を持ちます。
clamonacc は、カーネルの fanotify 通知機能によりファイルシステムの変化を検知し、ウイルススキャナーデーモンの clamd にウイルススキャン判定を依頼します。
また、freshclam というサービスで、ウイルスデータベースを取得・更新します。

今回は、以下の順で、リアルタイムスキャンの設定を行います。

  1. ClamAVのインストール
  2. freshclam によるウイルスデータベースの取得・自動更新設定
  3. clamd によるウイルススキャン設定
  4. clamonacc によるリアルタイムスキャン設定

isd3. ClamAVのインストール

もしEPELリポジトリがインストールされていなければ、インストールします。

 # dnf install epel-release

--
インストール済み:
  epel-release-9-5.el9.noarch
--

 

ClamAV関連のパッケージを検索します。

 # dnf --enablerepo=epel search clam

--
============================ 名前 & 概要 一致: clam ============================
clamav.x86_64 : End-user tools for the Clam Antivirus scanner
clamav-data.noarch : Virus signature data for the Clam Antivirus scanner
clamav-devel.x86_64 : Header files and libraries for the Clam Antivirus scanner
clamav-doc.noarch : Documentation for the Clam Antivirus scanner
clamav-filesystem.noarch : Filesystem structure for clamav
clamav-freshclam.x86_64 : Auto-updater for the Clam Antivirus scanner data-files
clamav-lib.x86_64 : Dynamic libraries for the Clam Antivirus scanner
clamav-milter.x86_64 : Milter module for the Clam Antivirus scanner
clamav-unofficial-sigs.noarch : Scripts to download unofficial clamav signatures
clamd.x86_64 : The Clam AntiVirus Daemon
claws-mail-plugins-clamd.x86_64 : Use Clam AntiVirus to scan messages in Claws
                                : Mail
--

 

ClamAV本体(clamavパッケージ)、ウイルススキャナデーモン (clamd)と、ウイルスデータベース更新機能(clamav-freshclam)をインストールします。
依存関係により clamav-lib, clamav-filesystem もインストールされます。

 # dnf --enablerepo=epel install clamav clamd clamav-freshclam

--
インストール済み:
  clamav-1.0.4-1.el9.x86_64              clamav-filesystem-1.0.4-1.el9.noarch
  clamav-freshclam-1.0.4-1.el9.x86_64    clamav-lib-1.0.4-1.el9.x86_64
  clamd-1.0.4-1.el9.x86_64
--

 

※clamav-data パッケージをインストールすると、ウイルスデータベースがダウンロードされますが、これはパッケージインストールだと時間がかかり、あとで freshclam コマンドを実行したほうが短時間でダウンロードできるので、ここではインストールしません。

リアルタイムスキャンに使用する clamonacc は、clamavパッケージに含まれています。

 # rpm -ql clamav

--
/usr/bin/clambc
/usr/bin/clamconf
/usr/bin/clamdscan
/usr/bin/clamdtop
/usr/bin/clamscan
/usr/bin/clamsubmit
/usr/bin/sigtool
...
/usr/sbin/clamonacc
...
/usr/lib/systemd/system/clamav-clamonacc.service
/usr/lib/systemd/system/clamonacc.service
/usr/sbin/clamonacc
...
/var/spool/quarantine
--

 

isd4. ウイルスデータベースの取得と自動更新設定

ウイルススキャンを実施する前に、ウイルスデータベースを取得、更新する設定を行います。

  • 4-1. freshclamの設定
  • 4-2. ウイルスデータベースの取得
  • 4-3. ウイルスデータベースの自動更新設定

4-1. reshclamの設定

ウイルスデータベースの取得・更新サービス freshclam を設定します。
freshclam の設定ファイルは /etc/freshclam.conf です。

  • Example 行がコメントアウトされていることを確認。
  • (お好みで)ログファイルは /var/log/freshclam.log、LogSyslog no でログはSyslogを使用せず、LogTimeで時刻を記録するようにします。
  • DatabaseMirror はデフォルトの database.clamav.net のままで問題ありません。CloudFlareのCDNサービスにより、自動的に地理的に近いサーバーからダウンロードします。
  • Checks 12 で、1日に12回(2時間おき)にウイルスデータベースを更新します。
 # vim /etc/freshclam.conf

--
#Example                      // コメントアウトされていることを確認
...
UpdateLogFile /var/log/freshclam.log  // ログはsyslogではなく/var/log/freshclam.logに書き出す
...
LogTime yes   // コメントアウトを外す(ログ記録時に時刻を記録)

#LogSyslog yes
LogSyslog no         // syslogは無効とする。
...
DatabaseOwner clamupdate        // ウイルス定義のOwnerは clamupdateユーザー
...
DatabaseMirror database.clamav.net
...
# Number of database checks per day.
# Default: 12 (every two hours)
#Checks 24
Checks 12
--

 

あらかじめ、ログファイルを生成しておきます。

※ログファイルの生成は不要かもしれませなg、バージョン0.103では、ログファイルが存在しないと、ウイルスデータベースの取得時にエラーとなることがあったので、生成しておきます。

 # touch /var/log/freshclam.log
 # chown clamupdate.clamupdate /var/log/freshclam.log
 # ls -l /var/log/freshclam.log

--
-rw-r--r-- 1 clamupdate clamupdate 0 11月 17 16:34 /var/log/freshclam.log
--

 

4-2. ウイルスデータベースの取得

freshclam コマンドで、最新バージョンのウイルスデータベースを取得します。
サーバースペックやネットワーク通信速度にもよりますが、初回実行時は数十秒から数分かかります。
time コマンドで処理時間を計測してみます。

 # time freshclam

--
Fri Nov 17 16:34:57 2023 -> ClamAV update process started at Fri Nov 17 16:34:57 2023
Fri Nov 17 16:34:57 2023 -> daily database available for download (remote version: 27095)
Time:    0.5s, ETA:    0.0s [========================>]   59.35MiB/59.35MiB
Fri Nov 17 16:34:59 2023 -> Testing database: '/var/lib/clamav/tmp.b0a1bdccff/clamav-19133bb8df8e0c5dc68db6fc19e8520f.tmp-daily.cvd' ...
Fri Nov 17 16:35:14 2023 -> Database test passed.
Fri Nov 17 16:35:14 2023 -> daily.cvd updated (version: 27095, sigs: 2046691, f-level: 90, builder: raynman)
Fri Nov 17 16:35:14 2023 -> main database available for download (remote version: 62)
Time:    2.3s, ETA:    0.0s [========================>]  162.58MiB/162.58MiB
Fri Nov 17 16:35:20 2023 -> Testing database: '/var/lib/clamav/tmp.b0a1bdccff/clamav-e6cc5c4483c214ae824c29147855ab17.tmp-main.cvd' ...
Fri Nov 17 16:35:30 2023 -> Database test passed.
Fri Nov 17 16:35:30 2023 -> main.cvd updated (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
Fri Nov 17 16:35:30 2023 -> bytecode database available for download (remote version: 334)
Time:    0.1s, ETA:    0.0s [========================>]  285.12KiB/285.12KiB
Fri Nov 17 16:35:30 2023 -> Testing database: '/var/lib/clamav/tmp.b0a1bdccff/clamav-5f4d9be79d96b29dfb7d31324e9f60dc.tmp-bytecode.cvd' ...
Fri Nov 17 16:35:30 2023 -> Database test passed.
Fri Nov 17 16:35:30 2023 -> bytecode.cvd updated (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

real    0m32.465s
user    0m21.940s
sys     0m1.349s
--

 # ls -l /var/lib/clamav/

--
-rw-r--r-- 1 clamupdate clamupdate    291965 11月 17 16:35 bytecode.cvd
-rw-r--r-- 1 clamupdate clamupdate  62232414 11月 17 16:34 daily.cvd
-rw-r--r-- 1 clamupdate clamupdate        69 11月 17 16:34 freshclam.dat
-rw-r--r-- 1 clamupdate clamupdate 170479789 11月 17 16:35 main.cvd
--

 

↑32秒かかりました。

4-3. ウイルスデータベースの自動更新設定

clamav-freshclam サービスを起動、自動起動設定し、正しく起動したことを確認します。

 # systemctl enable --now clamav-freshclam

--
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /usr/lib/systemd/system/clamav-freshclam.service.
--

 # systemctl status clamav-freshclam

--
● clamav-freshclam.service - ClamAV virus database updater
     Loaded: loaded (/usr/lib/systemd/system/clamav-freshclam.service; enabled;>
     Active: active (running) since Tue 2023-11-17 16:57:08 JST; 22min ago
       Docs: man:freshclam(1)
             man:freshclam.conf(5)
             https://docs.clamav.net/
   Main PID: 876 (freshclam)
      Tasks: 1 (limit: 5545)
     Memory: 384.0K
        CPU: 11ms
     CGroup: /system.slice/clamav-freshclam.service
             mq876 /usr/bin/freshclam -d --foreground=true

11月 17 16:41:08 clamtest systemd[1]: Started ClamAV virus database updater.
11月 17 16:41:08 clamtest freshclam[876]: Tue Nov 17 16:41:08 2023 -> ClamAV up>
11月 17 16:41:08 clamtest freshclam[876]: Tue Nov 17 16:41:08 2023 -> daily.cld>
11月 17 16:41:08 clamtest freshclam[876]: Tue Nov 17 16:41:08 2023 -> main.cvd >
11月 17 16:41:08 clamtest freshclam[876]: Tue Nov 17 16:41:08 2023 -> bytecode.
--

 

isd5. ウイルススキャナーの設定と動作確認

clamd は、ウイルスデータベースをあらかじめ読み込んで動作するウイルススキャナーデーモンです。
リアルタイムスキャン機能の clamonacc は、clamd と連携して動作するため、まずは clamd の設定を行います。

  • 5-1. clamdの設定
  • 5-2. clamdの起動
  • 5-3. ウイルススキャンの動作確認

5-1. clamdの設定

clamdの設定ファイル /etc/clamd.d/scan.conf を変更します。

  • Example 行がコメントアウトされていることを確認します。
  • (お好みで)LogSyslog no, Logfile /var/log/clamd.scan で、ログはSyslogを使用せずログファイルに書き出し、LogTime yes で時刻を記録するようにします。
  • LocalSocket /run/clamd.scan/clamd.sock, FixStaleSocket yes で、(ネットワークモードではなく)ローカルソケットモードで起動するようにします。
  • ExcludePath で、スキャン除外パスを指定します。このサーバーでは、/swap.img をスワップファイルとして使用しているので、除外対象パスに追加しています。
  • root権限でスキャンするよう、User 行をコメントアウトします。
 # vim /etc/clamd.d/scan.conf

--
#Example      // コメントアウトする

LogFile /var/log/clamd.scan  // ログはsyslogではなく/var/log/clamd.scanに書き出す。コメントアウトを外す。

LogTime yes   // コメントアウトを外す(ログ記録時に時刻を記録)

#LogSyslog yes
LogSyslog no // syslogは無効とする。

LocalSocket /run/clamd.scan/clamd.sock
FixStaleSocket yes

ExcludePath ^/proc/  // スキャン除外パス
ExcludePath ^/sys/
ExcludePath ^/swap.img

#User clamscan    // コメントアウトする
--

 

また、freshclam によるウイルスデータベースの更新設定 /etc/freshclam.conf で、データベースを更新したときに clamd に通知する設定を行います。
NotifyClamd で、clamd の設定ファイル /etc/clamd.d/scan.conf を指定します。

 # vim /etc/freshclam.conf

--
#NotifyClamd /path/to/clamd.conf
NotifyClamd /etc/clamd.d/scan.conf
--

 

上記の設定変更を反映するため、freshclam サービスを再起動します。

 # systemctl restart clamav-freshclam

 

5-2. clamdの起動

clamd サービスを起動しつつ、自動起動設定を行い、正しく起動したことを確認します。
数百MBのウイルスデータベースファイルの読み込むため、起動に数分時間がかかるので、time コマンドで処理時間を計測してみます。

 # time systemctl enable --now clamd@scan

--
Created symlink from /etc/systemd/system/multi-user.target.wants/clamd@scan.service to /usr/lib/systemd/system/clamd@.service.

real    2m12.556s
user    0m0.012s
sys     0m0.015s
--

 # systemctl status clamd@scan

--
● clamd@scan.service - clamd scanner (scan) daemon
     Loaded: loaded (/usr/lib/systemd/system/clamd@.service; enabled; preset: d>
     Active: active (running) since Fri 2023-11-17 16:57:15 JST; 1min 21s ago
       Docs: man:clamd(8)
             man:clamd.conf(5)
             https://www.clamav.net/documents/
    Process: 1576 ExecStart=/usr/sbin/clamd -c /etc/clamd.d/scan.conf (code=exi>
   Main PID: 1578 (clamd)
      Tasks: 2 (limit: 5545)
     Memory: 717.9M
        CPU: 24.624s
     CGroup: /system.slice/system-clamd.slice/clamd@scan.service
             mq1578 /usr/sbin/clamd -c /etc/clamd.d/scan.conf

11月 17 16:55:03 clamtest systemd[1]: Starting clamd scanner (scan) daemon...
11月 17 16:57:15 clamtest systemd[1]: Started clamd scanner (scan) daemon.
--

 

↑起動に2分13秒かかりました。

5-3. ウイルススキャンの動作確認

clamdscan コマンドで、ウイルススキャンが正しく動作することを確認します。
ここでは、/var/www ディレクトリ以下をスキャンします。

 # time clamdscan /var/www

--
/var/www: OK

----------- SCAN SUMMARY -----------
Infected files: 0
Time: 0.005 sec (0 m 0 s)
Start Date: 2023:11:17 16:59:33
End Date:   2023:11:17 16:59:33

real    0m0.042s
user    0m0.002s
sys     0m0.005s
--

 

/var/www ディレクトリ以下にほとんどファイルがないこともあり、1秒もかからずに完了しました。

ちなみに、clamdscan コマンドではなくて、clamd を利用せずに、都度ウイルスデータベースを読み込んでスキャンする clamscan コマンドを使用すると、以下のように1分半ぐらいかかります。
clamdscan コマンドと clamscan コマンドは間違えないようにしましょう。

 # time clamscan --infected /var/www

--
----------- SCAN SUMMARY -----------
Known viruses: 8678977
Engine version: 1.0.4
Scanned directories: 1
Scanned files: 0
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 231.413 sec (3 m 51 s)
Start Date: 2023:11:17 17:05:08
End Date:   2023:11:17 17:09:00

real    3m51.494s
user    0m24.667s
sys     0m3.366s
--

 

続いて、検証用のウイルスファイルを /var/www/html ディレクトリにダウンロードし、clamdscan コマンドが正しくウイルスと検知することを確認します。

 # wget https://secure.eicar.org/eicar.com.txt -O /var/www/html/eicar.com.txt
 # wget https://secure.eicar.org/eicar_com.zip -O /var/www/html/eicar_com.zip

 # time clamdscan /var/www

--
/var/www/html/eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND
/var/www/html/eicar_com.zip: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Infected files: 2
Time: 0.225 sec (0 m 0 s)
Start Date: 2023:11:17 17:12:04
End Date:   2023:11:17 17:12:04

real    0m0.230s
user    0m0.002s
sys     0m0.002s
--

 

「Infected files: 2」ということで、ウイルス(感染)ファイル2つを正しく検知できました。
「/var/www/html/eicar_com.zip Win.Test.EICAR_HDB-1 FOUND」のように、検知したファイル名と、ウイルス名が記録されました。

clamdのログでも、ウイルス検知が記録されたことを確認します。

 # less /var/log/clamd.scan

--
Fri Nov 17 17:12:04 2023 -> /var/www/html/eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND
Fri Nov 17 17:12:04 2023 -> /var/www/html/eicar_com.zip: Win.Test.EICAR_HDB-1 FOUND
--

 

この検証用のウイルスファイルは、リアルタイムスキャンの動作確認でも使用するため、削除せずに残しておきます。

isd6. リアルタイムスキャンの設定と動作確認

  • 6-1. リアルタイムスキャンの方針
  • 6-2. fanotifyをサポートしていることの確認
  • 6-3. ウイルス検知時に実行するスクリプトの設置
  • 6-4. リアルタイムスキャンの設定
  • 6-5. リアルタイムスキャンの起動
  • 6-6. リアルタイムスキャンの動作確認
  • 6-7. リアルタイムスキャンの設定について補足(1)
  • 6-8. リアルタイムスキャンの設定について補足(2)

6-1. リアルタイムスキャンの方針

リアルタイムスキャンの方針は以下とします。

  • ウイルスを検知したときは、即時、メールで通知する。
  • スキャン対象ディレクトリは、Webディレクトリの /var/www と、作業ユーザーがファイルをアップロードする可能性がある /home とする。

6-2. fanotifyをサポートしていることの確認

稼働中のサーバーのカーネルが fanotify をサポートしていることを確認します。

CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y

の2行が確認できればOKです。

 # ls /boot/config*

--
/boot/config-5.14.0-284.18.1.el9_2.x86_64
/boot/config-5.14.0-362.8.1.el9_3.x86_64
--

 # cat /boot/config-5.14.0-362.8.1.el9_3.x86_64 | grep FANOTIFY

--
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
--

 

6-3. ウイルス検知時に実行するスクリプトの設置

せっかくリアルタイムスキャン機能を導入するのですから、ウイルスを検知したときはすぐに知りたい=通知してほしい、ですよね。
(すぐに通知しなくてもよいなら、リアルタイムスキャンではなくて、数時間おきの定期スキャンで十分なはずです。)

clamd では、ウイルスを検知したときに実行するコマンドを指定することができます。
ここでは、検知したときにメールで通知するスクリプト /root/bin/foundvirus.sh を用意し、ウイルス検知時に実行するよう設定します。

メールの件名には、サーバーのホスト名を含めます。

$CLAM_VIRUSEVENT_VIRUSNAME で検知したウイルス名
$CLAM_VIRUSEVENT_FILENAME で検知したファイル名
を取得できるので、それをメール本文に含めるのがポイントです。

※この機能により、通知だけではなく「検知したファイルを削除/移動する」といった処理も可能です。
※別途、サーバーからインターネットにメールを送信できるよう設定する必要があります。Postfixによるメール送信設定は以下などを参考にしてください。

・Postfixによるメール送信設定 – 稲葉サーバーデザイン
https://inaba-serverdesign.jp/blog/20160620/postfix_send_mail.html

 # vim /root/bin/foundvirus.sh

--
#!/bin/bash
#   ClamAVによるリアルタイムスキャンでウイルス検出時に
#   実行するスクリプト foundvirus.sh
#
MAILTO=<通知先メールアドレス>

export LANG=C

# メッセージの生成
message="Virus Found: $CLAM_VIRUSEVENT_VIRUSNAME in $CLAM_VIRUSEVENT_FILENAME"

# メッセージをメール送信
echo "$message"| mail -s "Virus Found in `hostname`" $MAILTO

# EOF
--

 

実行権限の付与と、文法チェックの実施。

 # chmod 700 /root/bin/foundvirus.sh

 # /bin/bash -n /root/bin/foundvirus.sh
 (何も出力されなければOK)

 

6-4. リアルタイムスキャンの設定

clamonacc 専用の設定ファイルは用意されておらず、clamd の設定ファイル /etc/clamd.d/scan.conf で設定します。

  • VirusEvent で、ウイルス検知時にメール通知するスクリプトを指定する。
  • OnAccessIncludePath で、オンラインスキャン対象ディレクトリを /var/www, /home に限定する。サブディレクトリもスキャン対象となる。
  • OnAccessExtraScanning yes で、ファイル作成、移動時のスキャンを実施する。これを有効にしないと、ファイルにアクセスがあったときのみのスキャンとなる。
  • OnAccessExcludeRootUID yes で、rootユーザーによるプロセスはスキャンを実施しないようにする。そうしないと、clamdscanもしくはclamscanコマンドをrootユーザーで実行する際にも、コマンドによるスキャンアクセスにリアルタイムスキャンが反応してしまい、二重に検知・通知してしまう。
  • OnAccessPrevention yes とすれば、ウイルス検知したファイルへのアクセスをブロックすることができる。ClamAVはウイルスデータベースの不具合により誤検知(false positive)することがあるので、今回は設定しない。

※リアルタイムスキャンの設定については、「6-8. リアルタイムスキャンの設定について補足」で補足します。

 # vim /etc/clamd.d/scan.conf

--
VirusEvent /root/bin/foundvirus.sh

OnAccessIncludePath /var/www
OnAccessIncludePath /home
OnAccessExtraScanning yes
OnAccessExcludeRootUID yes
--

 

OnAccessIncludePath でオンラインスキャン対象ディレクトリを指定した場合、Linuxの inotify という、ファイルシステムイベントを監視する機能を使用してディレクトリを監視します。
inotify でプロセスが使用する監視対象ディレクトリ数(とファイル数?)の上限はカーネルパラメータのデフォルトで 8192 と設定されているため、オンラインスキャン対象ディレクトリの下層ディレクトリ数(とファイル数?)が多い場合は、カーネルパラメータで上限を増やします。
最大値は 1048576 だそうです。

 # vim /etc/sysctl.conf

--(追記)
fs.inotify.max_user_watches=524288
--

 # sysctl -p

 

(参考)
・CentOS(Linux)で監視数の上限を超えてエラーが発生したときの対処 – SHIFT Group 技術ブログ
https://note.com/shift_tech/n/n047669ca3022

6-5. リアルタイムスキャンの起動

まず、clamd サービスを再起動して、/etc/clamd.d/scan.conf の設定変更を反映します。

 # systemctl restart clamd@scan

 

clamonacc サービスを起動しつつ自動起動設定を行い、正しく起動したことを確認します。

 # systemctl enable --now clamonacc

--
Created symlink from /etc/systemd/system/multi-user.target.wants/clamav-clamonacc.service to /usr/lib/systemd/system/clamav-clamonacc.service.
--

 # systemctl status clamonacc -l

--
● clamav-clamonacc.service - ClamAV On-Access Scanner
     Loaded: loaded (/usr/lib/systemd/system/clamav-clamonacc.service; enabled;>
     Active: active (running) since Fri 2023-11-17 17:19:55 JST; 6s ago
       Docs: man:clamonacc(8)
             man:clamd.conf(5)
             https://docs.clamav.net/
   Main PID: 2083 (clamonacc)
      Tasks: 8 (limit: 5545)
     Memory: 17.9M
        CPU: 21ms
     CGroup: /system.slice/clamav-clamonacc.service
             mq2083 /usr/sbin/clamonacc -F --config-file=/etc/clamd.d/scan.conf

11月 17 17:19:55 clamtest systemd[1]: Started ClamAV On-Access Scanner.
11月 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: watching '/var/www' (and all sub-directories)
11月 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: watching '/home' (and all sub-directories)
11月 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: extra scanning on inotify events enabled
--

 

/var/log/messages には、clamonacc のログが記録されており、監視対象ディレクトリとOnAccessExtraScanning が正しく認識されたことがわかります。

 # less /var/log/messages

--
Nov 17 17:19:55 clamtest systemd[1]: Started ClamAV On-Access Scanner.
Nov 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: watching '/var/www' (and all sub-directories)
Nov 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: watching '/home' (and all sub-directories)
Nov 17 17:19:55 clamtest clamonacc[2083]: ClamInotif: extra scanning on inotify events enabled
--

 

6-6. リアルタイムスキャンの動作確認

先ほどの検証用のウイルスファイルをコピーしてみて、正しくウイルスと検知することを確認します。

 # cp /var/www/html/eicar.com.txt /var/www/html/eicar.com-cp1.txt

 

clamd のログを確認します。

 # less /var/log/clamd.scan
 
--
Tue Nov 17 17:26:09 2023 -> /var/www/html/eicar.com-cp1.txt: Win.Test.EICAR_HDB-1 FOUND
--

 

↑ウイルスファイルのファイルパスが正しく記録されています。

/var/log/messages でも記録されたことを確認します。

 # less /var/log/messages

--
Nov 17 17:26:09 clamtest clamonacc[1662]: /var/www/html/eicar.com-cp1.txt: Win.Test.EICAR_HDB-1 FOUND
--

 

↑こちらも、ウイルスファイルのファイルパスが正しく記録されています。

通知メールを確認します。

Subject: Virus Found in <hostname>

Virus Found: Win.Test.EICAR_HDB-1 in /var/www/html/eicar.com-cp1.txt

 

↑通知メールでも、ウイルス検知時のファイルパスが正しく記録されています。

ClamAV 1.0.4 のリアルタイムスキャンは、検知したウイルスファイルのパスを正しく取得・検知できます!

その後、検証用ウイルスファイルを使用して、

  • wgetコマンドで検証用ウイルスファイルをダウンロード
  • 他のサーバーからscpコマンドで検証用ウイルスファイルをPUT
  • サーバー上で検証用ウイルスファイルをコピー

など、いろいろ操作してみましたが、すべて正しく検知し、ウイルスファイル名がメールで通知されました。
よって、バージョン 1.0.4 では、0.103 のときに問題となっていた以下の点はクリアされたと考えられます。

  • 検証用ウイルスファイルのダウンロード、アップロード、コピー時にウイルスをリアルタイムで検知しないことがある。
  • ウイルス検知時にファイルパスを取得しにくい。

簡単な動作確認でしたが、
「ClamAVのウイルスデータベースに従ったリアルタイムスキャンおよび通知は意図したとおり正しく機能する」
といえるでしょう。

動作確認が終わったら、検証用ウイルスファイルを削除します。

 # rm /var/www/html/eicar*

 

6-7. リアルタイムスキャンの設定について補足(1)

/etc/clamd.d/scan.conf におけるリアルタイムスキャンの設定について補足します。

「ディスク全体 (/) をリアルタイムスキャン対象としたい」という要望もあるかと思いますが、(バージョン 0.103 の時と同様に) clamonacc の仕様では難しいです。

まず、スキャン対象パスを指定する OnAccessIncludePath では、ルートディレクトリ (/) を指定できません。
スキャン対象マウントパスを指定する OnAccessMountPath では、ルートディレクトリ (/) を指定できますが、そうすると、ファイル作成、移動時のスキャンを実施する(OnAccessExtraScanning yes)が設定不可となり、正しく検知できなくなります。

代わりに、

OnAccessIncludePath /usr
OnAccessIncludePath /etc
OnAccessIncludePath /var
OnAccessIncludePath /home
OnAccessIncludePath /opt

のように、上位ディレクトリを列挙することで、ディスク全体のスキャンに近いことが実現できます。
しかし、広範囲のファイルシステムの変化を監視する分、システムに負荷がかかりそうです。

このあたりの設定、制限については、公式ドキュメントに説明があるのでそちらを参照してください。

・On-Access Scanning – ClamAV Documentation
https://docs.clamav.net/manual/OnAccess.html

6-8. リアルタイムスキャンの設定について補足(2)

ちなみに、clamd の設定で、以下のように、ローカルソケットモードではなくネットワークモードで起動すると、バージョン 0.103 のときと同様に、ウイルス検知時のファイルパスは instream(local) となり、取得できませんでした。

 # vim /etc/clamd.d/scan.conf

--
#LocalSocket /run/clamd.scan/clamd.sock
#FixStaleSocket yes
TCPSocket 3310
TCPAddr localhost
--

 # less /var/log/clamd.scan

--
Fri Nov 17 18:58:41 2023 -> instream(local): Win.Test.EICAR_HDB-1 FOUND
--

 

以前バージョン 0.103 で動作確認したときは、「curlのバージョンが古い」ということで clamd をローカルソケットモードで起動できなかったのですが、もしローカルソケットモードで起動できていれば、ウイルス検知時のファイルパスを取得・通知できたのかもしれません。

isd7. おわりに

インターネットに公開するサーバー、とくに、不特定のユーザーにファイルをアップロードさせる機能をもつWebサーバーでは、アンチウイルスソフト等によるウイルス対策が必要です。
定期的にスキャンを実行するよりは、リアルタイムスキャンのほうが速やかに検知・対応が可能となります。

今回は、ClamAV 1.0.4 によるリアルタイムスキャンの設定と動作確認を行いました。
バージョン 1.0.4 では、0.103 のときに問題となっていた以下の点はクリアされたと考えられます。

  • 検証用ウイルスファイルのダウンロード、アップロード、コピー時にウイルスをリアルタイムで検知しないことがある。
  • ウイルス検知時にファイルパスを取得しにくい。

簡単な動作確認でしたが、
「ClamAVのウイルスデータベースに従ったリアルタイムスキャンおよび通知は意図したとおり正しく機能する」
といえるでしょう。

肝心なときに検知しないと意味がありませんので、導入にあたっては、いろいろなパターン、シナリオで検証することをおすすめします。

なお、今回の検証環境では、clamd プロセスがメモリを1.5GBぐらい使用していました。
ClamAVを使用する環境では、CPUを1コア、メモリは2GBぐらい余計に用意すると安心できそうです。
また、ストレージ性能がよくないサーバーですと、スキャンに時間がかかりますし、スキャン中はスキャン以外の処理も極端に遅くなる可能性があるので注意しましょう。

ClamAVは無償で使用できるすばらしいソフトウェアですが、たまにウイルスデータベースの不具合による誤検知があり、運用の手間がかかります。
予算が許すのであれば、GUIで設定・管理が可能な、TrendMicro Deep Security (Workload Security) などの有償ソフトウェアの導入を検討するとよいでしょう。
もちろん、有償ソフトウェアでも誤検知はあり得ますが。
 

(関連記事)
・ClamAVによるリアルタイムスキャンの設定
https://inaba-serverdesign.jp/blog/20210409/clamav-realtime-scan.html

・ClamAVによる定期ウイルススキャンの設定
https://inaba-serverdesign.jp/blog/20170913/clamav_scan_virus_install.html

・ClamAVによる定期ウイルススキャンの運用における工夫
https://inaba-serverdesign.jp/blog/20170919/clamav_scan_virus_manage.html
 

Follow me!