「LinuxはWindowsと違ってウイルスに感染しない」という話を聞いたことがある方もいるかもしれません。確かにLinuxが狙われる頻度はWindowsより低いのは事実ですが、「感染しない」は完全な誤解です。
Webサーバーとして外部に公開しているLinuxマシンには、攻撃者がファイルアップロード機能を悪用してWebシェルを仕込むことがあります。Sambaや共有ストレージ経由でWindowsクライアントのウイルスが混入することもあります。メールサーバーがマルウェア入り添付ファイルの中継点になるケースも日常的に発生しています。
この記事では、Linux向けオープンソースのウイルス対策ツール「ClamAV」のインストールから設定、定期スキャンの自動化、感染検知時のメール通知まで、現場で使えるレベルで解説します。コマンドライン操作に慣れていれば、1時間以内に一通りの設定が完了します。
ClamAVとは?Linuxのウイルス対策エンジンの概要
ClamAVは、オープンソースで公開されているウイルス対策エンジンです。もともとはメールサーバー用のフィルタリングツールとして開発され、現在はCisco Talosチームが開発・メンテナンスを引き継いでいます。企業のメールゲートウェイやファイルサーバー、Webサーバーの定期スキャンに広く使われており、セキュリティツールの中でも実績と信頼性の高い選択肢です。
主な特徴を整理しておきます。
・無料・オープンソース: ライセンス費用ゼロで本番環境に導入できます。商用製品と組み合わせて多層防御の一角を担うことも可能です。
・シグネチャ自動更新(freshclam): ウイルス定義ファイルをデーモン経由で自動更新します。Cisco Talosのデータベースは日々更新されています。
・CLIとデーモンの両対応: 手動の clamscan コマンドと、常駐型の clamd デーモン(clamdscan 経由)の両方に対応しています。大量ファイルのスキャンにはデーモンモードが大幅に高速です。
・多数のファイル形式に対応: 圧縮ファイル(ZIP・tar・gz・RAR等)、Office文書、PDFなど幅広い形式を解析できます。
・主要ディストリビューション対応: RHEL系(Rocky Linux・AlmaLinux・CentOS Stream)、Ubuntu、Debian、いずれも公式リポジトリやEPELから入手できます。
LinuxサーバーにClamAVが必要なシナリオ
ClamAVを導入すべきかどうかは、サーバーの用途で判断してください。特に以下のケースでは優先度が高くなります。
・Webサーバー(Apache/Nginx): ファイルアップロード機能があるサービスでは、攻撃者がWebシェルや悪意あるスクリプトを配置しようとします。ClamAVの定期スキャンで早期発見が可能です。
・ファイルサーバー(Samba/NFS): WindowsクライアントがLinux共有フォルダに感染ファイルをアップロードするリスクがあります。ClamAVがそのLinux側での中継を防ぎます。
・メールサーバー(Postfix/Sendmail): Amavis経由でClamAVと連携することで、添付ファイルをリアルタイムにスキャンし、マルウェア入りメールを配信前にブロックできます。
・コンテナホスト: コンテナのベースイメージやバインドマウントしたディレクトリにマルウェアが混入するケースがあります。ホスト側でのスキャンが有効です。
逆に、インターネット非公開のバッチサーバーやビルドサーバーであれば、導入の優先度は低く、他のセキュリティ対策に工数を使う判断も合理的です。
インストール手順
1. RHEL系(Rocky Linux・AlmaLinux)へのインストール
RHEL系ではClamAVはEPELリポジトリに収録されています。EPELが未設定の場合は先に有効化してください。
# EPELリポジトリを有効化(未設定の場合) dnf install -y epel-release # ClamAVをインストール(clamd: デーモン, clamav-update: freshclam) dnf install -y clamav clamd clamav-update # インストール後の確認 clamscan --version
2. Ubuntu/Debian系へのインストール
# Ubuntu/Debian系(APTリポジトリから入手可能) apt-get update apt-get install -y clamav clamav-daemon clamav-freshclam # インストール後の確認 clamscan --version
freshclamの設定とウイルス定義ファイルの更新
freshclamはウイルス定義ファイル(シグネチャDB)を自動更新するデーモンです。インストール直後は定義ファイルが存在しないため、まず手動で初回更新を行います。
# freshclamデーモンが起動中の場合は停止してから手動更新する # Ubuntu系 systemctl stop clamav-freshclam # RHEL系 systemctl stop clamav-freshclam 2>/dev/null || true # 手動で定義ファイルを初回更新(ネットワーク状況次第で1~3分) freshclam # 更新成功後、デーモンを起動・自動起動設定 systemctl start clamav-freshclam systemctl enable clamav-freshclam # 動作確認 systemctl status clamav-freshclam
freshclamの更新頻度はデフォルトで1日12回(2時間ごと)です。設定ファイル(/etc/freshclam.conf または /etc/clamav/freshclam.conf)の Checks ディレクティブで変更できますが、Cisco Talosのサーバー負荷軽減のため過剰な頻度は避けてください。
clamdデーモンの設定
大量ファイルのスキャンや定期スキャンにはclamdデーモンを使うことを推奨します。clamscanはコマンドを実行するたびにエンジンをメモリにロードするため時間がかかりますが、clamdは常駐しているためclamdscan経由で呼び出すと大幅に速くなります。
設定ファイルのデフォルト値から変更すべき箇所を以下に示します。
# 設定ファイルの場所 # RHEL系: /etc/clamd.d/scan.conf # Ubuntu系: /etc/clamav/clamd.conf # --- 変更が必要な箇所(コメントを外すか値を変更) --- # Unixドメインソケットを有効化(デフォルト: コメントアウト) LocalSocket /run/clamd.scan/clamd.sock # ログファイルを指定(デフォルト: コメントアウト) LogFile /var/log/clamd.scan # スキャン日時をログに記録(デフォルト: no) LogTime yes # 感染検知をログに記録(デフォルト: no) LogScanResult yes # 圧縮ファイルの最大再帰深度(デフォルト: 17 → 負荷軽減で10推奨) MaxDirectoryRecursion 10 # 最大ファイルサイズ(デフォルト: 25M → Webサーバーなら100M程度に調整) MaxFileSize 100M
# clamdの起動・自動起動設定 # RHEL系(サービス名がclamd@scanの場合) systemctl start clamd@scan systemctl enable clamd@scan # Ubuntu系 systemctl start clamav-daemon systemctl enable clamav-daemon # 起動確認 systemctl status clamd@scan # または clamav-daemon
手動スキャンの実行方法
基本的な手動スキャンは clamscan または clamdscan(デーモン経由)で実行します。
# /var/www を再帰的にスキャン(全ファイルを表示) clamscan -r /var/www # 感染ファイルのみ表示(クリーンファイルは非表示) clamscan -r --infected /var/www # 感染ファイルを隔離ディレクトリに移動(本番環境では削除より移動を推奨) clamscan -r --infected --move=/var/quarantine /var/www # 結果をログファイルに出力 clamscan -r --infected --log=/var/log/clamav/manual-scan.log /var/www # clamdデーモン経由で高速スキャン(デーモン起動済みの場合) clamdscan -r /var/www
スキャン終了時の終了コードは次の意味を持ちます。
・終了コード 0: 感染ファイルなし(クリーン)
・終了コード 1: 感染ファイルが検知された
・終了コード 2: スキャン中にエラーが発生した
自動スキャンのスクリプトでは、この終了コードを使って「感染検知時のみメール通知」を実装できます。
自動スキャンの設定(cronによる定期実行)
1. スキャンスクリプトの作成
毎日深夜に指定ディレクトリをスキャンし、感染ファイルが見つかった場合のみ管理者にメール通知するスクリプトを作成します。本番環境ではファイルの即時削除より、隔離ディレクトリへの移動を推奨します。誤検知で重要なファイルが消えるリスクを防ぐためです。
cat > /usr/local/bin/clamav-daily-scan.sh << 'SCRIPT' #!/bin/bash set -euo pipefail SCAN_DIR="/var/www" LOG_DIR="/var/log/clamav" LOG_FILE="${LOG_DIR}/daily-scan-$(date +%Y%m%d).log" QUARANTINE_DIR="/var/quarantine" ADMIN_MAIL="admin@example.com" # 実際の管理者メールに変更する mkdir -p "$LOG_DIR" "$QUARANTINE_DIR" echo "=== ClamAV Scan Start: $(date) ===" >> "$LOG_FILE" echo "Scan target: $SCAN_DIR" >> "$LOG_FILE" # clamdデーモンが起動中なら clamdscan(高速)、なければ clamscan if systemctl is-active --quiet clamd@scan 2>/dev/null || \ systemctl is-active --quiet clamav-daemon 2>/dev/null; then clamdscan -r --infected --move="$QUARANTINE_DIR" \ --fdpass "$SCAN_DIR" >> "$LOG_FILE" 2>&1 || true RESULT=$? else clamscan -r --infected --move="$QUARANTINE_DIR" \ --log="$LOG_FILE" "$SCAN_DIR" || true RESULT=$? fi echo "=== ClamAV Scan End: $(date), Exit: $RESULT ===" >> "$LOG_FILE" # 感染検知(終了コード1)の場合のみメール通知 if [ "$RESULT" -eq 1 ]; then { echo "ホスト: $(hostname)" echo "スキャン対象: $SCAN_DIR" echo "検知日時: $(date)" echo "" echo "--- スキャンログ ---" grep -E "FOUND|Infected" "$LOG_FILE" || true echo "" echo "隔離ディレクトリ: $QUARANTINE_DIR" echo "詳細ログ: $LOG_FILE" } | mail -s "[ClamAV警告] $(hostname): マルウェア検知 $(date +%Y/%m/%d)" \ "$ADMIN_MAIL" fi # 30日以上前のログを削除 find "$LOG_DIR" -name "daily-scan-*.log" -mtime +30 -delete exit "$RESULT" SCRIPT chmod +x /usr/local/bin/clamav-daily-scan.sh
2. cronへの登録
# /etc/cron.d/clamav-daily として作成 cat > /etc/cron.d/clamav-daily << 'EOF' # ClamAV daily scan: 毎日02:30に実行 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 30 2 * * * root /usr/local/bin/clamav-daily-scan.sh EOF # 構文確認 crontab -l -u root | grep clamav
スキャン対象が複数ディレクトリにまたがる場合は、スクリプトの SCAN_DIR を配列に変更し、ループ処理に拡張できます。サーバーの負荷が心配な場合は nice -n 19 ionice -c 3 clamscan ... で優先度を下げると、本番サービスへの影響を最小化できます。
既存ファイルの整合性と誤検知への対処
1. 隔離ファイルの確認と復元
隔離ディレクトリ(/var/quarantine)に移動されたファイルは、すぐに削除せず内容を確認してください。ClamAVの誤検知はPHPフレームワークのソースコードや圧縮アーカイブで発生することがあります。
# 隔離ファイルの一覧確認 ls -lh /var/quarantine/ # 特定ファイルを単独で再スキャン(誤検知確認) clamdscan /var/quarantine/疑わしいファイル名 # 誤検知と判断した場合は元の場所に復元 mv /var/quarantine/疑わしいファイル名 /var/www/html/ # ファイルをClamAVの誤検知報告ページに送信(繰り返し誤検知の場合) # https://www.clamav.net/reports/fp
2. ホワイトリストの設定
特定のファイルやディレクトリを常に除外したい場合は、設定ファイルに ExcludePath を追加します。
# /etc/clamd.d/scan.conf(またはclamd.conf)に追記 # 特定ディレクトリをスキャン除外(正規表現) ExcludePath ^/var/www/html/vendor/ ExcludePath ^/tmp/ # clamdを再起動して設定を反映 systemctl restart clamd@scan # または clamav-daemon
中小企業でも今日からできること
専任のセキュリティ担当者がいない環境でも、以下の優先順位で構成を整えていくと効果的です。
| 優先度 | 対策 | 工数の目安 |
|---|---|---|
| 高 | ClamAVインストールとfreshclam自動更新の有効化 | 30分以内 |
| 高 | Webサーバー(/var/www)の週1回以上の定期スキャン | cronスクリプト設定で1時間 |
| 中 | 感染検知時のメール通知設定 | スクリプト修正で30分 |
| 中 | 隔離ディレクトリの設定(自動削除は使わない) | 即日 |
| 中 | スキャンログの月1回目視確認 | ランニングコスト15分/月 |
| 低 | clamdデーモン設定による高速化(常時スキャンが必要な環境) | 1時間 |
Webサーバーを公開している場合は「インストール → freshclam有効化 → 週次スキャンのcron登録 → メール通知」の4ステップを最優先で完了させてください。これだけで既知マルウェアの大半を定期的に検知できる体制が整います。
よくある誤解と注意点
【注意1】ClamAVはリアルタイム保護ではない(標準設定の場合)
標準設定のClamAVは「定期スキャン型」です。Windowsのセキュリティソフトのように「ファイルへのアクセス時に即座にブロックする」リアルタイム保護ではありません。リアルタイムのオンアクセス保護が必要な場合は clamonacc(On-Access Scanning)を設定できますが、カーネルモジュールへの依存が増えるため設定難易度が上がります。まずは定期スキャンで運用を開始し、リスクが高いと判断した環境にのみオンアクセスを追加するアプローチが現実的です。
【注意2】シグネチャベースの限界を理解する
ClamAVはシグネチャベースの検知エンジンです。既知のマルウェアには高い検知率を発揮しますが、ゼロデイ(未知の)マルウェアや、特定の環境向けにカスタム作成されたWebシェルは検知できない場合があります。ClamAVは「低コストで既知の脅威を継続的に検知する手段」として位置づけ、ファイアウォール・ログ監視・IDS/IPSと組み合わせた多層防御の一部として活用してください。
【注意3】定義ファイルの更新が止まるとスキャンの意味が薄れる
freshclamデーモンが何らかの原因で停止すると、ウイルス定義ファイルが古くなり、新しいマルウェアを検知できなくなります。定期スキャンのスクリプトに定義ファイルの最終更新日チェックを追加しておくと、停止に気づかないリスクを減らせます。
# 定義ファイルの更新日確認(スクリプトや手動確認に組み込み可能) stat /var/lib/clamav/main.cvd 2>/dev/null || stat /var/lib/clamav/main.cld # Ubuntu系の場合 stat /var/lib/clamav/daily.cvd 2>/dev/null || stat /var/lib/clamav/daily.cld # freshclamデーモンの状態確認 systemctl is-active clamav-freshclam && echo "OK" || echo "STOPPED - 要確認"
Linuxのログ監視や侵入痕跡の検知については、「Linuxログ監視入門|syslog・journald・auditdで証跡を残す」もあわせて参照してください。ClamAVが検知できないパターンの攻撃を、ログ解析で補完できます。
Linuxのファイルパーミッションや権限管理の詳細については、姉妹サイトLinuxMaster.JPでも体系的に解説しています。
本記事のまとめ
| 項目 | ポイント |
|---|---|
| インストール | RHEL系はEPEL必須。freshclamのsystemctl enableまで完了させる |
| 手動スキャン | clamscan(単発)またはclamdscan(デーモン経由で高速)。終了コードで感染有無を判定 |
| 自動スキャン | cronスクリプトで深夜定期実行。感染検知時のみメール通知で対応コストを最小化 |
| 感染時の対応 | –removeより–moveで隔離。誤検知を確認してから削除する運用を徹底する |
| 限界と補完 | シグネチャベースのため未知マルウェアは検知不可。ログ監視・IDS/IPSと組み合わせる |
ClamAVは「無料で設定が比較的容易、ただし万能ではない」ツールです。Webサーバーやファイルサーバーを運用しているLinux環境で、まだウイルス対策を入れていないなら、追加コストなしで導入できるこのツールを使わない理由はありません。まずはインストールとfreshclam有効化、週次スキャンのcron登録という最小構成から始めてみてください。
Linuxサーバーのセキュリティ対策、どこから始めていいかわかりますか?
ClamAVの設定はできても、「他に何を対策すればいいか」の全体像が見えていない方は多いです。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
