SSMログイン検知のSNS通知 運用改善

はじめに

運用作業において、Bastion(Windows)サーバは内部ネットワークにアクセスする前に外部からの接続を行う中継サーバとしての役割があります。このサーバへのアクセスはセキュリティ観点から、特定のアクセスを速やかに把握することが求められたりもします。

このブログでは、SSM経由でのログインをAmazon SNSを通じてリアルタイムで通知を受け取る方法について紹介します。

今回の構築で気がついた Tips

SSM経由のAdministratorログインの場合、出力ログが異なる。

・通常のAdministratorの場合:イベントID: 4624、ログオンタイプ: 2、ユーザ名: Administrator
・SSMを介したログインの場合:イベントID: 4624、ログオンタイプ: 5、ユーザ名: SYSTEM

構成

構成図

①ローカル管理者としてユーザがログイン
②ログイン情報がイベントビューアにログ出力
③ログ出力がトリガーとなり、タスクスケジューラで設定したSNSに通知サービスを実行
④Amazon SNSを経由してメールが通知

構築

前提条件

Bastion(Windows)サーバが既に構築されている状態とする。
Bastion(Windows)サーバにはAWS CLIがインストールされている状態とする。

1.AWS マネジメントコンソール作業 -SNS-

SNSの構築には、CloudShellを利用して構築を実施する。

1.1.SNSトピック作成

TOPC部分を任意のSNSトピック名に修正してコマンドの実行をする。
aws sns create-topic --name TOPIC

1.2.Eメールサブスクリプションの追加

REGION、ACCOUNT-ID、TOPIC(1.1.SNSトピック作成のもの)、EMAILADDRESS部分を修正してコマンドの実行をする。
aws sns subscribe --topic-arn arn:aws:sns:REGION:ACCOUNT-ID:TOPIC --protocol email --notification-endpoint EMAILADDRESS

1.3.届いたEメールよりサブスクリプションの追加

赤枠部分を押下してサブスクリプションの購読を開始する。

2.AWS マネジメントコンソール作業 -IAMポリシー-

Bastion(Windows)は既に構築済みとしているため、アタッチするIAMポリシーのみ記載する。

2.1.ポリシー作成

SNSへPublishできる内容のポリシーを作成して、Bastion(Windows)のロールにアタッチする。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublishSNS",
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
}

3.Bastion(Windows)作業 -PowerShell-

Bastion(Windows)にリモートデスクトップをおこない、以下作業を実施する。

3.1.Amazon SNSへ通知するPowerShell構築

任意のフォルダに下記PowerShellスクリプトを作成する。

(例)alert_admin_login.ps1

# Get-WinEventでセキュリティログ(4624)フィルタリング
# ForEach-Objectでユーザ名(STSTEM)とログオンタイプ(5)を取得
$adminLogonEvents = Get-WinEvent -FilterHashtable @{LogName="Security"; ID=4624} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $username = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' } | Select-Object -ExpandProperty '#text'
    $logonType = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'LogonType' } | Select-Object -ExpandProperty '#text'
    if ($username -eq "SYSTEM" -and $logonType -eq 5) {
        $_
    }
}

if ($adminLogonEvents) {
    # AWS CLIを使用してSNSへ通知
    $Message = "Bastionサーバで SSM経由でのログインがありました。"
    $TopicArn = "arn:aws:sns:ap-northeast-1:538815528650:sns-notifictoion-inamura"
    aws sns publish --message "$Message" --topic-arn $TopicArn
}

exit

3.2.Amazon SNSへ通知出来るかの確認

PowerShellを実行して通知されるかを確認する。

【PowerShell実行画面】

【メール受領画面】

4.Bastion(Windows)作業 -タスクスケジューラ-

4.1.タスクスケジューラ表示

右ペイン「Create Task」を押下する。

4.2.タスク 名前の入力

新しいタスクウィザードで名前と説明を入力後、「Next」を押下する。

4.3.タスク トリガー新規設定

「Triggers」タブを選択して、「New」を押下する。

4.5.タスク トリガー設定

「Begin the task」 ドロップダウンメニューで「On an event」を選択する。
「Log」 ドロップダウンメニューで「Security」を選択する。
「Event ID」 フィールドに 4624(ログオンイベントはイベントID 4624) を入力する。

4.6.タスク アクション新規設定

「Actions」タブを選択して、「New」を押下する。

4.7.タスク アクション設定

「Action」に「Start a program」を選択する。
「Program/script」欄に「powershell.exe」と入力する。
「Add arguments」欄に「-ExecutionPolicy Bypass -File "POWERSHELL_PATH"」とにゅうりょくする。
※POWERSHELL_PATHには、「3.1.Amazon SNSへ通知するPowerShell構築」で作成した PowerShellスクリプトの実際のパスに置き換える。

4.8.設定の完了

「Next」をクリックし、確認画面で設定内容を確認後完了する。

挙動の確認

1.SSM経由でログインして、SNS通知が送られてくる

さいごに

実際に構築するまでCloudWatchAgentの導入が必要かと思っていましたが、EC2にSNSのロールとWindowsのタスクスケジューラでどうにかなるんですね。
ADに所属している場合DomainAdminには対応していないので、そちらの構築についても今後検証をしていきたいと思います。
まだまだ自動化すべき作業が多いので、少しずつ自動化に置き換えてオペミスを減らしていきたい所存でございます。

Last modified: 2023-10-09

Author