PowerShellでWindowsログID:4625の接続元IPを抽出してリストを作成

powershell logo PowerShell

はじめに Introduction

「Windowsパソコンのブルートフォースアタック対策」のフロー②である「イベントID:4625のログ詳細から接続元IPを抽出してリストを作成」を行っていきます。
前回のフロー①では、PowerShellのGet-WinEventコマンドのオプションFilterHashtableを使ってWindowsログから絞込を行うところまで行きました。
今回は絞り込んだ各ログの詳細内容にある接続元IPだけをさらに抽出していきたいと思います。

結果ログをforeachでXML変換して接続元IPを抽出

絞り込んだ結果のログ一覧はオブジェクトになっているので、一旦変数$Obj_Logsに入れてから$foreachでループ処理します。
ループ処理の内容は、まずログ詳細データをXMLに変換して、そのXMLの要素(Name)が「IpAddress」の値を抽出していきます。


#### 定義
$RangeMinutes = 30
$SearchEndTime   = $(Get-Date -Format "yyyy-MM-dd HH:mm")
$SearchStartTime = $(Get-Date (Get-Date).AddMinutes(-$RangeMinutes) -Format "yyyy-MM-dd HH:mm")

#### 本処理
# Windowsログを検索
$Obj_Logs = Get-WinEvent -FilterHashtable @{LogName="Security";Id=4625;StartTime="$SearchStartTime";EndTime="$SearchEndTime"}
# 検索結果をループでXML変換してIPのみを抽出
$Arr_IP = @()
foreach($Log in $Obj_Logs){
	# XML変換
	$xml = [XML]($Log.ToXml())
	# XML内のEventDataから項目IpAddressの値(#text)を取り出す
	$IP = ($xml.Event.EventData.Data | where Name -eq "IpAddress")."#text"
	# 配列に入れ直し
	$Arr_IP = $Arr_IP + $IP
}
# 表示
$Arr_IP

そろそろソースが長くなってきたのでtest.ps1ファイルに書いて、Powershellでtest.ps1を叩いて実行していきます。
※Get-WinEventコマンドは管理者権限が必要なので、Powershellも管理者権限で開いてください。
test.ps1を実行すると下記の様なIPリストが表示されます。
※絞込条件に一致するログが無い場合はエラーが表示されます。

各IPの出現回数のカウント

211.59.71.243がたくさん出現し、193.46.255.41は1回だけです。
私自身もリモートデスクトップで外部からよく接続します、その際にパスワードを入力間違いしますので失敗が1回でブロックされたら大変ですので、出現回数をカウントして閾値以上だったらブロックする様にしたいと思っています。

コメント