Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Скрипт блокировки неудачных попыток входа на сервер терминалов.

Ответить
Настройки темы
PowerShell - Скрипт блокировки неудачных попыток входа на сервер терминалов.

Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: rango13
Дата: 13-12-2018
Описание: П.2 решён.
Всем привет!

Есть такая проблема: имеется смотрящий в мир сервер-терминалов, куда подключаются сотрудники организации для работы. В журнале событий "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

Отправлено: 13:01, 13-12-2018

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


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
}

Последний раз редактировалось Kazun, 13-12-2018 в 15:06.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:01, 13-12-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 71
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:35, 05-09-2019 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:23, 06-09-2019 | #4


Пользователь


Сообщения: 71
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:56, 09-09-2019 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Скрипт блокировки неудачных попыток входа на сервер терминалов.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2012 R2 - [решено] Неизвестный источник попыток входа на сервер Candyman Windows Server 2012/2012 R2 7 05-12-2018 09:19
2008 R2 - Хитрое сохранение паролей входа на сервер терминалов TheMatrix Windows Server 2008/2008 R2 5 28-03-2012 17:26
[решено] Сервер терминалов и логон-скрипт mattveiko Microsoft Windows NT/2000/2003 4 22-07-2010 13:28
2008 R2 - сервер терминалов и шлюз терминалов на одной машине macchina Windows Server 2008/2008 R2 0 01-12-2009 12:27
[решено] Сервер терминалов, время не активного сеанса до блокировки экрана bool Microsoft Windows NT/2000/2003 3 25-04-2009 21:03




 
Переход