📚

WindowsログでRDPの不正アクセスを検知してDiscordに通知

2024/10/07に公開

イベントビューアのログを自動でとってきて、powershellでDiscord Hookへ投稿を投げるという方針でつくる。

イベントビューア監査ポリシーでログインイベントを記録

以下サイトを参考に監査ポリシーの設定をしてログインイベントを記録する。
ちなみにログインイベントのイベントIDは4624(成功)、4625(失敗)。
ネットワーク越し場合のイベントタイプは3。
https://www.yellowhouse.jp/remotedesktop-eventlog/

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は実行ポリシーの変更が必要?
変えたけど必要だったのかわからん。
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750

Discussion