◆はじめに
前回の「セキュリティ強化編」として「RKHunterによるrootkit検知」に引き続き、Rocky Linux 9 サーバ構築手順次のステップは、「ClamAVアンチウィルスソフト」について設定を行います。

◆環境情報
当ブログサイトを運用しているサーバは、「KAGOYA JAPAN」で提供されている「KAGOYA CLOUD VPS」を利用しています。
◆セキュリティ強化
・ClamAVアンチウィルスソフト
ClamAV(Clam AntiVirus)は、Unix系システム向けのオープンソースアンチウィルスソフトウェアです。メール通信、ウェブトラフィック、ファイル、その他の受信データのウィルススキャンを行い、システムのセキュリティを強化します。
公式ドキュメント:
https://docs.clamav.net/
ClamAVは以下の機能を提供します。
- リアルタイムファイルスキャン
- メールスキャン機能
- ウィルス定義ファイルの自動更新
- コマンドラインでのマニュアルスキャン
- 検出されたウィルスの隔離機能
インストール
ClamAVパッケージのインストール
EPELリポジトリからClamAV関連のパッケージをインストールします。
# dnf install -y clamav clamd clamav-update
'~ 中略 ~'
Installed:
clamav-1.0.7-1.el9.x86_64 clamav-filesystem-1.0.7-1.el9.noarch
clamav-freshclam-1.0.7-1.el9.x86_64 clamav-lib-1.0.7-1.el9.x86_64
clamd-1.0.7-1.el9.x86_64
Complete!
パッケージ内容の説明:
- clamd : Clam AntiVirus デーモンプロセス
- clamav : Clam AntiVirus スキャナ用のエンドユーザ ツール
- clamav-freshclam : ウイルスデータベース更新ユーティリティ
- clamav-lib : Clam AntiVirus スキャナ用の動的ライブラリ
- clamav-update : Clam AntiVirus スキャナデータファイルの自動更新機能
基本設定
freshclam設定ファイルの変更
ウィルス定義ファイル更新ツール(freshclam)の設定を行います。
# vi /etc/freshclam.conf
'~ 中略 ~'
# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
NotifyClamd /etc/clamd.d/scan.conf
7行目:clamdにウィルス定義ファイル更新通知を設定
ウィルス定義ファイルの初回更新
ClamAVの初回セットアップとして、ウィルス定義ファイルを更新します。
# freshclam
ClamAV update process started at Sat Sep 14 23:38:34 2024
daily database available for download (remote version: 27398)
Time: 7.1s, ETA: 0.0s [========================>] 61.16MiB/61.16MiB
Testing database: '/var/lib/clamav/tmp.75d03b1744/clamav-6b32b947d6b67b301f239d26af9c05d8.tmp-daily.cvd' ...
Database test passed.
daily.cvd updated (version: 27397, sigs: 2066804, f-level: 90, builder: raynman)
Received an older daily CVD than was advertised. We'll retry so the incremental update will ensure we're up-to-date.
daily database available for update (local version: 27397, remote version: 27398)
Current database is 1 version behind.
Downloading database patch # 27398...
Time: 0.1s, ETA: 0.0s [========================>] 4.16KiB/4.16KiB
Testing database: '/var/lib/clamav/tmp.75d03b1744/clamav-39dd527781223ec111c99dc73ea3259e.tmp-daily.cld' ...
Database test passed.
daily.cld updated (version: 27398, sigs: 2066825, f-level: 90, builder: raynman)
main database available for download (remote version: 62)
Time: 18.7s, ETA: 0.0s [========================>] 162.58MiB/162.58MiB
Testing database: '/var/lib/clamav/tmp.75d03b1744/clamav-48fb5076129e25097008e7184e7d1f82.tmp-main.cvd' ...
Database test passed.
main.cvd updated (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
bytecode database available for download (remote version: 335)
Time: 0.2s, ETA: 0.0s [========================>] 282.94KiB/282.94KiB
Testing database: '/var/lib/clamav/tmp.75d03b1744/clamav-aae30db020f12af93b14accc3876e79c.tmp-bytecode.cvd' ...
Database test passed.
bytecode.cvd updated (version: 335, sigs: 86, f-level: 90, builder: raynman)
ERROR: NotifyClamd: No communication socket specified in /etc/clamd.d/scan.conf
ERROR: Can't send to clamd: Socket operation on non-socket
初回実行時にはエラーが表示されますが、これは後述のscan.conf設定で解決されます。
clamdデーモン設定ファイルの変更
ClamAVデーモンの詳細設定を行います。
# vi /etc/clamd.d/scan.conf
'~ 抜粋 ~'
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogVerbose yes
LogRotate yes
ExtendedDetectionInfo yes
LocalSocket /run/clamd.scan/clamd.sock
MaxDirectoryRecursion 20
ExcludePath ^/tmp/clamscan_quarantine_.*/
ExcludePath ^/proc/
ExcludePath ^/sys/
設定項目の説明:
- LogFile : ログファイルの出力先
- LogFileMaxSize : ログファイルの最大サイズ(2MB)
- LogTime : タイムスタンプをログに含める
- LogSyslog : システムログ(syslog)への出力の有効化
- LogVerbose : 詳細なログ出力の有効化(デバッグ時に有効)
- LogRotate : ログローテーションの有効化
- ExtendedDetectionInfo : 拡張検出情報(検出されたマルウェアに関する追加情報(ファイルサイズ、ハッシュなど)が記録)の有効化
- ExcludePath : 除外ディレクトリ設定
ログディレクトリの作成
ClamAVのログファイル出力先ディレクトリを作成します。
# mkdir -p /var/log/clamav
サービスの起動と自動起動設定
clamdサービスの設定
# systemctl start clamd@scan
# systemctl enable clamd@scan
Created symlink /etc/systemd/system/multi-user.target.wants/clamd@scan.service → /usr/lib/systemd/system/clamd@.service.
1行目:clamdサービス起動
2行目:clamd自動起動設定
clamav-freshclamサービスの設定
# systemctl start clamav-freshclam
#systemctl enable clamav-freshclam
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /usr/lib/systemd/system/clamav-freshclam.service.
1行目:clamav-freshclamサービス起動
2行目:clamav-freshclam自動起動設定
動作確認
テストスキャン(ウィルスなしの場合)
正常なシステムでのスキャンテストを実行します。
# clamscan --infected --remove --recursive /home
----------- SCAN SUMMARY -----------
Known viruses: 8698624
Engine version: 1.0.7
Scanned directories: 5
Scanned files: 12
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 28.553 sec (0 m 28 s)
Start Date: 2024:09:15 00:23:27
End Date: 2024:09:15 00:23:56
テストウィルスファイルでの動作確認
EICARテストファイルをダウンロードして、ウィルス検出機能をテストします。
# wget https://files.trendmicro.com/products/eicar-file/eicar.com
テストスキャン(ウィルス検出の場合)
ダウンロードしたテストファイルをスキャンします。
# clamscan --infected --remove --recursive .
/root/eicar.com: Win.Test.EICAR_HDB-1 FOUND
/root/eicar.com: Removed.
----------- SCAN SUMMARY -----------
Known viruses: 8698624
Engine version: 1.0.7
Scanned directories: 2
Scanned files: 12
Infected files: 1
Data scanned: 0.01 MB
Data read: 0.00 MB (ratio 2.00:1)
Time: 29.115 sec (0 m 29 s)
Start Date: 2024:09:15 00:47:21
End Date: 2024:09:15 00:47:51
この結果により、ClamAVがウィルスファイルを正常に検出し、削除したことが確認できます。
自動スキャンの設定
定期自動実行スクリプトの作成
毎日自動的にシステム全体をスキャンするスクリプトを作成します。
# vi /etc/cron.daily/clamav_scan
#!/bin/bash
# Set variables
DATE=$(date +%Y%m%d)
QUARANTINE_DIR="/tmp/clamscan_quarantine_$DATE"
CONF_FILE="/etc/clamd.d/scan.conf"
TEMP_LOG="/tmp/clamav_scan_$DATE.log"
VIRUS_FOUND_STRING="FOUND"
LOG_TAG="$(basename $0)"
# Check if configuration file exists
if [ ! -f "$CONF_FILE" ]; then
logger -t "$LOG_TAG" "Error: Configuration file $CONF_FILE not found. Scan aborted."
exit 1
fi
# Create quarantine directory
mkdir -p "$QUARANTINE_DIR"
# Run ClamAV scan using clamdscan and output to temporary log file
clamdscan --config-file="$CONF_FILE" --move="$QUARANTINE_DIR" / > "$TEMP_LOG" 2>&1
# Send the entire log content to syslog
cat "$TEMP_LOG" | logger -t "$LOG_TAG"
# Check if any viruses were found by searching for VIRUS_FOUND_STRING in the log
if grep -q "$VIRUS_FOUND_STRING" "$TEMP_LOG"; then
# Viruses were found, send email to root
echo "Viruses detected. Please check syslog for details." | mail -s "ClamAV Scan Alert" root
logger -t "$LOG_TAG" "Viruses detected. Quarantined files can be found in $QUARANTINE_DIR."
else
# No viruses found, remove quarantine directory
rm -rf "$QUARANTINE_DIR"
logger -t "$LOG_TAG" "No viruses detected in scan."
fi
# Remove the temporary log file
rm -f "$TEMP_LOG"
スクリプトの実行権限設定と設定ファイル更新
# chmod +x /etc/cron.daily/clamav_scan
# echo "ExcludePath ^/tmp/clamscan_quarantine_.*/" >> /etc/clamd.d/scan.conf
# systemctl restart clamd@scan
スクリプトの主な機能:
- 日付ベースの隔離ディレクトリ作成 : 検出されたファイルを日付別のディレクトリに隔離
- 設定ファイル確認 : 設定ファイルの存在確認で安全な実行を保証
- システム全体スキャン : clamdscanでシステム全体をスキャン
- syslogへのログ出力 : スキャン結果をシステムログに記録
- メール通知 : ウィルス検出時にroot宛にメール送信
- 自動クリーンアップ : ウィルス未検出時の隔離ディレクトリ削除
- 一時ファイルの削除 : 実行後の一時ログファイルクリーンアップ
ログの確認
ログファイルの場所
ClamAVの各種ログは以下の場所に保存されます。
# clamdデーモンログ
/var/log/clamav/clamd.log
# freshclamログ
/var/log/clamav/freshclam.log
# 自動スキャンログ(syslog)
/var/log/messages
ログの確認方法
# clamdログの確認
tail -50 /var/log/clamav/clamd.log
# freshclamログの確認
tail -50 /var/log/clamav/freshclam.log
# 自動スキャンログの確認
grep clamav_scan /var/log/messages
# ウィルス検出ログの抽出
grep -i "FOUND\|infected" /var/log/clamav/clamd.log
grep -i "virus" /var/log/messages
・補足
ウィルス定義ファイル更新設定
freshclamサービスは自動的に定義ファイルを更新しますが、設定を確認できます。
# vi /etc/freshclam.conf
主要な設定項目:
# 更新チェック回数(1日24回 = 1時間間隔)
Checks 24
# データベースミラーサーバー設定
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net
隔離ディレクトリの管理
自動スキャンで検出されたファイルは隔離ディレクトリに移動されます。
# 隔離ファイルの確認
ls -la /tmp/clamscan_quarantine_*
# 古い隔離ディレクトリの削除(30日以上)
find /tmp -name "clamscan_quarantine_*" -type d -mtime +30 -exec rm -rf {} \;
パフォーマンス調整
大容量ファイルやディスクI/Oが気になる場合の調整。
# vi /etc/clamd.d/scan.conf
# 最大ファイルサイズ(デフォルト25MB)
MaxFileSize 50M
# 最大スキャン時間(秒)
MaxScanTime 300
# 同時スキャンスレッド数
MaxThreads 10
メンテナンス
定期メンテナンス
月1回程度、以下のメンテナンスを実行することを推奨します。
# ウィルス定義ファイル手動更新
# freshclam
# サービス状態確認
# systemctl status clamd@scan
# systemctl status clamav-freshclam
# ログファイルサイズ確認
# du -sh /var/log/clamav/*
# 手動フルスキャン実行
# clamscan --recursive --infected --bell /
設定ファイルのバックアップ
重要な設定ファイルのバックアップを作成しておきます。
# ClamAV設定ファイル
# cp /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.backup
# freshclam設定ファイル
# cp /etc/freshclam.conf /etc/freshclam.conf.backup
# 自動スキャンスクリプト
# cp /etc/cron.daily/clamav_scan /etc/cron.daily/clamav_scan.backup
トラブルシューティング
よくある問題と対処法
ウィルス定義ファイル更新エラー
# freshclamログ確認
# tail -20 /var/log/clamav/freshclam.log
# 手動更新実行
# freshclam --verbose
# ネットワーク接続確認
# ping database.clamav.net
clamdサービス起動失敗
# サービス状態詳細確認
# systemctl status clamd@scan -l
# 設定ファイル構文チェック
# clamd -c /etc/clamd.d/scan.conf --config-check
# ソケットファイル確認
# ls -la /run/clamd.scan/
メモリ不足エラー
# メモリ使用量確認
# free -m
# ClamAV設定でメモリ制限調整
# vi /etc/clamd.d/scan.conf
# メモリ使用制限(MB)
DatabaseDirectory /var/lib/clamav
LocalSocket /run/clamd.scan/clamd.sock
TCPSocket 3310
TCPAddr 127.0.0.1
偽陽性への対処
正常なファイルがウィルスとして検出される場合。
# vi /etc/clamd.d/scan.conf
# 特定ファイルを除外
ExcludePath ^/path/to/safe/file$
# 特定拡張子を除外
ExcludePath \.safe$
# 特定ディレクトリを除外
ExcludePath ^/safe/directory/
◆まとめ
ClamAVはLinuxシステムにおいて重要なセキュリティ機能を提供します。
定期的なウィルススキャンとリアルタイム監視により、マルウェアや不正なファイルからシステムを保護できます。
適切な設定と定期メンテナンスにより、システムのセキュリティレベルを大幅に向上させることができます。
ただし、システムリソースへの影響を考慮し、スキャンスケジュールや対象範囲を適切に設定することが重要です。
セキュリティツールは複数組み合わせて使用することで効果が高まるため、ClamAVと併せてRKHunter、Tripwire、Fail2banなどの他のセキュリティ対策も実装することを推奨します。
◆次のステップ
「セキュリティ強化編」は、今回までで、次回は以下の手順を実施します。
これらの手順により、安全で管理しやすいLinuxサーバ環境を構築できます。