ClamAVウィルスデータベースのひみつ

「ひみつ」なんて書いてますが、ひみつでも何でもありません(^^;
ソースも公開されていますので、誰でも中身を知る事ができます。

ここで書いている内容は、2004年6月18日現在(バージョンで言うと0.73) の実装に付いて書かれていますので、その後変更されている可能性はあります。
ご注意ください。

誰が取ってくるの?(Who?)

ふつ〜のClamAVでは、freshclamというプログラムがあって、 これがデータベースを取得します。

ClamWinでは、ClamWin自身が取得します。

いつ取ってくるの?(When?)

freshclamでは、/etc/clamav/freshclam.confにあるChecksで指定された値で変わります。
ここで指定するのは「一日何回取得するか」ですので、 ここに12と書けば一日12回(2時間おき)ですし、 24と書けば一日24回(1時間おき)になります。
これはfreshclamがデーモンとして立ち上げられた場合の設定ですから、 最初は立ち上がった時になります。

デーモンとして立ち上げない場合は、 自分でcronなどで設定する必要があります。

Windows版クライアントのClamWinでは「Tools」→「Preferences」→ 「Internet Updates」で「Enable Automatic Virus Database Updates」 にチェックが入っていれば、その下の設定に従ってアップデートします。
「Hourly」を選択すると毎時アップデートしますが、 この時Timeの時間の所を 00 にしておかないと更新されないようです。
(バグ?仕様?)

どこから取ってくるの?(Where?)

ClamAVをインストールすると、ウィルスデータベースを取得する先のサーバとして database.clamav.net となっています。(デフォルトの場合)

ではこの database.clamav.net ってどこでしょう?
ちょっと dig してみましょう。

この項で書かれた仕組みや状況は大幅に変わっています。
下の追記を参考にしてください。
; <<>> DiG 9.2.1 <<>> database.clamav.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14172
;; flags: qr rd ra; QUERY: 1, ANSWER: 15, AUTHORITY: 5, ADDITIONAL: 0

;; QUESTION SECTION:
;database.clamav.net.		IN	A

;; ANSWER SECTION:
database.clamav.net.	5	IN	CNAME	db.local.clamav.net.
db.local.clamav.net.	7200	IN	CNAME	db.asia.clamav.net.
db.asia.clamav.net.	5	IN	A	62.210.153.202
db.asia.clamav.net.	5	IN	A	129.64.99.170
db.asia.clamav.net.	5	IN	A	193.140.143.23
db.asia.clamav.net.	5	IN	A	202.134.0.71
db.asia.clamav.net.	5	IN	A	203.16.234.78
db.asia.clamav.net.	5	IN	A	203.28.142.36
db.asia.clamav.net.	5	IN	A	203.81.40.167
db.asia.clamav.net.	5	IN	A	203.202.10.60
db.asia.clamav.net.	5	IN	A	207.201.202.73
db.asia.clamav.net.	5	IN	A	210.22.201.152
db.asia.clamav.net.	5	IN	A	211.10.155.48
db.asia.clamav.net.	5	IN	A	212.113.16.74
db.asia.clamav.net.	5	IN	A	218.44.253.75

;; AUTHORITY SECTION:
clamav.net.		7200	IN	NS	ns2.oltrelinux.com.
clamav.net.		7200	IN	NS	ns3.clamav.net.
clamav.net.		7200	IN	NS	ns4.clamav.net.
clamav.net.		7200	IN	NS	ns5.clamav.net.
clamav.net.		7200	IN	NS	ns1.oltrelinux.com.

;; Query time: 539 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jun 18 19:13:12 2004
;; MSG SIZE  rcvd: 413

何だかいっぱい出てますが(^^;

という事で、database.clamav.net をサーバに指定すると、 この13台のサーバのどれかからデータを取ってくる事になります。

というのは、私のサイトからdigで引いた場合の話で、 db.local.clamav.net から db.asia.clamav.net へのCNAMEは、 DNSサーバへ問い合わせて来た相手のIPアドレスによって変わってきます。
たとえば、北米からであれば db.america.clamav.net が返ってきます。
これらIPアドレスによるマッピングは、IANA で公表されているリストを元に、 APNIC (Asia Pacific Network Information Centre)に割当てられているIPアドレスには db.asia. を、 ARIN (American Registry for Internet Numbers)に割当てられているIPアドレスには db.america. を... という具合に相手を識別しています。

そのため、asiaと言ってもアジアだけでなく、APNICの管轄である オーストラリア、ニュージーランドなども含まれます。
(詳しくはAPNICのサイトにある...ハズ(^^;)

で、これら、複数登録されたホストのどれかに取りに行く事になります (こういうのをDNSラウンドロビンと言います) が、実際どこに取りに行くのかはその時の運次第(^^; というか、OSの実装とか諸々の影響で決まってきますが、 ふつ〜の実装だと毎回取得する先は変わってくるはずです。

ちなみに、つい先日頃(6/15にアナウンスがありました)から、 db.(カントリーコード).clamav.net という形も登録されています。
この形で引いた場合、その国に複数のサーバがある時はその複数のサーバが、 一台だけ、または全く無い場合は db.local.clamav.net と同じものが返されるようになっているようです。
現在、db.jp.clamav.net で問い合わせると2個のIPアドレスが返ってきます。

それでは日本では db.jp.clamav.net とすべきでしょうか?
これは何とも答え難い問題です(^^;
それぞれの得失を考えると

database.clamav.netのままにした場合
何より、何もしなくて良いので楽(^^;
取得対象のサーバが多いので、どれかがコケている場合も被害が少ない
db.jp.clamav.netとした場合
海を越えてデータを取りに行かなくても済むので速い(カモ)
中国、インドネシアなど、日本からの回線が細い相手に負担をかけないで済む

というのがそれぞれメリットでしょうか。
デメリットはその逆。
私見としては、日本に3〜5台ぐらいミラーができれば db.jp というのも良いでしょうが、2台しか無い現状では database.clamav.net のままにしておいた方が無難かな?と思います。

ただし、上で書いたように、db.localからdb.asiaへのマッピングは、 IANAの情報に基づいており、このリストによる方法は完璧ではありませんから (一部、APNICを通さないでIPアドレスを取得している場合もある。 企業などで他のNICからIPアドレスブロックを取得して使っている場合とか、 歴史的事情とか。 また、社内DNSサーバが他国にあるけどインターネットへの接続は国内からとか)、 自分の所で database.clamav.net を引いてみて、 不適切と思われるものが返ってきた場合(たとえば db.other.clamav.net とか) には、明示的に設定した方が良い場合もあるかもしれません。

2004年6月23日追記
clamavdb.raimei.co.jp さんが新たに日本のミラーサイトとして追加され、 合わせて3台となりました。
そろそろdb.jp.clamav.netと指定しても良いかも・・・
あくまでも、利用される方の判断ですが。 (そうすべきとは言いません)

2005年10月27日追記
8月頃から、日本国内からDNSを引いた場合、db.local.clamav.net から db.asia.clamav.netではなく、 db.jp.clamav.netにCNAMEされるようになっています。
ですから、積極的にdb.jpと指定する必要はほとんどありません。
設定の必要があるとすれば、database.clamav.netからdb.jpが引いて来れない IPアドレスブロックを使っている場合ぐらいでしょう。
また、多くのミラーサイトが新たに加わりましたので (2005/11/27現在、7ヶ所) ある程度安心してdb.jpを利用できる環境が整って来たと思います。

何を取ってくるの?(What?)

古いバージョンの場合は別ですが、 現在のバージョンでは、上記ホストに接続して /main.cvd, /daily.cvd の 2つのファイルを取ってきます。
他には取得するものはありません。

どうやって取ってくるの?(How?)

Range指定で、まずmain.cvdの先頭512byteを取得します。
先頭は

ClamAV-VDB:12 May 2004 01-44 +0200:23:21096:2:2afa38b2ececc44e99e396f97e94adef:W
x0hUnJ7o4I4qlduirFBa2qnd812KvyAL10W3+oyyK4O5jkPOxeN9crzUYNNV8YDRf6wL8dgZHuDUReGw
UcW4XqwhTC9ZEhA2q4uudJ5yh+ReB9A+6Z3Ff2Ox8caKjd4H71fFIMRyTXJSXZiJtuRv6KvZ4L+f+lgO
N68+ZMFVNc:ddm

という感じになっていて、 コロン(:)でフィールドが分けられており、 最初から

という情報が含まれています。
この情報から、現在手元にあるデータベースとサーバにあるデータベースの、 どちらが新しいかを判断し、サーバの方が新しければ全データを取得します。
daily.cvdに付いても同様の方法で更新を行います。

あとがき

なにやら薀蓄(^^;を語っただけで、 別に知らなくても不幸にはならない事ばかりですが、 内部を知ってClamAVを身近に感じて頂けると幸いです。


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