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 |
プライマリDNS | 192.168.11.2 |
セカンダリDNS | 8.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 clamav | ClamAVの実行ユーザー |
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.dat | CDNで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 などのパッケージ化された最新バージョンがあるので、比較的簡単にインストールできます。