Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellとWindowsファイアウォールで実現するRDPブルートフォース攻撃の自動防御

RDPへのブルートフォース攻撃や継続的な不正アクセスを検知した際、その送信元IPアドレスを自動的にブラックリスト化してWindowsファイアウォールでブロックする、シンプルなPowerShellスクリプトを紹介します。仕組みは次のとおりです。PowerShellスクリプトがシステムのイベントログを解析し、直近3時間以内に同じIPアドレスから5回以上のRDP認証失敗が記録されていた場合、そのIPアドレスを自動的にWindowsファイアウォールのブロックルールへ追加します。

想定する環境

ここでは小規模オフィスのネットワークを例に説明します。インターネットゲートウェイとしてLinuxサーバーが稼働しており、NAT経由でRDPポートがオフィス内の1台のコンピューターへ転送されています(外部からはTCP 15221番ポートが応答し、内部ではデフォルトのRDPポート3389番へ転送)。この構成では、外部からの認証失敗が繰り返されることで、ドメインのパスワードポリシーによって既知のユーザーアカウントがロックされてしまうことがあります。そこで本記事の目的は、RDPサーバーへのブルートフォース攻撃に使われているIPアドレスを自動的にブロックすることです。

ステップ1: ファイアウォールのブロックルールを作成する

まず、指定したIPアドレスからのRDP接続(受信)を拒否するファイアウォールルールを作成します。

New-NetFirewallRule -DisplayName "BlockRDPBruteForce" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Block

以降の手順では、RDPへのブルートフォース攻撃が検知されたIPアドレスを、このルールに順次追加していきます。

なお、PowerShellスクリプトにブロックさせたくないIPアドレスやサブネットがある場合は、優先度の高い許可ルールを別途作成しておくと安心です。

ステップ2: イベントログから攻撃元IPアドレスを抽出する

続いて、過去3時間以内に5回以上の認証失敗が記録されたIPアドレスのリストを、Windowsイベントログから収集します。具体的には、セキュリティログ内のイベントID 4625(ログオン失敗 — An account failed to log on)かつLogonType = 3(ネットワーク経由のログオン)のイベントを検索します(RDPイベントログのフォレンジック分析に関する記事も参考になります)。検出したイベントから接続を試みたユーザーのIPアドレスを特定し、その出現回数が5回を超えていることを確認します。

以下のPowerShellコードを使うと、直近3時間(期間は変更可能)のイベントから攻撃者のIPアドレスだけを抽出できます。

$Last_n_Hours = [DateTime]::Now.AddHours(-3)
$badRDPlogons = Get-EventLog -LogName 'Security' -after $Last_n_Hours -InstanceId 4625 | ?{$_.Message -match 'logon type:\s+(3)\s'} | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
$getip = $badRDPlogons | group-object -property IpAddress | where {$_.Count -gt 5} | Select -property Name

検出されたIPアドレスの一覧を表示するには、次のコマンドを実行します。$getip

ステップ3: 検出したIPアドレスをファイアウォールルールに追加する

次に、見つかった攻撃元IPアドレスをすべて、先ほど作成したBlockRDPBruteForceルールに追加します。Windowsファイアウォールの操作には、標準搭載のNetSecurityモジュールを使用します。まず現在ブロック済みのIPアドレス一覧を取得し、新しいIPアドレスをマージした上でルールを更新します。

$log = "C:\ps\rdp_blocked_ip.txt"
$current_ips = (Get-NetFirewallRule -DisplayName "BlockRDPBruteForce" | Get-NetFirewallAddressFilter ).RemoteAddress
foreach ($ip in $getip)
{
$current_ips += $ip.name
(Get-Date).ToString() + ' ' + $ip.name + ' The IP address has been blocked due to ' + ($badRDPlogons | where {$_.IpAddress -eq $ip.name}).count + ' attempts for 2 hours'>> $log # IPブロックの記録をログファイルに書き込む
}
Set-NetFirewallRule -DisplayName "BlockRDPBruteForce" -RemoteAddress $current_ips

実行後は、新しいIPアドレスがWindows Defenderファイアウォールのブロックルールに正しく追加されていることを確認しましょう。

ステップ4: タスクスケジューラで自動実行する

最後に、このPowerShellコードをc:\ps\block_rdp_attack.ps1というファイルに保存し、タスクスケジューラに登録して、例えば2時間ごとに自動実行されるように設定します。

スケジュールタスクはPowerShellからでも手動でも作成できます。PowerShellで登録する場合は以下のようにします。

$repeat = (New-TimeSpan -Hours 2)
$duration = ([timeSpan]::maxvalue)
$Trigger= New-ScheduledTaskTrigger -Once -At (Get-Date).Date -RepetitionInterval $repeat -RepetitionDuration $duration
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\block_rdp_attack.ps1"
Register-ScheduledTask -TaskName "BlockRDPBruteForce_PS" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

また、定時実行ではなく、セキュリティログにイベントID 4625が記録されたタイミングでスクリプトを起動するようにタスクトリガーを設定することもできます(Windowsイベントトリガーの設定方法を参照)。この方法なら、RDPブルートフォース攻撃に対してより迅速に対応できます。

このスクリプトは自由にカスタマイズできるので、自社の環境や運用ポリシーに合わせて調整し、RDP攻撃対策にぜひ活用してください。

  1. Windows 10 ファイアウォールのルールと設定を調整する方法【初心者向け解説】

    Windows 10 の Windows ファイアウォールは、Vista 時代から大きな変更はなく、基本的な仕組みはほぼ同じです。受信(インバウンド)接続は、許可リストに登録されていない限りブロックされ、一方で送信(アウトバウンド)接続はルールに一致しない場合でもブロックされません。また、ファイアウォールにはパブリックとプライベートという2つのネットワークプロファイルが用意されており、プライベートネットワークとインターネットのそれぞれで、どのプログラムが通信できるのかを細かく制御できます。 この記事では、Windows 10 ファイアウォールのさまざまなオプションや設定項目を解説し、自分のニー

  2. Windows 10/11でVisual Studio Codeを使ってPowerShellスクリプトを作成・実行する方法

    Windows 10やWindows 11でも、PowerShellスクリプトを作成できることをご存じでしょうか?WindowsにPowerShellをインストールしたら、次はPCで何ができるのか知りたくなるはずです。このガイドでは、Visual Studio Codeを使ってシンプルなスクリプトファイルを作成し、Windows 10およびWindows 11のPowerShellで実行する方法を解説します。 まずは基本的なPowerShellスクリプトの作り方を覚えましょう。これをマスターすれば、Windows 10とWindows 11の両方でスクリプトを作成・実行できるようになり、作業効