Защита сервиса RDP под Windows от подбора пароля
Однажды на пару моих windows-серверов напали злодеи — пытались попасть на сервер через RDP, я поглядел на это безобразие и решил что надо их блокировать по IP. Готовых решений поискал, да не нашёл, поэтому сделал сам.
Навеяно этим постом.
Использую связку PowerShell и фаервола wipfw для защиты от угроз из интернета, в частности от злоумышленников, подбирающих логины и пароли к сеансу RDP.
Скрипт на PowerShell анализирует логи системы безопасности и готовит конфигурационный файл для wipfw. А уже wipfw, помимо своей основной работы, блокирует IP которые нашёл скрипт.
Скрипт выполняется у меня с определённой периодичностью, да и действующие аккаунты блокируются после 3-х неудачных попыток ввода пароля (разблокируются автоматом по таймауту), так что теперь стало поспокойнее.
Помимо конфигурационного файла для wipfw, получается еще и файл со статистикой по попыткам подбора логина/пароля, выглядит статистика примерно так:
23 сентября 2011 г. 8:35:45
Address UserName Cnt
------- -------- ---
78.39.192.78 adm 23
78.39.192.78 admin 89
78.39.192.78 admin1 23
78.39.192.78 admin2 23
78.39.192.78 administrator 23
78.39.192.78 aspnet 23
78.39.192.78 backup 23
78.39.192.78 console 23
78.39.192.78 david 23
78.39.192.78 guest 23
78.39.192.78 john 23
78.39.192.78 owner 23
78.39.192.78 server 23
78.39.192.78 sql 23
78.39.192.78 support 23
78.39.192.78 support_388945a0 23
78.39.192.78 sys 23
78.39.192.78 test2 23
78.39.192.78 test3 23
78.39.192.78 user 89
78.39.192.78 user1 23
78.39.192.78 user2 23
78.39.192.78 user3 23
78.39.192.78 user4 23
78.39.192.78 user5 2323 сентября 2011 г. 10:30:18
23 сентября 2011 г. 10:40:20
23 сентября 2011 г. 10:50:19
Address UserName Cnt
------- -------- ---
201.241.45.134 administrator 89
В файле видно IP за которым скрывается злодей, логин к которому подбирался пароль и количество попыток.
Словарь логинов по которому пытались ломать серверы:
1
123
a
actuser
adm
admin1
admin2
administrator
aspnet
backup
console
david
guest
john
owner
server
sql
support
support_388945a0
sys
test2
test3
user1
user2
user3
user4
user5
user
admin
db2admin
reception
Administrador
Есть конечно и список IP за которыми сидят злодеи. Что интересно, в большинстве случаев злодеи либо сидят за Windows Server 2003, либо прямо с них и работают. Напрашивается вывод про бот-сеть из заражённых серверов.
Ну и собственно скрипт.
$FilesPath = "C:\wipfw-0.2.8\" $mydate = (Get-date).AddMinutes(-10); $Events = Get-EventLog security | ?{$_.TimeGenerated -gt $mydate} | ?{$_.eventid -eq 529 } $IPs = New-Object System.Collections.ArrayList if($Events.Count -gt 1){ $Events | %{ $Data = New-Object System.Management.Automation.PSObject $Data | Add-Member NoteProperty Address ($null) $Data | Add-Member NoteProperty UserName ($null) $Data | Add-Member NoteProperty Cnt ($null) $message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()} $Data.UserName = ($message | ?{$_ -like "Пользователь*"} | %{$_ -replace "(.+):"} ) $Data.Address = ($message | ?{$_ -like "Адрес сети источника*"} | %{$_ -replace "(.+):" -replace "[ ?]"}) $Data.Cnt = 0 if(($data.address -ne <мой секретный IP-адрес>) -and ($data.address.length -gt 7)) { $IPs += $Data #$Data } } $IPs = $IPs | sort -property Address, UserName $k = 0 for ( $i = 1; $i -le $IPs.Count; $i++ ) { if(($IPs[$i].Address -ne $IPs[$i-1].Address) -or ($IPs[$i].UserName -ne $IPs[$i-1].UserName)) { $k = $i } else { $IPs[$k].Cnt++ } } Get-date | Out-File ($FilesPath+"\rdp_ban_list.txt") –append $IPs | %{if($_.Cnt -gt 10){$_}} | Out-File ($FilesPath+"\rdp_ban_list.txt") –append $IPs = $IPs | %{if($_.Cnt -gt 10){$_.Address}} | Get-Unique | Out-File ($FilesPath+"\rdp_ban_ip_list.txt") –append -encoding oem $IPs = (type ($FilesPath+"\rdp_ban_ip_list.txt")) -replace "[^.\d]" -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" $IPs = $IPs | sort-object | Get-Unique $IPs | Out-File ($FilesPath+"\rdp_ban_ip_list.txt") -encoding oem $IPs = (type ($FilesPath+"\rdp_ban_ip_list.txt")) -replace "[^.\d]" -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" type ($FilesPath+"\wipfw_prefix.conf") | Out-File ($FilesPath+"\wipfw.conf") -encoding oem $IPs | sort | %{"add 00666 unreach 10 log tcp from "+$_+" to any in via eth8"} | Out-File ($FilesPath+"\wipfw.conf") -encoding oem –append type ($FilesPath+"\wipfw_suffix.conf") | Out-File ($FilesPath+"\wipfw.conf") -encoding oem –append $FilesPath+="\wipfw.conf" &'c:\windows\system32\ipfw.exe' $FilesPath}
В планах доработать скрипт чтоб конфигурационный файл wipfw пересобирался только в том случае, если были попытки взлома, а не после каждого запуска скрипта. И надо подумать на тему разблокировки IP-адресов по таймауту (через полгода-год?).