Сценарій ремуди за редакцією kevinmicke (7 лютого о 21:59) не перевірив канал управління FTP, який має власну папку в моїй системі (Windows Server 2008 R2). Також 530 11001
не було розпізнано події, які, здається, з’являються, коли хакер намагається отримати доступ до каналу управління. Тому я додав рядки до сценарію, щоб перевірити другу FTP-журнал-папку:
# Цей скрипт Powershell для Windows автоматично блокує IP-адреси, які намагаються увійти в систему
# і не вдасться встановити кількість разів, вказану нижче, зі змінною $ int_block_limit або більше. Проводить сканування як безпеки
# журнал, який охоплює віддалений робочий стіл та інші спроби, а також журнал FTP поточного дня. Якщо $ int_block_limit
# ліміт встановлено в будь-якому з цих журналів (окремо, не комбіновано), тоді IP-адресу буде додано до
# правило брандмауера.
#
# Сценарій автоматично створить правило брандмауера під назвою "BlockAttackers (Створено yyyy-MM-dd HH: mm: ss UTC)" за допомогою
# поточний час, якщо одна з назвою, що включає "BlockAttackers", ще не існує. Бо там важко
# ліміт 1000 записів (IP-адреси), які ви можете заблокувати за правило, воно також створить однаково названі правила, як тільки це
# ліміт досягнуто для останнього.
#
# Я рекомендую встановити сценарій для виконання як запланованого завдання, ініційованого помилками аудиту входу 4625 з події
# Журнал безпеки, або ви можете встановити його запуск через деякий час (тобто кожні 10 хвилин).
#
# Автори:
# Більшість сценаріїв, написаних користувачем serverfault.com kevinmicke
# Частина журналу безпеки Windows, написана користувачем remunda сервера defaultfault, яка послужила початковою точкою для кевінміке
# Перевірка каналу управління FTP, який додав користувач serverfault.com Uwe Martens
#
# Деталі: https://serverfault.com/questions/233222/ban-ip-address-based-on-x-number-of-unsuccessful-login-attempts
# Встановіть кількість невдалих спроб входу, після чого IP-адресу буде заблоковано
$ int_block_limit = 3
# Вікно часу, протягом якого слід перевірити журнал безпеки, який наразі встановлено для перевірки лише протягом останніх 24 годин
$ dat_time_window = [DateTime] :: Now.AddDays (-1)
# Виберіть з журналу безпеки всі IP-адреси, у яких більше $ int_block_limit збоїв аудиту (подія 4625) протягом $ dat_time_window
$ arr_new_bad_ips_security_log = @ ()
$ arr_new_bad_ips_security_log = Get-EventLog -LogName 'Security' -InstanceId 4625 -Після $ dat_time_window |
Select-Object @ {n = 'IpAddress'; e = {$ _. ReplacementStrings [-2]}} |
Group-Object -властивість IpAddress |
Де {$ _. Розрахунок -ge $ int_block_limit} |
Виберіть -ім'я власності
# Отримайте поточний час UTC, щоб визначити ім'я файлу для поточного журналу FTP
$ current_date_utc = (Дата отримання) .ToUniversalTime ()
# Встановити шлях до сьогоднішнього файлу журналу FTP Control Channel
$ str_log_file_name_control_channel = "C: \ inetpub \ logs \ LogFiles \ FTPSVC \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"
# Шукайте сьогоднішній файл журналу каналу управління FTP на "530 1", щоб знайти рядки, що містять IP-адреси систем, які не вдалося ввійти,
# отримайте тільки IP з кожного рядка, згрупуйте IP-адреси за IP-адресою, щоб підрахувати спроби кожного та виберіть лише те
# IP-адреси, які мають $ int_block_limit або більше поганих входів сьогодні
$ arr_new_bad_ips_ftp_control_channel = @ ()
$ arr_new_bad_ips_ftp_control_channel = Select-String $ str_log_file_name_control_channel -pattern "530 1" |
ForEach-Object {$ _. Line.Substring (20,15) -замінити ". *", ""} |
Група |
Де {$ _. Розрахунок -ge $ int_block_limit} |
Виберіть -ім'я власності
# Встановити шлях до сьогоднішнього файлу журналу FTP
$ str_log_file_name = "C: \ inetpub \ logs \ LogFiles \ FTPSVC * \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"
# Шукайте в сьогоднішньому файлі журналу FTP "530 1", щоб знайти рядки, що містять IP-адреси систем, які не змогли увійти,
# отримайте тільки IP з кожного рядка, згрупуйте IP-адреси за IP-адресою, щоб підрахувати спроби кожного та виберіть лише те
# IP-адреси, які мають $ int_block_limit або більше поганих входів сьогодні
# У FTPSVC * слід додати ідентифікатор FTP-сервера замість *, або просто взяти потрібну папку журналу
$ arr_new_bad_ips_ftp = @ ()
$ arr_new_bad_ips_ftp = Select-String $ str_log_file_name -pattern "530 1" |
ForEach-Object {$ _. Line.Substring (20,15) -замінити ". *", ""} |
Група |
Де {$ _. Розрахунок -ge $ int_block_limit} |
Виберіть -ім'я власності
# Об'єднайте два масиви IP-адрес (один з журналу безпеки, один з журналу FTP)
$ arr_new_bad_ips_all = @ ()
# $ arr_new_bad_ips_all = @ ($ arr_new_bad_ips_security_log) + @ ($ arr_new_bad_ips_ftp_over_limit)
$ arr_new_bad_ips_all = @ ($ arr_new_bad_ips_security_log) + @ ($ arr_new_bad_ips_ftp_control_channel) + @ ($ arr_new_bad_ips_ftp)
# Сортуйте масив, вибираючи лише унікальні IP-адреси (у випадку, коли один IP-адрес відображається в журналах безпеки та FTP)
$ arr_new_bad_ips_all_sorted = @ ()
$ arr_new_bad_ips_all_sorted = $ arr_new_bad_ips_all |
Foreach-Object {[рядок] $ _. Ім'я} |
Вибрати-Об'єкт -уніке
# Отримати об’єкт брандмауера
$ firewall = New-Object -comobject hnetcfg.fwpolicy2
# Отримати всі правила брандмауера, що відповідають "BlockAttackers *"
$ arr_firewall_rules = $ firewall.Правила | Де {$ _. Ім'я, схоже на "BlockAttackers *"}
# Якщо ще немає правила брандмауера "BlockAttackers *", створіть його та встановіть його змінну
if ($ arr_firewall_rules -eq $ null) {
$ str_new_rule_name = "BlockAttackers (Створено" + $ current_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
netsh advfirewall брандмауер додати правило dir = в дії = ім'я блоку = $ str_new_rule_name description = "Правило створено автоматично." enable = так remoteip = "0.0.0.0" | Зовнішнє
$ arr_firewall_rules = $ firewall.Правила | Де {$ _. Ім'я, схоже на "BlockAttackers *"}
}
# Розділіть існуючі IP-адреси з поточних правил брандмауера "BlockAttackers *" на масив, щоб ми могли їх легко шукати
$ arr_existing_bad_ips = @ ()
foreach ($ правило в $ arr_firewall_rules) {
$ arr_existing_bad_ips + = $ rule.RemoteAddresses -split (',')
}
# Очистити маску підмережі з IP-адрес, які в даний час заблоковані правилами брандмауера
$ arr_existing_bad_ips_without_masks = @ ()
$ arr_existing_bad_ips_without_masks = $ arr_existing_bad_ips | ForEach-Object {$ _ -replace "/.*", ""}
# Введіть IP-адресу вашого сервера (IPv4 та IPv6) у рядки 115 та 116.
# Виберіть IP-адреси, які потрібно додати до брандмауера, але лише ті, які ...
$ arr_new_bad_ips_for_firewall = @ ()
$ arr_new_bad_ips_for_firewall = $ arr_new_bad_ips_all_sorted | Де {
# містять IP-адресу (тобто не пусті або тире, яке має журнал безпеки для систем, які не вдалося ввійти через FTP)
$ _. Довжина -gt 6 -і
# ще не містять правил брандмауера
! ($ arr_existing_bad_ips_without_masks-містить $ _) -і
# не є локальною петлею
! ($ _. StartsWith ('127.0.0.1')) -і
# не входять до локальної підмережі
! ($ _. ПочинаєWith ('192.168.')) -І
! ($ _. ПочинаєWith ('0,0.')) -І
! ($ _. ПочинаєWith ('10 .0. ')) -І
! ($ _. ПочинаєWith ('*. *. *. *')) -І
! ($ _. ПочинаєWith ('*: *: *: *: *: *'))
}
# Якщо є IP-адреси для блокування, виконайте наступні дії ...
if ($ arr_new_bad_ips_for_firewall -ne $ null) {
# Запишіть дату та час у специфічний для сценарію файл журналу
[DateTime] :: Зараз | Out-File -Append -Encoding utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
# Запишіть щойно заблоковані IP-адреси у файл журналу
$ arr_new_bad_ips_for_firewall | Out-File -Append -Encoding utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
# Булевий, щоб переконатися, що нові IP-адреси додаються лише за одним правилом
$ bln_added_to_rule = 0
# Масив для зберігання поганих IP-адрес від кожного правила по одному, тому ми можемо розраховувати, що додавання нових не перевищить 1000 IP-адрес
$ arr_existing_bad_ips_current_rule = @ ()
# Для кожного правила "BlockAttackers *" у брандмауері виконайте наступне ...
foreach ($ правило в $ arr_firewall_rules) {
if ($ bln_added_to_rule -ne 1) {
# Розділіть існуючі IP-адреси з поточного правила на масив, щоб ми могли їх легко порахувати
$ arr_existing_bad_ips_current_rule = $ rule.RemoteAddresses -split (',')
# Якщо кількість IP-адрес для додавання менше 1000 мінус поточна кількість IP-адрес у праві, додайте їх до цього правила
if ($ arr_new_bad_ips_for_firewall.Count -le (1000 - $ arr_existing_bad_ips_current_rule.Count)) {
# Додати нові IP-адреси до правила брандмауера
$ arr_new_bad_ips_for_firewall | % {$ rule.RemoteAddresses + = ',' + $ _}
# Напишіть, яке правило IP-файлів було додано до файлу журналу
echo "Нові IP-адреси, додані вище до правила брандмауера Windows:" $ rule.Name | Out-File -Append -Encoding utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
# Встановити булевий, щоб будь-які інші правила були пропущені при додаванні IP-адрес
$ bln_added_to_rule = 1
}
}
}
# Якщо в іншому правилі брандмауера "BlockAttackers *" не було місця, створіть нове та додайте до нього IP-адреси
if ($ bln_added_to_rule -ne 1) {
$ str_new_rule_name = "BlockAttackers (Створено" + $ current_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
netsh advfirewall брандмауер додати правило dir = в дії = ім'я блоку = $ str_new_rule_name description = "Правило створено автоматично." enable = так remoteip = "0.0.0.0" | Зовнішнє
$ new_rule = $ firewall.rules | Де {$ _. Ім'я -eq $ str_new_rule_name}
# Додати нові IP-адреси до правила брандмауера
$ arr_new_bad_ips_for_firewall | % {$ new_rule.RemoteAddresses + = ',' + $ _}
# Напишіть, яке правило IP-файлів було додано до файлу журналу
echo "Нові IP-адреси, додані вище, до новоствореного правила брандмауера Windows:" $ new_rule.Name |. " Out-File -Append -Encoding utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
}
}
Назва папки журналу FTP у FTPSVC*
рядку 54 має бути заповнена причиною. У рядках 115 та 116 потрібно ввести IP вашого сервера (IPv4 та IPv6), інакше IP-адреси власних серверів можуть бути додані до правила брандмауера сто разів. Змінна, $int_block_limit
яку я встановлюю на своєму сервері 1, тому сценарій блокує атаку хакерів, що викликає подію 4625 протягом двох секунд. Я все ще думаю про запуск сценарію додатково до 4625 подій у проміжок часу в кілька хвилин. Зважаючи на це, також можна було б відокремити сценарії та дозволити одному скрипту перевірити 4625 події, викликані подіями 4625, а іншим - папки журналів FTP періодично перевіряючи кожні 5 чи 10 хвилин, навіть з окремим правилом брандмауера. і журнал-файл.