2006年05月02日 (火)

ClamAV と ClamXav: 第二回 ClamAV による定期スキャンと更新

前回のエントリで予告した ClamXav のスケジュール設定の代わりの設定について説明します。

概要

ClamXav の環境設定の [スケジュール] タブで設定する定期スキャンとウィルス定義ファイルの定期更新は次の理由であまりお薦めしません。

  • スキャン対象がホームディレクトリに限定される
  • スキャンの除外対象の設定などは効かない
  • 複数のユーザが使用するときは無駄が多い

今回はこれらの欠点がない定期スキャンとウィルス定義ファイルの定期更新の設定の仕方を説明します。ここでは毎日行うユーザのホームディレクトリ群のスキャンと週一回行う全体のスキャンを設定するとともに、それぞれのスキャン直前にウィルス定義ファイルのアップデートの確認を行う設定を目標とします。

定期スキャン用シェルスクリプトの作成

ClamXav の各種設定とより詳細な設定を予め仕込んだシェルスクリプトを作成します。ここで例に挙げる仕込む内容は次のとおりです。

  • 通常の出力は全て標準出力に出力する。

    これは後にこのシェルスクリプトを利用する箇所での記録の都合です。

  • 感染していないファイルは出力しない。

    これを設定しないとスキャンしたファイルが全て出力されてしまい、ログを見てもどのファイルが感染していたのかすぐにはわからなくなってしまうからです。

  • 標準出力とは別にログを /var/log/clamav-scan.log にとる。

    /Applications/Utility/Console.app (コンソール) でスキャンだけのログを参照できるようにスキャン専用のログファイルを設定します。

  • アーカイブの圧縮率制限を緩くする。

    圧縮率が大きいアーカイブファイルは展開により多くのメモリを必要とします。このため DoS 攻撃のために極端な圧縮率を持つアーカイブファイルが使用される可能性があります。ClamAV ではデフォルトで 250 という値(多分 解凍すると 250% の大きさになる圧縮率という意味)以上の圧縮率のアーカイブファイルは Oversized.Zip という検出名で感染ファイルとします。

    しかし「でじたるおれんじ」の PICMAC さんがエントリ「注意!ClamXav がウィルスを発見!?」で書いてらっしゃるように、実際には無害のアーカイブも過剰に Oversized.Zip と判定されてしまいます。

    ですからこの圧縮率制限は実情に合わせて緩くする必要があるのですが ClamXav にはその設定がありません。このため ClamXav がフォルダ監視に使用する ClamXavSentry は Oversized.Zip と判定してしまいます。これと同様の現象が定期スキャンでは起らないように緩めに設定しておきます。

  • スキャン対象から除外するファイルのパターンを指定する。

    前回のエントリで設定したスキャン対象から除外する設定相当に加えて、ディスクイメージファイルの圧縮ファイル、移動されたり削除されると OS そのものが起動できなくなるカーネルファイルも除外します。

  • 隔離フォルダをスキャン対象から除外する。

    ファイルのパターンではなくディレクトリ単位での除外の設定をします。隔離フォルダは /Users/.virus だと仮定します。

  • 特殊なファイルやネットワークボリュームをスキャン対象から除外する。

    USB メモリや iDisk のようなネットワークドライブをスキャン対象から除外します。特にネットワークドライブもスキャンするとファイルの内容取得そのものに相当の時間を消費してしまうからです。

以上を仕込んだシェルスクリプトの内容は次のようになります。取り敢えず適当な場所に cronscan という名前(拡張子なし)で保存してください。
お使いのブラウザの表示で円マークに見えているものがあってもバックスラッシュだと解釈してください。

#!/bin/sh

/usr/local/clamXav/bin/clamscan -r \
--stdout \
--infected \
--log="/var/log/clamav-scan.log" \
--move=/Users/.virus \
--max-ratio=500 \
--exclude='/clamav-[0-9]+(\.[0-9]+)*\.tar\.gz$' \
--exclude='[^/]+\.vhd$' \
--exclude='[^/]+\.dmg$' \
--exclude='[^/]+\.dmg\.gz$' \
--exclude='[^/]+\.dmg\.bz2$' \
--exclude='^/+mach_kernel$' \
--exclude-dir='^/+Users/\.virus$' \
--exclude-dir='^/+dev$' \
--exclude-dir='^/+afs$' \
--exclude-dir='^/+Network$' \
--exclude-dir='^/+Volumes$' \
--exclude-dir='^/+automount$' \
$*

--exclude で指定するスキャン対象から除外するファイルのパターンは何度も設定でき、ファイルのパターンではなくディレクトリのパターンを --exclude-dir で別に指定できるので ClamXav で同様の設定をする場合よりも単純になります。

また改行をバックスラッシュでエスケープすることで、一つのオプション("--" で始まる設定)に一行を割り当てることができるので保守もしやすくなります。

このファイルを /usr/local/clamXav/bin にコピーします。まず Finder のメニューで [移動]-[フォルダへ移動...] を実行し、/usr/local/clamXav/bin と入力して [移動] ボタンを押します。すると /usr/local/clamXav/bin という ClamAV のコマンドが置かれているディレクトリが開かれます。そこに先程作成した cronscan を移動させてください。このとき「"/usr/local/clamXav/bin" は変更できないので、項目"cronscan"は移動できませんでした」というメッセージが現れますが [認証] ボタンが付いています。この [認証] ボタンを押すと管理者アカウントの認証画面が現れるので管理者アカウントの名前とパスワードを入力して [OK] ボタンを押してください。

そしてターミナルを開いてターミナルウィンドウに次をタイプして改行してください。

sudo chmod a+rx /usr/local/clamXav/bin/cronscan

管理者アカウントのパスワードを求められるのでログインするときに使用したパスワードをタイプして改行してください。このパスワードはウィンドウにエコーバックされません。

日次スキャンの設定

crontab というファイルを書き換えて cron を利用するのが定期的な処理の通常の手段ですが、crontab を編集するためには同名の crontab コマンドを使用し、その crontab コマンドでは vim というターミナルベースのエディタが使用されるのがデフォルトです。ターミナルベースのエディタは UNIX システムに慣れていないとかなり苦痛だと思います。そこでここでは定期更新とスキャンをもっと Mac OS X のシステム的な設定を利用しながら通常のファイルの編集でまかなう手段をとることにします。その方がかえって楽ですし、crontab は個々のユーザの設定であって今設定しようとしているのはユーザをまたがるシステム管理としての設定なのでその方が意味的にも合っているからです。

日次スキャンのためのファイルを次の内容にして、取り敢えず適当な場所に daily.local というファイル名で保存してください。

if [ `date +%w` -ne 6 ]; then
    /usr/local/clamXav/bin/freshclam --quiet --log="/usr/local/clamXav/share/clamav/freshclam.log"
    /usr/local/clamXav/bin/cronscan /Users
fi

次に Finder のメニューで [移動]-[フォルダへ移動...] を実行し、/etc と入力して [移動] ボタンを押します。すると /etc というシステムの様々な設定ファイルが置かれているディレクトリが開かれます。そこに先程作成した daily.local を移動させてください。このとき「"/etc" は変更できないので、項目"daily.local"は移動できませんでした」というメッセージが現れますが [認証] ボタンが付いています。この [認証] ボタンを押すと管理者アカウントの認証画面が現れるので管理者アカウントの名前とパスワードを入力して [OK] ボタンを押してください。

以上で、日次スキャンが設定されました。この設定では週次スキャンが行われない日に限ってウィルス定義ファイルを更新してから各ユーザのホームディレクトリとユーザ間で共有するディレクトリをスキャンします。

週次スキャンの設定

週次スキャンもほぼ同じ手順で設定します。週次スキャンのファイル名は weekly.local として、次の内容にしてください。

/usr/local/clamXav/bin/freshclam --quiet --log="/usr/local/clamXav/share/clamav/freshclam.log"
/usr/local/clamXav/bin/cronscan /

次に Finder のメニューで [移動]-[フォルダへ移動...] を実行し、/etc と入力して [移動] ボタンを押します。すると /etc というシステムの様々な設定ファイルが置かれているディレクトリが開かれます。そこに先程作成した weekly.local を移動させてください。このとき「"/etc" は変更できないので、項目"weekly.local"は移動できませんでした」というメッセージが現れますが [認証] ボタンが付いています。この [認証] ボタンを押すと管理者アカウントの認証画面が現れるので管理者アカウントの名前とパスワードを入力して [OK] ボタンを押してください。

以上で週次スキャンが設定されました。この設定ではウィルス定義ファイルを更新してからローカルディスク全体をスキャンします。

この方法の利点

既に述べたことも含めて ClamXav のスケジュールによる設定と比較した利点は次のとおりです。

  • スキャン内容を細かく指定できる。

    ClamXav のスケジュールによる定期スキャンは常に一定の方法でしかスキャンできません。

  • ClamXav を使用していないユーザの領域も確実に検証できる。

    複数のユーザが使用する Mac OS X では例え使用するように言っておいても ClamXav を利用していないユーザもいるかもしれません。スキルの差でできないこともあります。ウィルス対策ソフトはうざいので外したなんていう人もいるかもしれません。ウィルスの類いは個々のユーザにだけ影響を及ぼすのではなくシステム全体に影響を及ぼす(と思われる)のでこのようなウィルス対策はユーザ毎の対策ではなく Mac OS X というシステムの管理として行うべきです。そうでないと、他の不注意なユーザのために普段注意しているあなたのファイルまで感染したり漏洩したりするかもしれないのです。

  • ユーザが別個に設定する無駄を省ける。

    それぞれのユーザの意識が高い、あるいは管理者であるあなたが代わりに設定したなどによって全てのユーザが ClamXav を利用していたとしたら、それはそれでよいことではありますが、無駄なことでもあります。スケジュールが重なっていたりそれぞれのユーザがウィルス定義ファイルの更新を毎日したりということになります。システムの管理という観点でここは一括して行うのが無駄を省きます。

  • 低い優先度で実行される。

    徹夜仕事で何かをしているとき、丑三つ時も過ぎてそろそろ明日の朝までに間に合うかどうか焦っているとします。そのとき定期スキャンが始まってシステムが重くなったとしたら嫌ですよね。ClamXav がスケジュールで利用する cron による処理は通常の優先度で実行されますが、ここで行った設定(periodic といいます)による定期処理は通常よりも低い優先度で実行されます。

    iChat を深夜に立ち上げるといつもサインインしているあの人とこの人とその人なんかに丁度いいと思います。
    # 深夜に iChat を立ち上げるということは…私にも丁度良いのです。^^;

欠点ですか?
ClamXav のスケジュールと比較した欠点はありません。しかし改良すべきことはあります。それは一度スキャンして合格したファイルを毎日毎週チェックするのは無駄だということです。そのうち VirusBarrier でいうターボスキャンを実装した clamscan コマンドに代わるコマンドを perl で作ろうかと思っています。それはまたいずれ。

次回予告

今回説明した設定で毎日の定期スキャンはウィルス定義ファイルが最新の状態で行われるのですが、ClamAV のウィルス定義ファイルは多いときでは一日に二度更新されたりもします。またこの設定による更新の直後にウィルス定義ファイルがアップデートされたら 24 時間近くウィルス定義ファイルは古いままになります。

それくらいは許すという選択肢もありますが、更に頻繁に自動でウィルス定義ファイルの更新をするための設定を紹介します。これは LAN でウィルス対策を集中管理するための布石でもあります。


Posted: 20:05    | Comment | Trackback


以下、類似エントリです。