Clam Anti Virus プライベート ミラー の作り方

セキュリティー

社内や自宅で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
プライマリDNS192.168.11.2 ※自前のDNSサーバー
セカンダリDNS8.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

ここで設定するのは以下のものです。

  1. アップデートのためにデーモンプロセスを立ち上げるかcronで実行するか
  2. 一日に何回アップデートを確認するか
  3. アップデートを clamd に通知するか
  4. バイトコード データベースをミラーするか
  5. どの公式ミラーサイトを使うか

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台以上あるならプライベートミラーを設置しておくことをお勧めします。

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