見出し画像

Active Directoryへの攻撃や侵害の兆候をTeamsに通知して監視してみる。

Active Directoryへの攻撃や侵害の兆候を察知することとして監査ポリシーを設定し、定期的にその変化を通知させることで監視するようにしてみる。
以前調べたことは以下

設定する監査ポリシー

攻撃の兆候を察知するためにはどんなポリシーを設定すればいいのか

  • アカウントログオンイベントの監査
    成功及び失敗のログイン試行を監視する。
    特に特権アカウントの使用を注意深く監視する。

  • ディレクトリサービスアクセスの監査
    Active Directoryオブジェクトへのアクセスを監視する。
    重要なオブジェクトや属性の変更を記録する。

  • アカウント管理の監査
    ユーザアカウントの作成、変更、削除を監視する。
    グループメンバーシップの変更も同様に監視する。

  • ポリシーチェンジ時の監査
    監査ポリシーやユーザー権利の変更を監視します。
    セキュリティ設定の変更も記録します。

  • プロセストラッキングの監査
    プロセスの開始と終了を監視します。
    特に管理者権限で実行されるプロセスに注意する。

アカウント管理の監査のPowershellコマンドを作る

※プライマリ/セカンダリ両方で作成すること

  1. イベントの取得: Get-WinEventコマンドレットを使用して、以下のイベントIDを含む監査ログを取得します。
    4720 アカウント作成
    4722 アカウント有効化
    4723 パスワード変更
    4725 アカウント無効化
    4726 アカウント削除

  2. 条件の追加: if ($events)を使用して、イベントが存在する場合のみ処理を実行します。イベントが存在しない場合は、通知を送信しません。

  3. 取得するイベントログの範囲:直近24時間とする 。

  4. 通知:Teamsに結果通知を行う。


# TLS 1.2およびTLS 1.3を有効にする
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13

# 必要なモジュールのインポート
if (Get-Module -ListAvailable -Name ActiveDirectory) {
    Import-Module ActiveDirectory
}

# Teams Webhook URL(変更箇所)
$webhookUrl = "https://outlook.office.com/webhook/your-webhook-url"

# イベントIDリスト
$eventIds = @(4720, 4722, 4723, 4725, 4726)

# 現在の時間と過去24時間の開始時刻
$now = Get-Date
$startTime = $now.AddHours(-24)

# イベントログの取得
$events = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = $eventIds
    StartTime = $startTime
    EndTime = $now
} -ErrorAction SilentlyContinue

# イベントが存在する場合のみ処理を実行
if ($events -and $events.Count -gt 0) {
    foreach ($event in $events) {
        # メッセージの整形と安全な切り詰め
        $message = $event.Message -replace "`r`n", "`r`n"
        if (![string]::IsNullOrEmpty($message) -and $message.Length -gt 1000) {
            $message = $message.Substring(0, 1000) + "`r`n..."
        }

        # アダプティブカード形式のJSONを作成
        $card = @{
            type = "message"
            attachments = @(
                @{
                    contentType = "application/vnd.microsoft.card.adaptive"
                    content = @{
                        type = "AdaptiveCard"
                        version = "1.4"
                        schema = "http://adaptivecards.io/schemas/adaptive-card.json"
                        body = @(
                            @{
                                type = "TextBlock"
                                size = "Large"
                                weight = "Bolder"
                                text = "セキュリティイベント通知"
                                wrap = $true
                            },
                            @{
                                type = "FactSet"
                                facts = @(
                                    @{ title = "Event ID"; value = "$($event.Id)" },
                                    @{ title = "Time Created"; value = "$($event.TimeCreated)" }
                                )
                            },
                            @{
                                type = "TextBlock"
                                text = $message
                                wrap = $true
                            }
                        )
                    }
                }
            )
        }

        $jsonPayload = $card | ConvertTo-Json -Depth 10

        try {
            Invoke-RestMethod -Uri $webhookUrl -Method Post -Body $jsonPayload -ContentType 'application/json; charset=utf-8'
            Write-Host "Event ID: $($event.Id) sent successfully."
        } catch {
            Write-Host "Failed to send event ID: $($event.Id). Error: $_"
        }
    }
} else {
    Write-Host "No events found in the past 24 hours."
}

上記を作成後、タスクスケジューラで24時間毎に起動させる。
イベントログが多いと24時間もたないので、ログの保存容量を増やすか、監視の頻度を変更しましょう。

Teams側の設定

通知させたいチャネルの「・・・」→「ワークフロー」を開く

「Webhook要求を受信するとチャネルに投稿する」を選択する。

名前を任意の名前に変えて「次へ」

「ワークフローを追加する」をクリックする

作成されたURLをコピーし、「完了」をクリックする

Powershell コマンドの 「$webhookUrl =」部分にコピーしたURLを張り付ける。

実際にどんなメッセージが出るのか

ユーザを削除したら以下の様なメッセージが出た。

今回は以上。
他のADについての記事は以下


いいなと思ったら応援しよう!