clamAV リアルタイムスキャンを有効化してウィルスを検出&隔離&通知(clamAV 1.0.8)
ClamAVとは
ClamAVは、Linux環境で利用できるオープンソースのアンチウイルスソフトウェアです。 手動スキャンや定期スキャンのほかに、リアルタイムスキャン機能(clamAVでは正式にはオンタイムスキャンと呼ばれる)を有効にすることで、ファイルダウンロード時に自動的にマルウェアを検出・隔離できるようになります。
この記事では、ClamAV 1.0.8を対象にリアルタイムスキャン(clamonacc)を有効にして、検出・隔離・通知を行う手順を解説します。
環境
ClamAV 1.0.8 RHEL9.5
前提条件
clamAVがインストール済み
設定手順
1. ウイルス検出時の通知スクリプトの作成
ウイルスが検出された際に実行される通知スクリプトを作成します。 /usr/local/bin/clamav_alert.shとします。
vi /usr/local/bin/clamav_alert.sh
上記コマンドでファイルを開き、通知用のスクリプトを記述します。 (ここではAWS SNSを用いて通知を行います。)
# SNSトピックのARN
SNS_TOPIC_ARN="【SNSトピックのARN】"
# $CLAM_VIRUSEVENT_VIRUSNAME 検知したウイルス名
# $CLAM_VIRUSEVENT_FILENAME 検知したファイル名
SUBJECT="ClamAV ウイルスアラート: ${CLAM_VIRUSEVENT_VIRUSNAME} - ${CLAM_VIRUSEVENT_FILENAME}"
# HTML形式のメッセージを定義
HTML_MESSAGE="サーバからウイルスが検出されました。<br><br>"
HTML_MESSAGE+="ウイルス名: ${CLAM_VIRUSEVENT_VIRUSNAME}<br>"
HTML_MESSAGE+="検出ファイルパス: ${CLAM_VIRUSEVENT_FILENAME}<br>"
HTML_MESSAGE+="<b>ログを確認し、対応を検討してください。</br>"
# AWS CLIを使用してSNSにメッセージを公開
aws sns publish \
--topic-arn "${SNS_TOPIC_ARN}" \
--subject "${SUBJECT}" \
--message-structure json \
--message "{ \
\"default\": \"サーバからウイルスが検出されました。\\n\\nウイルス名: ${CLAM_VIRUSEVENT_VIRUSNAME}\\n検出ファイルパス: ${CLAM_VIRUSEVENT_FILENAME}\\nログを確認し、対応を検討してください。\", \
\"html\": \"${HTML_MESSAGE}\" \
}"
# ログ出力先
if [ $? -eq 0 ]; then
echo "$(date): SNS通知が ${CLAM_VIRUSEVENT_FILENAME} (${CLAM_VIRUSEVENT_VIRUSNAME}) に対して正常に送信されました。" >> /var/log/clamav/clamav_sns_alert.log
else
echo "$(date): ${CLAM_VIRUSEVENT_FILENAME} のSNS通知の送信に失敗しました。" >&2 >> /var/log/clamav/clamav_sns_alert.log
fi
スクリプトを保存したら、実行権限を付与し、文法チェックを行います。
chmod 700 /usr/local/bin/clamav_alert.sh
/bin/bash -n /usr/local/bin/clamav_alert.sh
(何も表示されなければOK)
2. 隔離用フォルダの作成
ウイルスが検出されたファイルを隔離するためのフォルダを作成します。 /var/quarantineを作成し、ClamAVが書き込みできるようパーミッションを設定します。
mkdir /var/quarantine
chmod go+w /var/quarantine
ls -l /varコマンドで、/var/quarantineが作成され、適切なパーミッションが付与されていることを確認します。
ls -l /var
3. clamd の設定変更
ClamAVのデーモン設定ファイルである/etc/clamd.d/scan.confを編集し、リアルタイムスキャンに関連する設定を追加します。
vi /etc/clamd.d/scan.conf
以下の行を追記します。
VirusEvent /usr/local/bin/clamav_alert.sh
OnAccessIncludePath /var/www
OnAccessIncludePath /home
OnAccessExtraScanning yes
OnAccessExcludeRootUID yes
それぞれの内容は以下です。 VirusEvent /usr/local/bin/clamav_alert.sh: ウイルスが検出された際に実行するスクリプトを指定します。
OnAccessIncludePath : リアルタイムスキャンの対象パスを設定します。
OnAccessExtraScanning yes: ファイル移動時にもスキャンを有効にします。
OnAccessExcludeRootUID yes: rootユーザーによって作成されたファイルはリアルタイムスキャンから除外します。
設定を保存したら、clamdサービスを再起動して設定を反映させます。
systemctl restart clamd@scan
4. 監視対象ファイル上限の引き上げ
リアルタイムスキャンでは、Linuxカーネルのinotify機能を利用してファイルの変更を監視します。 監視対象となるファイル数が多い場合、デフォルトの監視上限では不足することがあります。 そのため、/etc/sysctl.confを編集して監視対象ファイルの上限を引き上げておきます(最大1048576)。
vi /etc/sysctl.conf
以下の行を追記します。
fs.inotify.max_user_watches=524288
設定を保存したら、sysctl -pコマンドを実行して設定を反映させるか、システムを再起動します。
5. clamonacc サービスの設定変更
clamonaccはリアルタイムスキャンのためのサービスです。
サービスの定義ファイルをコピーし、ClamAVのアップデート時に設定が上書きされるのを防ぎます。
cp /usr/lib/systemd/system/clamav-clamonacc.service /etc/systemd/system/clamav-clamonacc.service
コピーしたファイルを編集します。
vi /etc/systemd/system/clamav-clamonacc.service
ExecStart=の行を探し、末尾に--move=/var/quarantineを追記して保存します。
変更前:
ExecStart=/usr/sbin/clamonacc --foreground
変更後:
ExecStart=/usr/sbin/clamonacc --foreground --move=/var/quarantine
ウイルスが検出されたファイルを自動的に/var/quarantineディレクトリに移動するようになります。
設定変更後、systemdのデーモンをリロードして変更を反映させます。
systemctl daemon-reload
6. clamonacc サービスの有効化と起動
サービスの自動起動を有効化し、起動します。 システム起動時に自動的にリアルタイムスキャンが開始されるようになります。
systemctl enable clamav-clamonacc.service
systemctl start clamav-clamonacc.service
自動起動が有効化されたことを確認します。
systemctl is-enabled clamav-clamonacc.service
出力がenabledであれば成功です。
7. リアルタイムスキャンの起動確認
clamonaccサービスが正常に起動しているか確認します。
systemctl status clamav-clamonacc.service
出力がactive (running)となっていれば、サービスは正常に動作しています。
プロセスリストからも確認できます。
ps aux | grep clamonacc
8. 動作確認
リアルタイムスキャンが正しく機能しているか確認するために、EICARテストファイルを利用します。
リアルタイムスキャン対象として設定したディレクトリ((ex)/var/www/)に移動し、EICARテストファイルをダウンロードします。
cd /var/www/
wget https://secure.eicar.org/eicar.com.txt
EICARテストファイルをダウンロードした直後に、ファイルが自動的に削除され、隔離用フォルダ/var/quarantineに移動されていること、そして設定した通知スクリプト(メールなど)が実行されていることを確認します。
9. 再起動後の動作確認
システムを再起動し、clamonaccサービスが自動的に起動しているか、そしてリアルタイムスキャンが機能しているかを再度確認します。
reboot
再起動後、以下のコマンドでプロセスが存在することを確認します。
ps aux | grep clamonacc
再度、EICARテストファイルをダウンロードして、自動的に削除されることを確認します。
cd /var/www/
wget https://secure.eicar.org/eicar.com.txt
以上で完了です。