Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт блокировки неудачных попыток входа на сервер терминалов. (http://forum.oszone.net/showthread.php?t=338214)

rango13 13-12-2018 13:01 2845708

Скрипт блокировки неудачных попыток входа на сервер терминалов.
 
Всем привет!

Есть такая проблема: имеется смотрящий в мир сервер-терминалов, куда подключаются сотрудники организации для работы. В журнале событий "Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational" видны эти попытки в таком виде:
Get-WinEvent -LogName Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational | Where-Object {$_.ID -eq "140"}

TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
10.12.2018 14:56:41 140 Предупреждение Не удалось подключить клиентский компьютер с IP-адресом 77.222.159.189 из-за неправильного имени пользователя или пароля.
10.12.2018 14:56:52 140 Предупреждение Не удалось подключить клиентский компьютер с IP-адресом 77.222.159.189 из-за неправильного имени пользователя или пароля.

Как я это вижу:
Если подобное событие появляется с одним и тем же ip-адресом 5 раз подряд - внести во входящие правила файервола Windows запрет на любой коннект на сервер-терминалов с этого ip-адреса.
Как я это вижу на практике:

1. В планировщике задач Windows создать задачу, которая будет запускать ps-скрипт по появлению в журнале событий "Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational" события с ID=140.
2. Скрипт после запуска парсит само событие, вытаскивает с него ip-адрес и смотрит, если ли в уже ранее созданном файле этот ip-адрес и его счётчик. Что-то вроде того:
77.222.159.189 3
77.222.159.181 1
77.222.159.189 5

3. Если ip-адрес есть в файле и счётчик не равен 5(неудачным попыткам подключения к серверу терминалов), значит увеличить счётчик напротив этого ip-адреса на единицу.
4. Когда счётчик у ip-адреса увеличивается до 5 - внести этот ip-адрес в список заблокированных ip на файерволе Windows.


C пунктом 1 всё предельно ясно. С пунктом 4 тоже:
netsh advfirewall firewall add rule name="BlockIP" Dir=In Action=Block RemoteIP=77.222.159.189/32

Затык в п.3. Можете дать направление с примерами, чтобы самому разобраться?

Что есть сейчас:

$Event = Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational';ID='140'} -maxevent 1
$regex = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
$Event | Out-String -Stream | select-string -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } | sort-object | Get-Unique >> D:\blocked_ip.txt

Kazun 13-12-2018 15:01 2845738

1. Привязка к событию может вызвать локальный DOS, и ресурсы исчерпаются быстрее, чем будут выполняться скрипты, что приведет к неправильным подсчетам, если несколько скриптов не успели завершиться.

2. Самое простое запускать скрипт, раз в 30/60 или более минут.

3. Создать два файла: первый содержит набор ip-адрессов, второй файл время последнего запуска скрипта

4. Т.к. нет возможни посмотреть, что за событие 140, то посчитайте в какой по порядку с 0 - Properties содержится IP и подставьте вместо X - $Event.Properties[X].Value

Код:

$Event = Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational';ID='140'} -maxevent 1
$Event.Properties

5. Скрипт
Код:

# Файл с временем
$tfile = "time.txt"
# Файл с IP
$ipfile = "ip.xml"

# Время последнего события, если есть, то ставим текущий день
try {
        $ST = [DateTime]::ParseExact(
                (Get-Content $tfile -Raw).Trim(),
                "yyyy-MM-dd HH:mm:ss",
                [System.Globalization.CultureInfo]::InvariantCulture
        )
} catch {
        $ST = [DateTime]::ToDay
}

# Заполняем hashtable
try {
        $ip = Import-CliXML $ipfile
} catch {
        $ip = @{}
}

$Events = Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational';ID='140';StartTime=$ST}

foreach($Event in $Events) {
        $event_ip = $Event.Properties[X].Value
       
        if($event_ip -as [IPAddress]) {
                if (-not $ip.ContainsKey($event_ip)) {
                        $ip[$event_ip] = 1
                }
               
                if($ip[$event_ip] -ne "Block") {
                        if ($ip[$event_ip] -lt 5) {
                                $ip[$event_ip] += 1
                        }
                        if ($ip[$event_ip] -ge 5) {
                                netsh advfirewall firewall add rule name="BlockIP" Dir=In Action=Block RemoteIP="$event_ip/32"
                                $ip[$event_ip] = "Block"
                        }
                }
        }
}

if($Events) {
  # Экспортируем список IP
  $ip | Export-Clixml $ipfile

  # Сохраняем время последнего события
  $Events[0].TimeCreated.AddSeconds(1).ToString("yyyy-MM-dd HH:mm:ss") | Out-File $tfile
}


boot-a 05-09-2019 15:35 2886795

После недавних обновлений в Windows 2012 ошибка входа перестала вызывать событие 140. Вообще не появляется предупреждение в журнале Microsoft-Windows-RemoteDesktopServices-RdpCoreTS при неудачном вводе пароля. Просто сброс сеанса без указания IP :( С 20.08.19 на всех серверах. Ни у кого идей новых не появилось?

Busla 06-09-2019 11:23 2886900

Цитата:

Цитата boot-a
Ни у кого идей новых не появилось? »

всё украдено придумано до нас про linux и ssh на английском - но вы же хотели только идею
неудачные попытки соединения блокируются внешним брандмаэром

boot-a 09-09-2019 10:56 2887187

Не совсем понял к чему ссылка... Вопрос в том, в каком логе можно сейчас найти ip адрес-источник неудачной попытки входа.


Время: 14:37.

Время: 14:37.
© OSzone.net 2001-