社内や自宅でClamAVを使うPCが1台なら問題ありません。
もしClamAVをインストールしたPCが複数ある場合は、ウイルスデータベースのアップデートに気を配る必要があります。
1台のPCが1日24回、30分ごとに更新確認をすると、10台のPCなら1日240回、3分に1回更新を問い合わせます。
データベースのサイズは日々大きくなっていて、現在は合計400MBほどあります。
データベースミラーは世界中から問い合わせを受けているので、アクセスする頻度が多いと接続を拒否することがあります。
ログに次のような警告がないか確認してください。
WARNING: FreshClam previously received error code 429 or 403 from the ClamAV Content Delivery Network (CDN).
WARNING: You are still on cool-down until after: 2022-05-24 12:15:01
ステータス コード 429 は Too Many Requests 、403 は Forbidden です。
複数台のPCでClamAV使う場合はウイルスデータベースを一度プライベート ミラーで受け取って、ローカルネットワークに再配布します。
そうすることで、公式ミラーサイトに負荷をかけずに、無料で使える恩恵に礼儀を尽くすことができます。
プライベート ミラーの作成はClamAVを本格的に使うための準備です。
プライベート ミラーに必要な構成
プライベート ミラーの機能次の通りです。
- 公式データベース ミラーからデータベース ファイルをダウンロード
- ダウンロードしたデータベース ファイルをウェブ公開
これだけです。
必要なパッケージは以下の通りです。
パターンファイルの取得 | freshclam |
パターンファイルの公開 | apache |
freshclamを実行する | cron |
ログファイルを更新する | logrotate |
ClamAVはDockerのオフィシャル イメージがありますが、今回はDebianコンテナを使って勉強しながらClamAVを設定していきます。
PCやVMにインストールしても手順はほぼ同じです。
Debianコンテナ起動
Debianコンテナイのメージは以前に小さなオフィスでDockerを便利に使う≪導入編≫でビルドしたものを使います。
docker run \
--name=clamav1m \
--hostname=clamav1m \
--network=private-net \
--ip=192.168.11.66 \
--dns="192.168.11.2" \
--dns="8.8.8.8" \
--volume=/v/CLAMAV1M/var_lib:/var/lib/clamav \
--volume=/v/CLAMAV1M/var_log:/var/log/clamav \
--detach=true \
debian11.proto
これでDebianコンテナが立ち上がります。
内容は次の通りです。
コンテナの名前 | clamav1m |
ホスト名 | clamav1m |
使用するネットワーク | private-net (ipvlan) |
ipアドレス | 192.168.11.66 |
プライマリDNS | 192.168.11.2 ※自前のDNSサーバー |
セカンダリDNS | 8.8.8.8 |
ClamAVデータベース用ボリューム | コンテナの/var/lib/clamavをホストの/v/CLAMAV1M/var_libにバインド |
ClamAVログ用ボリューム | コンテナの/var/log/clamavをホストの/v/CLAMAV1M/var_logにバインド |
デタッチモード | オン |
使用するコンテナイメージ | debian11.proto |
プライマリDNSは小さなオフィスでDockerを便利に使う≪導入編≫で作成した自前のDNSキャッシュサーバーです。
ウイルスデータベース 取得/更新 設定
パッケージのインストール
clamav1mコンテナにログオンします。
docker exec -it clamav1m bash
必要なパッケージをインストールします。
apt -y install clamav-freshclam cron logrotate
freshclam 設定
設定ファイルをバックアップしておきます。
cp /etc/clamav/freshclam.conf /etc/clamav/freshclam.conf.orgn
freshclamをDebian流に設定します。
dpkg-reconfigure clamav-freshclam
ここで設定するのは以下のものです。
- アップデートのためにデーモンプロセスを立ち上げるかcronで実行するか
- 一日に何回アップデートを確認するか
- アップデートを clamd に通知するか
- バイトコード データベースをミラーするか
- どの公式ミラーサイトを使うか
daemon か cron か
デーモンが推奨されてますが、ここではcronで実行します。
理由は次の通りです。
- Dockerではログファイルの更新が難しい
- ログファイルをダウンロードするだけなので daemon にする特段のメリットがない
更新頻度
1日の更新回数を12回にしておきます。
daemon ではなく cron でデータベースを更新するので、頻度は cron の設定になります。
dpkg-reconfigureで cron の設定がうまくできていないようなので、あとで手作業で編集します。
clamd へのアップデート通知
ミラー専用の場合は clamd を動かさないので不要です。
バイトコード データベースをダウンロードするか
バイトコードはClamAVのマルウェア検出プラグイン(拡張プログラム)です。
ClamAVのファイル形式のサポートを拡張し、検出性能を向上させます。
必須です。
公式ミラーサイトの選択
少し前までは db.jp.clamav.net などの本来一番近いミラーを選択しましたが、現在はCDN(コンテンツ配信ネットワーク)を使うようになっており、database.clamav.net のみでよくなりました。
freshclam.conf の確認
/etc/clamav/freshclam.conf は以下の通りです。
cat <<'EOF' >/srv/clamav/freshclam.conf
DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose false
LogSyslog false
LogFacility LOG_LOCAL6
LogFileMaxSize 0
LogRotate true
LogTime true
Foreground false
Debug false
MaxAttempts 5
DatabaseDirectory /var/lib/clamav
DNSDatabaseInfo current.cvd.clamav.net
ConnectTimeout 30
ReceiveTimeout 0
TestDatabases yes
ScriptedUpdates yes
CompressLocalDatabase no
Bytecode true
DatabaseMirror database.clamav.net
EOF
cron 設定
freshclam を回していくのは cron です。
freshclam を1日12回、毎時33分に実行するように設定します。
dpkg-reconfigure clamav-freshclam によって /etc/cron.d/clamav-freshclam が生成されています。
これを下記のように編集します。
cat <<'EOF' >/etc/cron.d/clamav-freshclam
33 * * * * clamav [ -x /usr/bin/freshclam ] && /usr/bin/freshclam --quiet >/dev/null
EOF
cron を起動します。
/etc/init.d/cron start
以上でウイルスデータベースの取得/更新ができるようになりました。
/var/lib/clamav/ ディレクトリーにデータベース ファイルがダウンロードされているのを確認してください。
ウイルス データベース 配信設定
配信は freshclam がウイルスデータベースをダウンロードする /var/lib/clanav ディレクトリーをウェブ公開するだけです。
ウェブサーバーをインストール
Nginx でも Apache でもよいのですが、今回は Apache を使います。
apt -y install apache2
/var/lib/clamav のリンクを Apacheの公開ディレクトリー /var/www/html/clamav に作ります。
ln -s /var/lib/clamav /var/www/html/clamav
ログは /var/log/clamav/apache2 に出力するように設定します。
mkdir /var/log/clamav/apache2
サイト設定は以下になります。
cat <<'EOF' >/etc/apache2/sites-available/clamav-mirror.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/clamav
ErrorLog /var/log/clamav/apache2/error.log
CustomLog /var/log/clamav/apache2/access.log combined
</VirtualHost>
EOF
Debian流にサイトの設定を行います。
a2dissite 000-default.conf && a2ensite clamav-mirror.conf
Apache を起動します。
apachectl start
ブラウザでローカルミラーにアクセスして下記のように表示されれば成功です。
ログ管理 (logrotate)
logrotate でログの更新管理を行います。
systemd を使わない Dockerコンテナ では、logrotate は cron で実行されます。
Dockerコンテナでは cron を起動しておく必要があります。
freshclam のログ
freshclam は daemon を使わずに cron でドライブするので、ログのローテーション後にデーモンがログファイルを掴みなおす処理は必要ありません。
毎日更新で365日分のログを保存します。
logrotate の設定ファイルは以下の通りです。
cat <<'EOF' >/etc/logrotate.d/clamav-freshclam
/var/log/clamav/freshclam.log {
rotate 362
# weekly
daily
compress
delaycompress
missingok
create 640 clamav adm
# postrotate
# if [ -d /run/systemd/system ]; then
# systemctl -q is-active clamav-freshclam && systemctl kill --signal=SIGHUP clamav-freshclam || true
# else
# invoke-rc.d clamav-freshclam reload-log > /dev/null || true
# fi
# endscript
}
EOF
Apache のログ
Apache のログは /var/log/clamav/apache2 ディレクトリーに入れるように設定しました。
この中にのlogファイルを毎日更新で365日間保存します。
こちらはデーモンなので、ローテーション後にApacheが新しいファイルを掴みなおす必要があります。
invoke-rc.d が使えないDocker環境なので直接 kill -HUP します。
logrotate の設定は次の通りです。
cat <<'EOF' >/etc/logrotate.d/apache2
/var/log/clamav/apache2/*.log {
daily
missingok
rotate 365
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate
fi
endscript
postrotate
if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
#invoke-rc.d apache2 reload 2>&1 | logger -t apache2.logrotate
/bin/kill -HUP `cat /run/apache2/apache2.pid`
fi
endscript
}
EOF
Dockerコンテナ起動時の設定
コンテナ起動で cron と Apache が自動起動するように /startip.sh に2行追加します。
cat <<'EOF' >/startup.sh
#!/usr/bin/env bash
/etc/init.d/cron start
/etc/init.d/apache2 start
tail -f /dev/null
EOF
プライベートミラーを使うクライアント側の設定
freshclam.conf に PrivateMirror を設定する
プライベートミラーのクライアントには次のように freshclam.conf を設定します。
cat <<'EOF' >/usr/local/etc/freshclam.conf
DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogTime yes
LogVerbose yes
PidFile /run/freshclam.pid
DatabaseOwner clamav
PrivateMirror 192.168.11.66
NotifyClamd /usr/local/etc/clamd.conf
EOF
DatabaseMirror を PrivateMirror に入れ替えるだけです。
PrivateMirror からカスタムデータベースを取り込む
ClamAV で 新しいGoogle Safe Browsing を使うで解説するような独自のデータベースをプライベートミラーからダウンロードする場合は freshclam.conf に次のディレクティブを追加します。
DatabaseCustomURL http://192.168.11.66/safebrowsing.gdb
これはプライベートミラー(IPアドレス 192.168.11.66)の safebrowsing.gdb ファイルを http で取り込む設定です。
アップデートの確認
最新の ClamAV をインストールする方法で解説したように、公式ミラーを使う場合はDNSのTXTレコードでアップデート情報を取得しました。
プライベートミラーではDNSを使用せず次の方法でアップデートを確認します。
- HTTP の
If-Modified-Since
リクエストで確認する - リモートデータベースファイルのヘッダーを直接確認する
プライベートミラーでは公式ミラーとの通信で通信負荷を軽減するために使われていた差分アップデート(CDIFF)には対応しません。
まとめ
ClamAV のプライベート ミラーは簡単に作ることができます。
データベースファイルが巨大なので、複数のClamAVがそれぞれインターネット経由で公式ミラーからデータベースをダウンロードするとリソースを消耗します。
インターネットへの出口を共有するClamAVが2台以上あるならプライベートミラーを設置しておくことをお勧めします。