📚
WindowsログでRDPの不正アクセスを検知してDiscordに通知
イベントビューアのログを自動でとってきて、powershellでDiscord Hookへ投稿を投げるという方針でつくる。
イベントビューア監査ポリシーでログインイベントを記録
以下サイトを参考に監査ポリシーの設定をしてログインイベントを記録する。
ちなみにログインイベントのイベントIDは4624(成功)、4625(失敗)。
ネットワーク越し場合のイベントタイプは3。
powershellスクリプトを準備
本体スクリプトのremote_alert.ps1と、管理者権限で実行用のremote_alert.batを準備する。
remote_alert.ps1
# 過去1日分のリモートデスクトップの成功ログイン(ログオンタイプ3)を1時間ごとに抽出
$events = Get-WinEvent -LogName Security | Where-Object {
$_.Id -eq 4624 -and $_.Properties[8].Value -eq 3 -and $_.TimeCreated -gt (Get-Date).AddHours(-1)
}
if ($events.Count -eq 0) {
# イベントがない場合
$message = "PCへのログインはありませんでした"
$allMessages = $message
} else {
# イベントがある場合
$allMessages = "PCへのリモートログインを確認しました\n"
foreach ($event in $events) {
$eventDetails = @{
TimeCreated = $event.TimeCreated
UserName = ($event.Properties[5].Value) # ユーザー名の取得
LoginType = ($event.Properties[8].Value) # 失敗理由の取得
IPAddress = ($event.Properties[18].Value) # ソースIPアドレスの取得
}
$message = "検出日時: $($eventDetails.TimeCreated)\n" +
"ユーザー名: $($eventDetails.UserName), " +
"IPアドレス: $($eventDetails.IPAddress)"
# メッセージをすべてまとめる
$allMessages += "$message\n"
}
}
# DiscordのAPIへリクエスト
Invoke-WebRequest -Headers @{
"Content-Type" = "application/json"
} -Method Post -Body "{
`"username`": `"Login Notifier`", `"content`": `"$allMessages`"
}" https://discordapp.com/api/webhooks/***
pwsh.exeはpowershell.exeでもよいと思うが、私の場合はps7を後付けでインストールして使っていたのでこちらで実行。
ps1パスに日本語が入っているとbat実行がうまくいかなかったのご注意を。(シングルクオートを適切に付与すれば解決?)ここでかなり時間を食った。
remote_alert.bat
powershell -Command "Start-Process 'C:\\Program Files\\PowerShell\\7\\pwsh.exe' -ArgumentList 'path\to\rimote_alert.ps1' -WindowStyle Hidden -Wait -Verb runas"
タスクスケジューラに登録
remote_alert.batを1時間ごとに実行するように設定。
この時管理者権限で実行できるように管理者ユーザーを指定する。
ログインがあれば以下のようにDiscordに通知がいく。
その他
PowerShellは実行ポリシーの変更が必要?
変えたけど必要だったのかわからん。
Discussion