EC2(Amazon Linux 2023)でファイルのハッシュ値に変更があった場合にCloudWatchから通知させてみた

2023.12.23

こんにちは。
繁松です。

はじめに

EC2(Amazon Linux 2023)でハッシュ値の比較を使ったWEB改ざん検知の方法を考えてみました。
今回はファイルの追加やファイルのハッシュ値に変更があった場合にCloudWatchでアラート発報しメールアドレス宛に通知させてみます。

やってみた

前提

シェルスクリプト

このスクリプトで、指定されたファイルのハッシュ値を比較します。
ファイルに変更がなければ、CloudWatchに「1」をPutします。変更が検出された場合は、「0」をPutします。
※ファイルのチェック対象となるディレクトリと、ハッシュ値を保存するためのディレクトリは別々のディレクトリにしてください。

#!/bin/bash  
  
# ファイルのディレクトリ  
check_dir="/var/www/html"  
  
# ハッシュ値を保存するファイル  
hash_file="/tmp/file_hashes.txt"  
previous_hash_file="/tmp/previous_file_hashes.txt"  
  
# インスタンスIDを取得  
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")  
instance_id=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)   
  
# 前回のハッシュファイルが存在するかチェックし、存在しない場合は作成  
if [ ! -f "$previous_hash_file" ]; then  
    touch "$previous_hash_file"  
fi  
  
# ハッシュ値を計算してファイルに保存  
find $check_dir -type f -exec sha256sum {} \; | sort > $hash_file  
  
# ハッシュ値が変更されたかチェック  
if cmp -s "$hash_file" "$previous_hash_file"; then  
    # ファイルに変更がなければOKメトリクスを送信  
    aws cloudwatch put-metric-data --metric-name FileIntegrity --namespace "Custom" --dimensions InstanceId=$instance_id --value 1 --unit None  
else  
    # ファイルに変更があればNGメトリクスを送信  
    aws cloudwatch put-metric-data --metric-name FileIntegrity --namespace "Custom" --dimensions InstanceId=$instance_id --value 0 --unit None  
fi  
  
# 現在のハッシュファイルを前回のハッシュファイルとして保存  
mv $hash_file $previous_hash_file

定期実行の設定(cron)

スクリプトを定期的に実行するために、5分ごとに動作するタスクを作成します。
Amazon linux 2023ではcrontabがデフォルトで利用できないのでインストールします。

# インストール  
sudo yum install cronie -y  
  
# システム起動時に自動的に開始するように設定する  
sudo systemctl enable crond.service  
# cron開始  
sudo systemctl start crond.service  
# ステータス確認  
sudo systemctl status crond

設定ファイルを開きます。

crontab -e

スクリプトを実行するスケジュールを設定します。

*/5 * * * * /スクリプトのディレクトリ/hash_check.sh

実行権限の付与

chmod +x /スクリプトのディレクトリ/hash_check.sh

AWSコンソールよりCloudWatchを開きます。
すべてのメトリクス->Custom->InstanceIdを開き、対象のメトリクスがPutされていることを確認します。

CloudWatchアラームの設定

SNSの登録

以下の手順を参考にトピックとサブスクリプションを作成します。

アラームの設定

AWSコンソールよりCloudWatchを開きます。
すべてのメトリクス->Custom->InstanceIdを開き、対象のメトリクスにチェックを入れ、[アラームの作成]を選択します。

統計と期間を設定します。
統計:最小
期間:5分

条件を設定し次に進みます。
アラーム条件:以下
しきい値:0

通知先を設定します。

アラーム名を入力しアラームを作成します。
作成後にアラーム状態がOKになったことを確認します。

動作確認

CloudWatchにメトリクスがPutされていることを確認できたので、チェック対象のファイルを編集してCloudWatchから通知されることを確認します。
ファイルの編集から数分でCloudWatchがアラーム状態になりました。

SNSで設定したメールアドレス宛にも通知が届きました。

さいごに

WEB改ざん検知について前回取得したファイルのハッシュ値と比較してCloudWatchから通知させる方法を考えてみました。
どのファイルが変更されたかの特定はできないので、ログから確認するや、スクリプトを修正してファイルを特定できるようにする等の対策も必要ですが、簡易的な通知にはなるかと思います。