Active Directoryへの攻撃や侵害の兆候をTeamsに通知して監視してみる。
Active Directoryへの攻撃や侵害の兆候を察知することとして監査ポリシーを設定し、定期的にその変化を通知させることで監視するようにしてみる。
以前調べたことは以下
設定する監査ポリシー
攻撃の兆候を察知するためにはどんなポリシーを設定すればいいのか
アカウントログオンイベントの監査
成功及び失敗のログイン試行を監視する。
特に特権アカウントの使用を注意深く監視する。ディレクトリサービスアクセスの監査
Active Directoryオブジェクトへのアクセスを監視する。
重要なオブジェクトや属性の変更を記録する。アカウント管理の監査
ユーザアカウントの作成、変更、削除を監視する。
グループメンバーシップの変更も同様に監視する。ポリシーチェンジ時の監査
監査ポリシーやユーザー権利の変更を監視します。
セキュリティ設定の変更も記録します。プロセストラッキングの監査
プロセスの開始と終了を監視します。
特に管理者権限で実行されるプロセスに注意する。
アカウント管理の監査のPowershellコマンドを作る
※プライマリ/セカンダリ両方で作成すること
イベントの取得: Get-WinEventコマンドレットを使用して、以下のイベントIDを含む監査ログを取得します。
4720 アカウント作成
4722 アカウント有効化
4723 パスワード変更
4725 アカウント無効化
4726 アカウント削除条件の追加: if ($events)を使用して、イベントが存在する場合のみ処理を実行します。イベントが存在しない場合は、通知を送信しません。
取得するイベントログの範囲:直近24時間とする 。
通知: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についての記事は以下
