最新の ClamAV をインストールする方法

セキュリティー

Clam Anti Virusはオープンソースのアンチウイルスソフトです。

ディストリビューションのパッケージをインストールすれば手間が省けるのですが、すぐに古くなってしまいます。

次のようなログが残っていると不安になります。

WARNING: Your ClamAV installation is OUTDATED!

セキュリティーの観点からは、本家から最新のものをインストールするのが理想的です。

最新のClamAV(Clam Anti Virus)をインストールする方法を解説します。

Debianパッケージでインストールする方法はClam Anti Virus(ClamAV)インストールと設定で解説しています。

コンテナを用意する

今回はDockerコンテナに設定していきます。

docker run \
 --name=clamav0 \
 --hostname=clamav0 \
 --network=private-net \
 --ip=192.168.11.65 \
 --dns="192.168.11.2" \
 --dns="8.8.8.8" \
 --volume=/v/CLAMAV0/var_lib_clamav:/var/lib/clamav \
 --volume=/v/CLAMAV0/var_log_clamav:/var/log/clamav \
 --volume=/v/CLAMAV0/var_log_apache2:/var/log/apache2 \
 --volume=/v/CLAMAV0/srv:/srv \
 --detach=true \
 debian11.proto

内容は次の通りです。

コンテナの名前clamav0
ホスト名clamav0
使用するネットワークprivate-net (ipvlan)
ipアドレス192.168.11.65
プライマリDNS192.168.11.2
セカンダリDNS8.8.8.8
データベース用ボリュームコンテナの/var/lib/clamavをホストの/v/CLAMAV0/var_lib_clamavにバインド
ClamAVログ用ボリュームコンテナの/var/log/clamavをホストの/v/CLAMAV0/var_log_clamavにバインド
Apacheログ用ボリュームコンテナの/var/log/apache2をホストの/v/CLAMAV0/var_log_apache2にバインド
予備のボリュームコンテナの/srvをホストの/v/CLAMAV0/srvにバインド
デタッチモードオン
使用するコンテナイメージdebian11.proto

コンテナ イメージについては小さなオフィスでDockerを便利に使う≪導入編≫を参照してください。

最新のClamAVをインストール

コンテナにログインします。

docker exec -it clamav0 bash

パッケージのダウンロード

本家から最新のdebパッケージをダウンロードします。

apt -y install wget
wget https://www.clamav.net/downloads/production/clamav-0.105.0.linux.x86_64.deb -P /srv/

最新のものを確認してダウンロードしてください。

ClamAVのインストール

インストールします。

apt install /srv/clamav-0.105.0.linux.x86_64.deb

最新バージョンのClamAVがインストールされていることを確認します。

apt info -a clamav

出力は次の通りです。

Package: clamav
Version: 0.105.0-1
Status: install ok installed
...

インストール先の確認

freshclam はどこにあるか確認します。

# which freshclam
/usr/local/bin/freshclam
# ls -l /usr/local/bin/
合計 3880
-rwxr-xr-x 1 root root    1020  5月  3 01:49 clamav-config
-rwxr-xr-x 1 root root  105488  5月  3 01:52 clambc
-rwxr-xr-x 1 root root  105424  5月  3 01:52 clamconf
-rwxr-xr-x 1 root root  121904  5月  3 01:52 clamdscan
-rwxr-xr-x 1 root root  332208  5月  3 01:52 clamdtop
-rwxr-xr-x 1 root root  138504  5月  3 01:52 clamscan
-rwxr-xr-x 1 root root 1760720  5月  3 01:52 clamsubmit
-rwxr-xr-x 1 root root   52288  5月  3 01:52 freshclam
-rwxr-xr-x 1 root root 1343032  5月  3 01:52 sigtool

clamd の場所を確認します。

# which clamd
/usr/local/sbin/clamd
# ls -l /usr/local/sbin/
合計 1888
-rwxr-xr-x 1 root root  171672  5月  3 01:52 clamd
-rwxr-xr-x 1 root root 1760744  5月  3 01:52 clamonacc

conf ファイルのサンプルの場所は次の通りです。

# ls -l /usr/local/etc/
total 44
-rw-r--r-- 1 root root 27171 May  3 01:48 clamd.conf.sample
-rw-r--r-- 1 root root  7205 May  3 01:48 freshclam.conf.sample

conf ファイルは次のコマンドで生成することもできます。

clamconf -g freshclam.conf > freshclam.conf
clamconf -g clamd.conf > clamd.conf
clamconf -g clamav-milter.conf > clamav-milter.conf

ClamAV用のユーザー/グループを作成

groupadd clamav
useradd -g clamav -s /bin/false -c "Clam Antivirus" clamav

ClamAV用ディレクトリーのパーミション設定。

chown clamav /var/log/clamav
chown clamav /var/lib/clamav

freshclam の設定

設定ファイルは /srv/clamav/ に置くことにします。

mkdir /srv/clamav

freshclam.conf ファイル

freshclam.conf ファイルを以下のいずれかの方法で生成します。

clamconf -g freshclam.conf > /srv/clamav/freshclam.conf
cp /usr/local/etc/freshclam.conf.sample /srv/clamav/freshclam.conf

/srv/clamav/freshclam.conf を編集して以下のようになりました。

cat <<'EOF' >/srv/clamav/freshclam.conf
DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogTime true
DatabaseDirectory /var/lib/clamav
DNSDatabaseInfo current.cvd.clamav.net
ReceiveTimeout 300
DatabaseMirror database.clamav.net
EOF

内容は以下の通りです。

設定意味
DatabaseOwner clamavClamAVの実行ユーザー
UpdateLogFile /var/log/clamav/freshclam.logログファイルの場所を指定します
LogTime true時間をログに記録する
DatabaseDirectory /var/lib/clamavウイルスデータベースの保存先を指定します
DNSDatabaseInfo current.cvd.clamav.netアップデートを確認するDNSサイト
ReceiveTimeout 300ダウンロードにかかる時間のリミット
DatabaseMirror database.clamav.netミラーサイトを指定します

上記以外はデフォルト値が設定されます。

デフォルト値を上書きしたい場合はディレクティブを追加します。

古い形式ではミラーサイトにdb.jp.clamav.netなどを設定していましたが、このように設定しても database.clamav.net に書き換えられます。

freshclam がミラーネットワークではなくコンテンツ配信ネットワーク(CDN)を使用するようになったためです。

freshclam 実行

freshclam の実行は cron で行うのですが、設定ファイルの確認もかねて手動で実行してみます。

–verbose オプションによって詳細情報が出力されます。

freshclam --config-file=/srv/clamav/freshclam.conf --verbose

/var/lib/clamav/ にデータベースファイルがダウンロードされていることを確認します。

# ls -l /var/lib/clamav/
合計 376912
-rw-r--r-- 1 clamav clamav    293670  5月 23 11:54 bytecode.cvd
-rw-r--r-- 1 clamav clamav 184878080  5月 31 17:33 daily.cld
-rw-r--r-- 1 clamav clamav        69  5月 24 12:33 freshclam.dat
-rw-r--r-- 1 clamav clamav 170479789  5月 23 11:54 main.cvd

ウイルスデータベース ファイル

ファイルの役割

ダウンロードされるファイルの役割は以下の通りです。

ファイル名役割
daily.cld最新の脅威のシグネチャが含まれる(毎日更新)
main.cvd以前はdaily.cvdにあったシグネチャー。誤検知のリスクが低いものが含まれる
bytecode.cvdバイトコードインタープリターエンジンによって評価されたすべてのコンパイル済みバイトコードシグネチャーが含まれる
freshclam.datCDNでHTTP User-Agent に含めるUUID

daily nain bytecode の拡張子は cvd か cld のどちらかになります。

cvd と cld

cvd ファイルは本来のウイルスデータベース ファイルです。

cld ファイルは差分ダウンロードに対応したCDIFFファイルです。

ウイルスデータベースは巨大なファイルなので、効率的なダウンロード(CDIFF)方法で保存されるのが cld です。

データベースのバージョン

データベースのバージョン情報は sigtool で確認することができます。

# sigtool --info /var/lib/clamav/daily.cld 
File: /var/lib/clamav/daily.cld
Build time: 14 Jun 2022 04:17 -0400
Version: 26572
Signatures: 1985954
Functionality level: 90
Builder: raynman
Verification OK.
# sigtool --info /var/lib/clamav/main.cvd 
File: /var/lib/clamav/main.cvd
Build time: 16 Sep 2021 08:32 -0400
Version: 62
Signatures: 6647427
Functionality level: 90
Builder: sigmgr
MD5: 137eccce31aacb21b5a98bb8c21cefd6
Digital signature: twaJBls8V5q64R7QY10AatEtPNuPWoVoxTaNO1jpBg7s5jIMMXpitgG1000YLp6rb0TWkEKjRqxneGTxuxWaWm7XBjsgwX2BRWh/y4fhs7uyImdKRLzQ5y8e2EkSChegF/i8clqfn+1qetq9j4gbktJ3JZpOXPoHlyr2Dv9S/Bg
Verification OK.
# sigtool --info /var/lib/clamav/bytecode.cvd 
File: /var/lib/clamav/bytecode.cvd
Build time: 08 Mar 2021 10:21 -0500
Version: 333
Signatures: 92
Functionality level: 63
Builder: awillia2
MD5: d82da5df59cd2fc80f01f7895a5a88fd
Digital signature: fZK0/xJjlUDNYHpYX/4kE5X1aEWoNa0FR9TJwCtPa071Fky1U8Q/26q/pKHh7/2PWhPOEKup7bWVDFDUjqLULDrQIASQTmoueAWpO9AbjjUV7JRnzoOszlyfvHEYPdLbaU66YHGXKp83MQzF0tyQd7OygMpCIy/2Y9utHcEMb9i
Verification OK.

これらの情報はデータベースファイルの先頭512バイトに記述されています。

作成日付やバージョンなどがコロンで区切られて繋がっています。

# head -c 512 /var/lib/clamav/main.cvd 
ClamAV-VDB:16 Sep 2021 08-32 -0400:62:6647427:90:137eccce31aacb21b5a98bb8c21cefd6:twaJBls8V5q64R7QY10AatEtPNuPWoVoxTaNO1jpBg7s5jIMMXpitgG1000YLp6rb0TWkEKjRqxneGTxuxWaWm7XBjsgwX2BRWh/y4fhs7uyImdKRLzQ5y8e2EkSChegF/i8clqfn+1qetq9j4gbktJ3JZpOXPoHlyr2Dv9S/Bg:sigmgr:1631795562
# head -c 512 /var/lib/clamav/daily.cld 
ClamAV-VDB:01 Jun 2022 04-06 -0400:26559:1985372:90:X:X:raynman:1654070764
# head -c 512 /var/lib/clamav/bytecode.cvd 
ClamAV-VDB:08 Mar 2021 10-21 -0500:333:92:63:d82da5df59cd2fc80f01f7895a5a88fd:fZK0/xJjlUDNYHpYX/4kE5X1aEWoNa0FR9TJwCtPa071Fky1U8Q/26q/pKHh7/2PWhPOEKup7bWVDFDUjqLULDrQIASQTmoueAWpO9AbjjUV7JRnzoOszlyfvHEYPdLbaU66YHGXKp83MQzF0tyQd7OygMpCIy/2Y9utHcEMb9i:awillia2:1615216911

データベースのアップデート情報

FreshClamは、DNSのTXTレコードを使用して最近のデータベースとソフトウェアのバージョンを確認します。

問い合わせ先DNSのデフォルトは current.cvd.clamav.net です。

dig を使って問い合わせると次のような回答を得ます。

$ dig txt current.cvd.clamav.net

; <<>> DiG 9.16.27-Debian <<>> txt current.cvd.clamav.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20121
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: a554e74310616a71010000006297103c0c35a21898a2b6d6 (good)
;; QUESTION SECTION:
;current.cvd.clamav.net.		IN	TXT

;; ANSWER SECTION:
current.cvd.clamav.net.	1413	IN	TXT	"0.103.6:62:26558:1654066800:1:90:49192:333"

;; Query time: 3 msec
;; SERVER: 192.168.11.2#53(192.168.11.2)
;; WHEN: Wed Jun 01 16:07:40 JST 2022
;; MSG SIZE  rcvd: 134

回答された”0.103.6:62:26558:1654066800:1:90:49192:333″の意味は次の通りです。

回答意味
0.103.6最近リリースされたClamAVバージョン
62最近公開されたmain.cvdのバージョン
26558最近公開されたdaily.cvdのバージョン
1654066800収録シグネチャーの数
1最近公開されたfreshclam.datのバージョン
90シグネチャー使用に必要なファンクションレベル
49192
333最近公開されたbytecode.cvdのバージョン

データベースの更新

FreshClam はウイルスデータベースを更新するプログラムです。

自動更新を行うには、デーモンとして常駐させるか cron によってタスクを実行します。

今回は cron で1時間おきに実行します。

cron の定義ファイルは以下の通りです。

cat <<'EOF' >/etc/cron.d/clamav-freshclam 

33 * * * *    clamav [ -x /usr/local/bin/freshclam ] && /usr/local/bin/freshclam --config-file=/srv/clamav/freshclam.conf --quiet >/dev/null
EOF

clamscan でウイルス検索

以上でウイルスデータベースの準備ができました。

デーモンを使わない clamscan でウイルス検索ができます。

検索の手順はClam Anti Virus(ClamAV)インストールと設定を参照してください。

clamd デーモンを起動する

ウイルスデータベースを読み込んで常駐し、リアルタイム検索を提供する clamd を起動します。

clamd.conf は以下の通りです。

cat <<'EOF' >/srv/clamav/clamd.conf
LocalSocket /var/run/clamav/clamd.ctl
LocalSocketGroup clamav
User clamav
DatabaseDirectory /var/lib/clamav
LogFile /var/log/clamav/clamav.log
LogTime true
PidFile /run/clamd.pid
EOF

ログのローテーションに際してプロセスを再起動するために、PidFile を設定しておきます。

ClamAV バージョン 0.105.0 からデフォルトのMaxサイズ設定値が4倍に増えていますので留意してください。

  • MaxScanSize: 100M -> 400M
  • MaxFileSize: 25M -> 100M
  • StreamMaxLength: 25M -> 100M
  • PCREMaxFileSize: 25M -> 100M
  • MaxEmbeddedPE: 10M -> 40M
  • MaxHTMLNormalize: 10M -> 40M
  • MaxScriptNormalize: 5M -> 20M
  • MaxHTMLNoTags: 2M -> 8M

起動します。

/usr/local/sbin/clamd --config-file=/srv/clamav/clamd.conf

clamdscan でウイルス検索

clamdscan を使うことでオーバーヘッドがない検索が可能です。

検索の手順はClam Anti Virus(ClamAV)インストールと設定を参照してください。

ログを管理する

freshclam のアップデートログにつてはClam Anti Virus プライベート ミラー の作り方を参照してください。

clamd のログについても logrotate で管理します。

clamd.log を毎日ローテーションして365日保存します。

cat <<'EOF' >/etc/logrotate.d/clamav-daemon 
/var/log/clamav/clamd.log {
     rotate 365
     daily
     compress
     delaycompress
     create 640  clamav adm
     postrotate
     if [ -e /run/clamd.pid ];then
         pkill -HUP -F /run/clamd.pid clamd 2>/dev/null
     fi
     endscript
     }
EOF

clamd プロセスにシグナルを送る方法は工夫してください。

例えば次のようにすることも可能です。

/bin/kill -HUP `cat /run/clamd.pid`

Doker起動時にcronとclamdを自動起動する

ENTRYPOINT /startup.sh を以下のように設定します。

cat <<'EOF' >/startup.sh 
#!/usr/bin/env bash
/etc/init.d/cron start
/usr/local/sbin/clamd --config-file=/usr/local/etc/clamd.conf
tail -f /dev/null
EOF

コンテナを再起動して cron と clamd が起動していることを確認してください。

docker restart clamav0
# ps -A
    PID TTY          TIME CMD
      1 ?        00:00:00 bash
     27 ?        00:00:00 cron
    107 ?        00:02:00 clamd
    118 ?        00:00:08 tail
   1530 pts/0    00:00:00 bash
   1538 pts/0    00:00:00 ps

clamd の死活監視

clamdscan を使う場合は ClamAV デーモンが起動していることが絶対条件です。

cron で1時間ごとに clamd プロセスがあるか死活監視を行います。

clamd が起動していることを確認して、起動していなければ起動させる必要があります。

cat <<'EOF' >/etc/cron.hourly/check-clamd-alive 
#!/bin/bash
RESULT=`ps -A |grep -E 'clamd$'`
echo $RESULT
if [ -z "$RESULT" ]; then
    /usr/local/sbin/clamd --config-file=/usr/local/etc/clamd.conf
fi
EOF

スクリプトを実行可能にしておきます。

chmod +x /etc/cron.hourly/check-clamd-alive

まとめ

ディストリビューションのパッケージより新しい ClamAV を使いたい場合は本家からダウンロードします。

本家に deb や rmp などのパッケージ化された最新バージョンがあるので、比較的簡単にインストールできます。

タイトルとURLをコピーしました