Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell과 Windows 방화벽 규칙으로 RDP 무차별 대입 공격 자동 차단하기

RDP 무차별 대입(brute-force) 공격이나 지속적인 RDP 공격이 탐지된 IP 주소를 Windows 방화벽에서 자동으로 차단(블랙리스트)하는 간단한 PowerShell 스크립트를 소개합니다. 핵심 아이디어는 다음과 같습니다. PowerShell 스크립트가 시스템 이벤트 로그를 분석하여, 지난 3시간 동안 동일한 IP 주소에서 RDP 인증 실패가 5회 이상 발생하면 해당 IP 주소를 Windows 방화벽 차단 규칙에 자동으로 추가하는 것입니다.

시나리오 개요

소규모 사무실 네트워크를 가정해 보겠습니다. 외부 접근을 위해 Linux 기반 인터넷 게이트웨이를 통해 NAT로 RDP 포트가 사무실 컴퓨터 중 하나로 포워딩되어 있습니다(외부에서는 TCP 15221 포트가 응답하고, 내부의 기본 RDP 포트 3389로 전달됩니다). 그런데 RDP를 통한 인증 시도가 반복해서 실패하면서 도메인 암호 정책에 의해 기존 사용자 계정이 잠기는 문제가 종종 발생합니다. 따라서 우리의 과제는 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 이벤트 로그에서 수집해야 합니다. 이를 위해 보안(Security) 로그에서 EventID 4625(로그온 실패 — An account failed to log on, LogonType = 3) 이벤트를 찾습니다(RDP 이벤트 로그 포렌식 관련 글 참고). 찾은 이벤트에서 연결을 시도한 사용자의 IP 주소를 확인하고, 해당 IP가 이벤트 로그에 5회 이상 나타나는지 확인합니다.

최근 3시간 동안의 이벤트 목록에서 공격자 IP 주소를 추출하는 데 사용한 PowerShell 코드는 다음과 같습니다(시간 범위는 필요에 따라 조정 가능):

$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 PowerShell 모듈을 사용합니다. 먼저 현재 차단 중인 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

작업이 완료되면 Windows Defender 방화벽의 차단 규칙에 새 IP 주소가 정상적으로 추가되었는지 확인합니다.

4단계: 예약된 작업 등록

이제 위의 PowerShell 코드를 c:\ps\block_rdp_attack.ps1 파일로 저장하고, 예를 들어 2시간마다 실행되도록 작업 스케줄러(Task Scheduler)에 등록하기만 하면 됩니다.

스케줄러 작업은 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

또는 이벤트 로그에 EventID 4625가 기록될 때마다 PowerShell 스크립트가 실행되도록 이벤트 트리거를 설정할 수도 있습니다(Windows 이벤트 트리거 관련 글 참고). 이 방식을 사용하면 RDP 무차별 대입 공격에 더욱 신속하게 대응할 수 있습니다.

이 스크립트는 환경과 요구 사항에 맞게 자유롭게 수정하여 RDP 공격 차단에 활용할 수 있습니다.