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

2023.12.20

こんにちは。
繁松です。

はじめに

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

やってみた

前提

PowerShellスクリプト

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

# チェック対象のディレクトリ  
$CHECK_DIR = "C:\Users\Administrator\Documents\hash_check"  
  
# ハッシュ値を保存するファイル  
$HASH_FILE = "C:\Users\Administrator\Documents\hash\file_hashes.txt"  
$PREVIOUS_HASH_FILE = "C:\Users\Administrator\Documents\hash\previous_file_hashes.txt"  
  
# インスタンスIDを取得  
$InstanceId = Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id  
  
# 前回のハッシュファイルが存在するかチェックし、存在しない場合は作成  
if (-Not (Test-Path -Path $PREVIOUS_HASH_FILE)) {  
    New-Item -Path $PREVIOUS_HASH_FILE -ItemType File  
}  
  
# ハッシュ値を計算してファイルに保存  
Get-ChildItem -Path $CHECK_DIR -Recurse -File |  
    Get-FileHash -Algorithm SHA256 |  
    Sort-Object -Property Path |  
    ForEach-Object { "$($_.Hash) $($_.Path)" } |  
    Set-Content -Path $HASH_FILE  
  
# ハッシュ値が変更されたかチェック  
if (Compare-Object (Get-Content -Path $HASH_FILE) (Get-Content -Path $PREVIOUS_HASH_FILE) -SyncWindow 0) {  
    # NG:ファイルに変更があればメトリクス「0」を送信  
    & aws cloudwatch put-metric-data --metric-name FileIntegrity --namespace "Custom" --dimensions InstanceId=$InstanceId --value 0 --unit None  
} else {  
    # OK:ファイルに変更がなければメトリクス「1」を送信  
    & aws cloudwatch put-metric-data --metric-name FileIntegrity --namespace "Custom" --dimensions InstanceId=$InstanceId --value 1 --unit None  
}  
  
# 現在のハッシュファイルを前回のハッシュファイルとして保存  
Move-Item -Path $HASH_FILE -Destination $PREVIOUS_HASH_FILE -Force

タスクの作成

スクリプトを定期的に実行するために、5分ごとに動作するタスクを作成します。

タスクスケジューラを開き[タスクの作成]を選択します。

全般タブでタスクの[名前]を入力し、[ユーザーがログオンしているかどうかにかかわらず実行する]にチェックを入れ、トリガータブを開きます。

[新規]をクリックします。

設定[1回]、繰り返し間隔[5分間]、継続時間[無期限]に設定しOKを選択します。

操作タブを開き、[新規]をクリックします。

プログラムに、引数の追加に[-File "スクリプトのパス"]を入力しOKを選択します。

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

CloudWatchアラームの設定

SNSの登録

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

アラームの設定

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

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

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

通知先を設定します。

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

動作確認

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

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

さいごに

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

次回はAmazon Linux バージョンのブログも書こうと思います。