なぜ Linux でもウイルススキャンが必要なのか?
多くの管理者は、Linux はマルウェアとは無縁だと信じがちです。しかし実際には、SSH 情報の流出後に XMRig マイニングスクリプトやランサムウェアに感染したサーバーを、私は何度も目にしてきました。古い WordPress プラグイン一つで、ハッカーはあなたのサーバーをスパム配信拠点に変えてしまいます。このような状況において、ClamAV はシステムをクリーンアップするための最も強力なオープンソースツールです。
ClamAV は単なるシステムファイルの走査にとどまりません。Nextcloud のようなファイルサーバーやメールサーバーを運用している場合に非常に効果的です。現在、ClamAV のデータベースは 850 万件を超えるマルウェア定義を保持しています。この記事では、CentOS Stream 9 に ClamAV を実戦レベルで導入する手順を解説します。
覚えておくべき 3 つのコアコンポーネント
設定時に混乱しないよう、以下の 3 つの概念を明確に区別しておきましょう。
- clamscan: 手動スキャンツール。実行のたびにウイルスデータベース全体を RAM にロードするため、かなり時間がかかります。
- freshclam: Cisco のサーバーから最新のウイルス定義を自動的に更新するサービス。
- clamd (Daemon): バックグラウンドで動作するサービス。ウイルスデータベースを RAM 上に保持して即座にスキャンを行うため、大量のファイルをスキャンする際の CPU 負荷を抑えられます。
サーバーの RAM に余裕がある(2GB 以上)場合は、最高のパフォーマンスを得るために clamd の使用をお勧めします。
詳細なインストール手順
ステップ 1: EPEL リポジトリの有効化
ClamAV は CentOS Stream 9 のデフォルトリポジトリには含まれていません。開始する前に EPEL (Extra Packages for Enterprise Linux) をインストールする必要があります。
sudo dnf install epel-release -y
sudo dnf update -y
ステップ 2: ClamAV パッケージのインストール
スキャンエンジン、デーモンサービス、およびデータ更新ツールを同時にインストールします。
sudo dnf install clamav clamd clamav-update -y
ステップ 3: SELinux の設定(重要)
これは、root 権限を使用していても ClamAV が Permission Denied エラーを出す主な原因です。CentOS Stream 9 はアクセス制御が非常に厳格です。以下の 2 つのコマンドを実行して、スキャナーに権限を付与してください。
sudo setsebool -P antivirus_can_scan_system 1
sudo setsebool -P clamd_use_jit 1
設定内容は次のコマンドで確認できます: getsebool -a | grep antivirus
ステップ 4: 初回のウイルスデータベース更新
スキャンを開始する前に、システムに最新のデータが必要です。/etc/freshclam.conf にあるデフォルトの設定ファイルは、通常そのまま使用できます。
以下のコマンドで更新を実行します:
sudo freshclam
もし 403 エラーが発生した場合は、IP がレート制限にかかっている可能性があります。15 分ほど待ってから再試行してください。
ステップ 5: Clam デーモン (clamd) の設定
clamd を動作させるには、/etc/clamd.d/scan.conf ファイルを編集する必要があります。vi や nano でファイルを開き、以下の 2 箇所を変更してください。
LocalSocket /run/clamd.scan/clamd.sockの行の#を削除してコメントを解除します。Exampleという行がコメントアウトされている(先頭に#がある)ことを確認します。
サービスを有効化し、システム起動時に自動実行されるようにします:
sudo systemctl enable clamd@scan --now
実戦的なマルウェアスキャン手法
Web ディレクトリでの clamscan の使用
例えば、/var/www/html ディレクトリにマルウェアが潜んでいる疑いがあるとします。以下のコマンドを使用して詳細にスキャンし、問題のあるファイルのみを表示させます。
clamscan -r -i /var/www/html
パラメータの説明:
-r: サブディレクトリを再帰的にスキャンします。-i: 感染したファイル (Infected) のリストのみを出力するため、確認が容易になります。
Cronjob による自動化
手動でのスキャンは非常に時間がかかります。私は通常、毎日午前 2 時にスキャンを実行するようにスクリプトを設定しています。/etc/cron.daily/clamav_scan ファイルを以下の内容で作成します。
#!/bin/bash
SCAN_DIR="/home /var/www/html"
LOG_FILE="/var/log/clamav/daily_scan.log"
/usr/bin/clamscan -r -i $SCAN_DIR > $LOG_FILE
実行権限を付与するのを忘れないでください: chmod +x /etc/cron.daily/clamav_scan
パフォーマンスと RAM に関する注意点
ClamAV は「RAM 喰い」として有名です。データベースをロードすると、clamd サービスは 1.2GB から 1.5GB の RAM を占有することがあります。サーバーの RAM が 2GB しかない場合、OOM (Out Of Memory) によってシステムがフリーズする可能性が高くなります。
低スペックサーバーにおける私の経験則は以下の通りです:
clamdを常駐させず、必要な時だけclamscanを使用する。- 仮想メモリを補助するために、最低 2GB のスワップファイルを作成しておく。
- ルートディレクトリ
/全体ではなく、重要なディレクトリのみをスキャンする。
また、CentOS Stream 9 ではサービス名が clamd@scan です。CentOS 7 向けの古いガイドからスクリプトをコピーする場合は、この名前を更新するのを忘れないでください。
まとめ
ClamAV は Linux サーバーにとって非常に信頼性の高い保護レイヤーです。巧妙な攻撃を 100% 防げるわけではありませんが、依然として最も効果的なマルウェアフィルタリングツールの一つです。ClamAV を強力なファイアウォールと組み合わせて、システムの安全を維持しましょう。
