ClamAVウィルスデータベースのローカルミラーの作り方

2007年2月20日追記

注:Ver. 0.90からスクリプトアップデート(差分更新)の仕組みが導入されました。
これにより、データベースの持ち方が変更になっています。

0.90以降を使用する場合、ローカルミラーを作るのは推奨しません

ローカルミラーではなく、プロキシーを活用される事を勧めます。

なお、既にローカルミラーを使用している場合は、ミラーするホストでは freshclam.conf に ScriptedUpdates No と設定してください。


おおげさに「作り方」とか書いていますが、 実はとても簡単です。

必要な条件

ローカルミラーを作るために必要な条件です。

2台以上のクライアントが存在する事
あまりにも当り前の事ですが、一台だけしかデータベースを参照しないのなら、 ミラーを作る意味はありません(^^;
まぁ2台程度でもあまり意味は無いような気もしますので、 実際は5〜6台以下であれば、直接取りに行った方が良いかもしれません。
ドキュメントルートディレクトリに任意のファイルやシンボリックリンクを置く事のできるhttpd(Webサーバ)を持っている事
置かなくてはいけないのはファイル2つだけですが、 それらのファイルを置いても良い権限を持つサーバが必要です。
勝手に他人のサーバに置いてはいけません(^^;
バーチャルドメインでも問題ありあせん (公式のミラーもバーチャルドメインです)し、 ミラーのために専用のものである必要もありません。
既に動いているものがあれば、そこへの同居でも全く問題ありません (ミラー側としては)
そのサーバでfreshclamを動かせる事
実は必須ではありませんが、freshclamが動かせれば超簡単です。

ミラーの仕組み

freshclamを稼働させると、たとえばDebianの場合 /var/lib/clamav というディレクトリに、main.cvd, daily.cvd という2つのファイルが 公式データベースから取得されて来ます。
ClamAVのウィルスデータベースはこの2つのファイルだけです。

この2つのファイルがクライアントで取得できれば良いという事になります。

クライアントでは、データベースサーバのルートディレクトリにあると仮定する main.cvd, daily.cvd という2つのファイルを取得しに行くだけですので、 後はクライアントが参照する先のサーバをローカルのサーバにすれば良い事になります。

ミラーサーバの設定

Debian標準であれば、freshclamで取って来たファイルは /var/lib/clamavに、 httpdのドキュメントルートは /var/www になりますから、 この場合だと

# ln -s /var/lib/clamav/main.cvd /var/www/main.cvd
# ln -s /var/lib/clamav/daily.cvd /var/www/daily.cvd

とすればおしまいです。
freshclam/ドキュメントルートが違うディストリビューション等では、 それぞれ適切なパスにしてください。

Windowsでも原理は一緒ですが、設定は良くわかりません(^^;
基本的にはClamWinで取得したmain.cvd, daily.cvdを ルートディレクトリにあるように見えるように何らかの設定を行えば良いハズ。

クライアントの設定

Un*x系の場合

/etc/clamav/freshclam.conf というファイルに DatabaseMirror という行があると思います。
この行はデフォルトでは database.clamav.net になっていると思いますが、 ここをローカルのミラーサーバにして下さい。
後はfreshclamを立ち上げ直せばローカルのミラーからデータベースを取得するようになります。

ここで注意しなくてはいけないのは、 この設定はミラーサーバにはやってはいけない という事です。
当り前の話ですが、ミラーサーバ自身は公式ミラーから新しいデータベースを持って来ないと意味がありません(^^;

Windows系の場合

Windowsで動く、ClamWinを使っている場合は、 OpenClamWinでウィンドを開き、PreferencesのInternet Updatesタブにある Download Siteにローカルのミラーサーバを指定します。

freshclamを使わないとダメ?

ローカルミラーサーバではfreshclamを動かしたくない、 あるいはデーモンを立ち上げる程の権限は無いという場合もあるかもしれません。
その場合wgetなどでデータを取得しても良いでしょうか?

答えとしては「悪くは無いが好ましくはない」です。

ClamAVのデータベースは、複数の公式ミラーサイトがエリア別にDNSラウンドロビンで割り当てられており、同じdatabase.clamav.netと指定されていても、 毎回違うサーバに接続されてしまう可能性があります(というか毎回違うはず)
そのため、If-Modified-Sinceヘッダを使った場合、 サーバの時刻設定のズレ等により、 正しく動作しない可能性もあります。
ですから、freshclamではmain.cvd, daily.cvd の最初の512byteをRange指定で取得し、 そこに書かれたデータベースのバージョンによって、 新たに取得すべきか否かを判断しています。
wgetではこのような動作ができませんので、 毎回全ファイルを取得してしまうか、 サーバの時刻のズレにより、取得すべきファイルが取得できないかの、 どちらかの事象が発生する可能性があります。

freshclamをデーモンとして立ち上げる事ができない場合は、 wgetの代わりにfreshclamをコマンドとして利用するのも一法です。
たとえば

$ freshclam --quiet --log=/any/where/freshclam.log --datadir=/var/www/

とすれば、1回だけ実行して常駐せずに終ります。
この時、実行するuidで/any/where, /var/wwwに書き込みができる権限が必要です。
もし、/var/wwwに書き込める権限で実行するのが好ましくなければ、 上で書いたサーバの設定に従い、 /var/wwwから/any/whereへのシンボリックリンクだけをhttpdの権限で作成しておき、 データベースの更新は --datadir=/any/whereとして、 /any/whereへ書き込みができる権限で実行するというのが良いかもしれません。

どれくらいの間隔で更新すれば良いんでしょう?

わかりません(^^;

最低を言えば、一日一度は更新すべきです。
5分に一度更新するのはやり過ぎです(^^;
最も頻繁にやったとして、ローカルミラーサーバは1〜2時間に一度、 クライアントは30分に一度ぐらいでいいんじゃないでしょうか?
もうちょっと遅くても良いとは思いますが。

ローカルミラーをすると最悪の場合、 ローカルミラーサーバの更新間隔+クライアントの更新間隔 分だけ更新が遅れる可能性がありますので、 クライアントは高頻度で更新した方が良いとは思いますが、 サイトのポリシーで決めて下さい。

サーバへpushしてもらえませんか?

公式ミラーになればpushしてもらえます(^^;

そんな殺生な(^^;何とかならない?

Clamav-virusdbメーリングリストに登録すると、データベースが更新される度にメールが来ます。
こちらの公式ミラーサイトへデータがpushされて来た時間と、 MLからのメールが来た時間を比較すると、 だいたいpushされた後にメールが来るようですので、 このメールが来たタイミングで更新するようにすればだいたい良い感じかもしれません。

ただし、何かタマにメールが抜けてる事がありますし (bulkメールなので、リトライせずに棄ててる?)、 「ウィルスとしてユーザから投稿されたけどコレはもう登録されてるよ」 というような情報もメールでやって来てしまいますから、 多少の抜け/冗長はあると思います。

まぁでも登録されなかったという情報は数日分をまとめて一通で送ってきますから、 冗長の方はあまり気にする必要は無いでしょう。

抜けちゃう方はイカンともし難いですが(^^;、 メールをきっかけにした更新以外に、 一日一度(or数度)更新するようにすれば良いのではないでしょうか?


ClamAVのページへ戻る
Copyright (C) 2004 Masaki Ikeda
mailto:masaki@orange.co.jp