この記事から得られる知識
この記事を読むことで、以下の知識を習得できます。
- ClamAVのリアルタイムスキャン(On-Access Scanning)機能の概要と仕組み
- リアルタイムスキャンに必要なシステム要件の確認方法
- ウイルス定義データベースを自動更新するための
freshclamの設定方法 - ウイルススキャンデーモン
clamdの基本的な設定と起動方法 - リアルタイムスキャンを実現する
clamonaccの詳細な設定方法とサービスとしての起動・自動起動設定 - ウイルス検知時に特定のアクション(通知やファイル隔離など)を実行させるための
VirusEventの活用方法 - 設定後の動作確認と、基本的なトラブルシューティングのヒント
はじめに
ClamAVは、オープンソースの強力なアンチウイルスソフトウェアであり、Linuxサーバーをはじめとする多くの環境で利用されています。 通常のファイルシステムスキャンに加えて、ClamAVは「On-Access Scanning」と呼ばれるリアルタイムスキャン機能を提供しており、ファイルへのアクセスをリアルタイムで監視し、マルウェアの侵入を即座に検知・ブロックすることが可能です。
本記事では、ClamAVのリアルタイムスキャン機能に焦点を当て、その設定方法をステップバイステップで詳細に解説します。サーバーのセキュリティを強化したいと考えているシステム管理者や開発者の方々にとって、実践的なガイドとなることを目指します。
ClamAVのリアルタイムスキャンは、バージョン0.102.0以降、clamdというスキャンデーモンと、clamonaccという新しいアプリケーションが連携して動作する仕組みになっています。 `clamonacc`がファイルシステムのイベントを検知し、`clamd`にスキャンを依頼するという流れです。 この記事では、この新しい仕組みに基づいた設定方法を解説していきます。
1. システム要件の確認
ClamAVのリアルタイムスキャン機能は、LinuxカーネルのfanotifyというAPIを利用しています。 そのため、この機能を使用するには、お使いのLinuxシステムのカーネルがfanotifyをサポートしている必要があります。一般的に、カーネルバージョン3.8以上が必要とされています。
まず、以下のコマンドを実行して、システムのカーネルでfanotifyが有効になっているかを確認します。
cat /boot/config-$(uname -r) | grep FANOTIFY コマンドの実行結果として、以下のように表示されればfanotifyが有効になっています。
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y が表示されている場合、ウイルスを検知した際にファイルへのアクセスをブロックする機能(Prevention)が利用可能です。 もし# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not setと表示されている場合は、検知はできますが、アクセスをブロックすることはできません。
2. ClamAVのインストール
ClamAVがまだインストールされていない場合は、お使いのディストリビューションのパッケージマネージャを使用してインストールします。EPELリポジトリなどを利用することで、最新版に近いバージョンをインストールできることが多いです。
例えば、RHEL系のディストリビューション(CentOS, AlmaLinuxなど)では、以下のコマンドでインストールできます。
sudo dnf install clamav clamav-update clamd Debian/Ubuntu系のディストリビューションでは、以下のコマンドを使用します。
sudo apt-get install clamav clamav-daemon リアルタイムスキャンを実行する`clamonacc`は、`clamav`パッケージに含まれていることが一般的です。
3. ウイルス定義データベースの更新 (freshclam)
ウイルス対策ソフトにとって、定義データベースを最新の状態に保つことは非常に重要です。ClamAVでは、freshclamというツールがその役割を担います。
3.1. freshclam.conf の設定
まず、設定ファイル /etc/freshclam.conf を編集します。 設定ファイルを開き、以下の点を確認・修正してください。
sudo vi /etc/freshclam.conf - Example行のコメントアウト: ファイルの先頭にある
Exampleという行が有効になっているとエラーになります。必ずコメントアウト(行頭に#を付ける)してください。 - ログの設定: ログの出力先やSyslogへの出力有無、タイムスタンプの記録などを設定します。
# ログファイルのパスを指定 UpdateLogFile /var/log/freshclam.log # ログファイルの最大サイズ LogFileMaxSize 2M # ログに時刻を記録 LogTime yes # Syslogへの出力を無効にする LogSyslog no - データベースミラーの指定: 地理的に近いミラーサーバーを指定することで、ダウンロードを高速化できます。日本の場合は
db.jp.clamav.netなどを指定すると良いでしょう。DatabaseMirror db.jp.clamav.net DatabaseMirror database.clamav.net - clamdへの通知設定: データベース更新後に
clamdデーモンに通知し、新しい定義ファイルをリロードさせるための設定です。# clamdの設定ファイルを指定 NotifyClamd /etc/clamd.d/scan.conf
3.2. 初回データベース更新と自動更新の設定
設定が完了したら、手動でfreshclamを実行して、最新のウイルス定義データベースを取得します。
sudo freshclam 次に、freshclamをサービスとして起動し、自動的にデータベースを更新するように設定します。
# サービスの自動起動を有効化
sudo systemctl enable clamav-freshclam
# サービスを起動
sudo systemctl start clamav-freshclam
# サービスのステータスを確認
sudo systemctl status clamav-freshclam 4. ウイルススキャンデーモンの設定 (clamd)
リアルタイムスキャン機能clamonaccは、スキャン処理をclamdデーモンに依頼するため、まずclamdを正しく設定し、起動しておく必要があります。
4.1. clamd.conf (または scan.conf) の設定
clamdの設定ファイルは、ディストリビューションによって異なりますが、一般的に/etc/clamd.confまたは/etc/clamd.d/scan.confです。 ここでは、後者を例に説明します。
sudo vi /etc/clamd.d/scan.conf freshclam.confと同様に、まずExample行をコメントアウトしてください。 以下に、基本的な設定項目を示します。
| 設定項目 | 説明 | 設定例 |
|---|---|---|
LogFile | ログファイルのパスを指定します。clamdが書き込み可能なパーミッションが必要です。 | LogFile /var/log/clamd.scan |
LogTime | ログにタイムスタンプを記録します。 | LogTime yes |
LogSyslog | ログをSyslogにも出力するかどうかを設定します。 | LogSyslog yes |
LocalSocket | clamdが待ち受けるUNIXソケットファイルのパスを指定します。`clamonacc`や`clamdscan`はこのソケットを通じてclamdに接続します。 | LocalSocket /run/clamd.scan/clamd.sock |
User | clamdプロセスを実行するユーザーを指定します。リアルタイムスキャンでは様々なファイルをスキャンする必要があるため、rootを指定することが推奨される場合がありますが、セキュリティリスクも考慮してください。 | User root |
ScanOnAccess | ClamAV 0.101以前のバージョンでリアルタイムスキャンを有効にする設定です。新しいバージョンでは`clamonacc`を使用するため、この設定は不要ですが、互換性のために`yes`にしておくこともあります。 | ScanOnAccess yes |
4.2. clamd の起動と自動起動設定
設定が完了したら、clamdサービスを起動し、システムの起動時に自動的に開始されるように設定します。ウイルスデータベースの読み込みに時間がかかることがあります。
# サービスの自動起動を有効化
sudo systemctl enable clamd@scan
# サービスを起動
sudo systemctl start clamd@scan
# サービスのステータスを確認
sudo systemctl status clamd@scan 5. リアルタイムスキャンの設定 (clamonacc)
いよいよ、リアルタイムスキャンの設定です。`clamonacc`自体の設定ファイルはなく、clamdの設定ファイル(/etc/clamd.d/scan.confなど)に追記する形で設定を行います。
5.1. On-Access Scanning 関連の設定項目
/etc/clamd.d/scan.confに、以下のOnAccessで始まる項目を追記・編集します。
| 設定項目 | 説明 | 設定例と注意点 |
|---|---|---|
OnAccessIncludePath | リアルタイムスキャンの監視対象とするディレクトリを指定します。このオプションは複数記述できます。 | OnAccessIncludePath /homeOnAccessIncludePath /var/www注意: /(ルート)を指定するとシステム全体の負荷が高くなる可能性があります。 また、/varのように頻繁に更新されるディレクトリを指定すると、スキャンが頻発しメモリ消費が増大する可能性があります。 |
OnAccessExcludePath | 監視対象から除外するディレクトリを指定します。OnAccessIncludePathで広い範囲を指定した場合に、スキャンが不要なパスを除外するのに便利です。 | OnAccessExcludePath /var/lib/mysql |
OnAccessExcludeUname | 特定のユーザーが行うファイルアクセスをスキャン対象から除外します。clamdプロセス自身のユーザーを除外することで、不要なスキャンを防ぐことができます。 | OnAccessExcludeUname clamav |
OnAccessPrevention | yesに設定すると、ウイルスが検知されたファイルへのアクセスをブロックします。カーネルがCONFIG_FANOTIFY_ACCESS_PERMISSIONS=yでコンパイルされている必要があります。 | OnAccessPrevention yes注意: 誤検知(False Positive)が発生した場合、正常なファイルへのアクセスがブロックされるリスクがあります。運用初期は noにしてログを監視し、安定稼働を確認してからyesにすることをお勧めします。 |
OnAccessExtraScanning | yesに設定すると、ファイルの読み取りアクセス時だけでなく、作成や移動といったイベントでもスキャンが実行されるようになります。より強固な保護を提供します。 | OnAccessExtraScanning yes |
VirusEvent | ウイルスを検知した際に、特定のコマンドやスクリプトを実行します。通知やファイルの隔離などの自動処理を実装するのに非常に強力な機能です。 | VirusEvent /usr/local/bin/clamav_alert.sh |
OnAccessMaxFileSize | スキャン対象とするファイルの最大サイズを指定します。これより大きなファイルはスキャンされません。`0`は無制限を意味します。 | OnAccessMaxFileSize 50M |
5.2. ウイルス検知時のアクション (VirusEvent)
VirusEventは、リアルタイムスキャンの価値を大きく高める機能です。例えば、ウイルスを検知した際に管理者にメールで通知したり、検知されたファイルを安全なディレクトリに移動(隔離)したりする処理を自動化できます。
以下は、ウイルス検知時に環境変数を利用して情報をログに出力し、ファイルを隔離ディレクトリに移動するスクリプトの例です。
まず、隔離用のディレクトリを作成し、clamdが書き込めるようにパーミッションを設定します。
sudo mkdir /var/quarantine
sudo chown clamav:clamav /var/quarantine 次に、実行するスクリプトを作成します。
sudo vi /usr/local/bin/clamav_virusevent.sh スクリプトの内容例:
#!/bin/bash
# 環境変数から情報を取得
VIRUS_NAME="$CLAM_VIRUSEVENT_VIRUSNAME"
FILE_PATH="$CLAM_VIRUSEVENT_FILENAME"
LOG_FILE="/var/log/clamav_virusevent.log"
QUARANTINE_DIR="/var/quarantine"
# ログに出力
echo "$(date): Virus found! Name: ${VIRUS_NAME}, File: ${FILE_PATH}" >> ${LOG_FILE}
# ファイルを隔離ディレクトリに移動
mv "${FILE_PATH}" "${QUARANTINE_DIR}/"
# メールで通知 (mailコマンドが設定されている場合)
# SUBJECT="[ClamAV Alert] Virus Detected on $(hostname)"
# MESSAGE="A virus has been detected and quarantined.\n\nVirus Name: ${VIRUS_NAME}\nFile Path: ${FILE_PATH}\n"
# echo -e "${MESSAGE}" | mail -s "${SUBJECT}" admin@example.com
exit 0 作成したスクリプトに実行権限を与えます。
sudo chmod 755 /usr/local/bin/clamav_virusevent.sh そして、clamd.confにこのスクリプトを指定します。
VirusEvent /usr/local/bin/clamav_virusevent.sh 注意: `clamonacc`からのスキャン依頼の場合、`$CLAM_VIRUSEVENT_FILENAME`が`instream`のような形式になり、実際のファイル名が取得できない問題が報告されていました。 最新のバージョンでは挙動が異なる可能性がありますので、実際にテストして確認することが重要です。この問題のため、通知スクリプト側で工夫が必要になる場合があります。
5.3. clamonacc の起動と自動起動設定
すべての設定が完了したら、clamdサービスを再起動して設定を反映させます。
sudo systemctl restart clamd@scan 次に、clamonaccサービスを起動し、自動起動を有効にします。
# サービスの自動起動を有効化
sudo systemctl enable clamav-clamonacc
# サービスを起動
sudo systemctl start clamav-clamonacc
# サービスのステータスを確認
sudo systemctl status clamav-clamonacc ディストリビューションによっては、`clamav-clamonacc`のsystemdユニットファイルが提供されていない場合があります。その場合は、手動で作成する必要があります。
6. 動作確認
設定が完了したら、実際にウイルスを検知できるかテストを行います。テストには、EICAR(European Institute for Computer Antivirus Research)が提供しているテスト用のウイルスファイルを使用するのが安全で一般的です。
監視対象に指定したディレクトリ(例: /home/user/test)に、EICARテストファイルを作成します。
# テスト用のディレクトリを作成
mkdir -p /home/user/test
cd /home/user/test
# EICARテストファイルをダウンロード(または作成)
wget https://secure.eicar.org/eicar.com ファイルを作成(またはダウンロード)した瞬間に、リアルタイムスキャンが実行されます。以下のログファイルを確認して、ウイルスが検知されていることを確認します。
/var/log/clamd.scan: clamdのメインログ/var/log/messagesまたはjournalctl -f: システム全体のログ/var/log/clamonacc.log: `clamonacc`のコマンドラインオプションでログファイルを指定した場合/var/log/clamav_virusevent.log: `VirusEvent`で指定したスクリプトが出力するログ(自作した場合)
ログにEicar-Test-Signature FOUNDのようなメッセージが出力され、`VirusEvent`を設定していれば指定したアクション(ファイルの隔離や通知メールの送信など)が実行されていることを確認してください。
まとめ
本記事では、ClamAVのリアルタイムスキャン(On-Access Scanning)機能の設定方法について、`freshclam`によるデータベース更新、`clamd`デーモンの設定、そして`clamonacc`による監視設定までを詳細に解説しました。リアルタイムスキャンは、サーバーのセキュリティをプロアクティブに強化するための重要な手段です。
設定項目は多岐にわたりますが、特にOnAccessIncludePath、OnAccessPrevention、VirusEventは、スキャンの範囲、防御レベル、そして検知後の対応を決定づける重要な設定です。ご自身のシステムの要件に合わせて、これらの設定を適切にチューニングしてください。
設定後は必ずEICARテストファイルなどを用いて動作確認を行い、ログを監視して意図通りに機能していることを確認することが不可欠です。この記事が、よりセキュアなサーバー環境を構築するための一助となれば幸いです。