Закрываем роутер от атак BruteForce на Mikrotik
Очень часто в логах, мы можем наблюдать безуспешные попытки подбора пароля через стандартную утилиту Winbox, либо не удавшиеся попытки подключения например на ваш l2tp сервер.
Winbox — это самый популярный метод управлениями устройствами Mikrotik и поэтому он достаточно популярен у взломщиков, поэтому наша задача определить попытки неверного ввода паролей и после нескольких попыток заблокировать атакующего. На мой взгляд пользователю достаточно дать три попытки в течении одной минуты, это вполне укладывается в логику работы авторизации пользователя, который после безуспешной попытки будет проверять раскладку, сверяться с записями, а не будет тупо долбиться. Если же попытки войти происходят чаще, то перед нами скорее всего атакующий.
Как определить неверный ввод пароля? Достаточно просто, в ответном пакете роутер сообщит открытым текстом: ( invalid user name or password )
А получатель такого пакета будет являться предметом нашего повышенного интереса. Но прежде всего попробуем отследить само событие, для этого откроем IP — Firewall — Mangle и создадим правило: Chain — output, Protocol — tcp, Src.Port — 8291.
Затем на закладке Advanced добавим критерий: Content — invalid user name or password.
А на закладке Action укажем действие jump и в поле Jump Target укажем имя пользовательской цепочки, в нашем случае FB-WB (Fail2Ban Winbox).
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=jump chain=output content=«invalid user name or password» jump-target=FB-WB protocol=tcp src-port=8291
Что у нас получается? А очень просто! Прежде всего мы выделили ответные пакеты роутера с сообщением об ошибке учетных данных и направили их в собственную цепочку брандмауэра. Это позволит далее работать с ними, персонально не проверяя каждый раз соответствие критерию наличия текста ошибки. Также это исключает прохождение по правилам цепочки других пакетов, что положительно сказывается на производительности.
Далее интереснее: начнем создавать правила для нашей цепочки и будем делать это от конца к началу. Для этого мы будем использовать несколько списков адресов и на основании повторения адреса в списках принимать решение о блокировке. Легальный пользователь будет иметь три попытки в течении минуты.
Там же, в IP — Firewall — Mangle, создадим правило: Chain — FB-WB. На закладке Advanced указываем Dst. Address List — FB-WB-3, а в Action — add dst to address list, Address List — FB-WB-BAN, Timeout — 1d 00:00:00.
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=add-dst-to-address-list address-list=FB-WB-BAN address-list-timeout=1d chain=FB-WB dst-address-list=FB-WB-3
Что у нас получается? Данным правилом мы проанализировали адрес назначения ответного пакета роутера и если он есть в списке FB-WB-3, т.е. успел три раза вести неверный пароль, то отправляем его в список FB-WB-BAN сроком на одни сутки.
После чего подобным образом создадим правила на заполнение остальных списков. Так если адрес есть в списке FB-WB-2, то добавляем его в список FB-WB-3 на одну минуту, если адрес есть в FB-WB-1, то добавляем его на минуту в FB-WB-2, а если его нет ни в одном списке, то добавим в FB-WB-1 тоже на одну минуту:
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=add-dst-to-address-list address-list=FB-WB-3 address-list-timeout=1m chain=FB-WB dst-address-list=FB-WB-2
add action=add-dst-to-address-list address-list=FB-WB-2 address-list-timeout=1m chain=FB-WB dst-address-list=FB-WB-1
add action=add-dst-to-address-list address-list=FB-WB-1 address-list-timeout=1m chain=FB-WB
Попробуем проверить правильность работы: для этого несколько раз пытаемся указать неверные учетные данные и наблюдаем как адрес атакующего последовательно заполняет списки от FB-WB-1 до FB-WB-BAN.
А далее еще интереснее…
Теперь дело за малым — заблокировать атакующих. Для этого переходим в IP — Firewall — Raw и создаем правило: Chain — Prerouting. Затем на закладке Advanced добавляем Src. Address List — FB-WB-BAN и на закладке Action указываем действие drop.
Вот так можно это все реализовать в терминале:
/ip firewall raw
add action=drop chain=prerouting src-address-list=FB-WB-BAN
Таким образом любой, кто более трех раз за минуту введет неверные учетные данные будет заблокирован на одни сутки. Временные лимиты указаны для примера, можете менять их на собственное усмотрение.
Защита WebFig от BruteForce:
Анализировать мы также будем ответы роутера с порта веб-сервера (80 TCP), в случае неверных учетных данных RouterOS 6 отвечает сообщением:
403 Forbidden
А RouterOS 7:
Error 403
А далее все как в предыдущем варианте. Прежде всего отправим все пакеты с нужным ответом в отдельную пользовательскую цепочку FB-WEB:
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=jump chain=output content="403 Forbidden" jump-target=FB-WEB protocol=tcp src-port=80
А затем начнем заполнять списки адресов, точно также, от конца к началу. Для каждого адреса проверяется наличие в списке и если оно подтверждается он попадает в вышестоящий список. Три списка FB-WEB-1 — FB-WEB-3 заполняются на одну минуту и дают возможность легальному пользователю совершить три ошибки. Четвертый список FB-WEB-BAN предназначен для блокировки и срок нахождения в нем адресов — одни сутки.
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=add-dst-to-address-list address-list=FB-WEB-BAN address-list-timeout=1d chain=FB-WEB dst-address-list=FB-WEB-3
add action=add-dst-to-address-list address-list=FB-WEB-3 address-list-timeout=1m chain=FB-WEB dst-address-list=FB-WEB-2
add action=add-dst-to-address-list address-list=FB-WEB-2 address-list-timeout=1m chain=FB-WEB dst-address-list=FB-WEB-1
add action=add-dst-to-address-list address-list=FB-WEB-1 address-list-timeout=1m chain=FB-WEB
После чего блокируем атакующих в таблице Raw:
Вот так можно это все реализовать в терминале:
/ip firewall raw
add action=drop chain=prerouting src-address-list=FB-WEB-BAN
Время нахождения в списках и количество попыток вы можете регулировать на свое усмотрение.
Защита WebFig SSL от BruteForce
А вот здесь у нас задача посложнее, при включении SSL защиты мы не можем анализировать содержимое ответного пакета и нам нужно найти какой-либо иной критерий, который бы указывал на попытку подбора паролей. В ходе наших исследований, эмпирическим путем было установлено, что в качестве критерия можно использовать размер ответного пакета, который составляет 317 байт для RouterOS 6 и 378 байт для RouterOS 7.
Важно! Данные цифры не являются официальными, а получены экспериментальным путем и в будущем могут иметь иные значения!
В остальном принцип защиты остается тем же, прежде всего направим соответствующие критерию пакеты в отдельную пользовательскую цепочку, только используем порт источника 443 и критерий на вкладке Advanced вместо Content должен быть Packet Size:
Вот так можно это все реализовать в терминале:
/ip firewall mangle
add action=jump chain=output jump-target=FB-SSL packet-size=317 protocol=tcp src-port=443
Далее точно также заполняем четыре таблицы:
/ip firewall mangle
add action=add-dst-to-address-list address-list=FB-SSL-BAN address-list-timeout=1d chain=FB-SSL dst-address-list=FB-SSL-3
add action=add-dst-to-address-list address-list=FB-SSL-3 address-list-timeout=1m chain=FB-SSL dst-address-list=FB-SSL-2
add action=add-dst-to-address-list address-list=FB-SSL-2 address-list-timeout=1m chain=FB-SSL dst-address-list=FB-SSL-1
add action=add-dst-to-address-list address-list=FB-SSL-1 address-list-timeout=1m chain=FB-SSL
А затем всех тех, кто добрался до последней таблицы блокируем в таблице Raw:
/ip firewall raw
add action=drop chain=prerouting src-address-list=FB-SSL-BAN
Готово! Вы закрыли свой роутер. Можно виду изменять правила и затачивать под себя, но основная логика понятна.
Далее про l2tp — защита роутера Mikrotik от «брутфорса» VPN туннеля
Иногда нужно защитить свой роутер VPN туннеля. Если с SSH это решается защитой от «брутфорса» по новым соединениям то с L2TP это не подойдет, так как обмен сообщениями идет в рамках одной сессии. И с точки зрения роутера устанавливается только одно соединение (после неправильного пароля связь не обрывается).
Начинаем резать не правомерный доступ:
Этим правилом режем коннекты «не сознательных» госпадамов, после чего строим защиту:
Вот так можно это все реализовать в терминале:
/ip
firewall filter
add action=reject chain=input src-address-list=black
Получается: если action=drop то пакеты по тихому дропаются.
если action=reject (оно по дефолту будет отправлять сообщение icmp network unreachable) то комп атакующего будет получать сообщение что данная сеть недоступна. Разница в том что при drop отправитель ничего не будет знать о судьбе пакетов и будет продолжать их слать,
а при reject его устройство получит уведомление что сеть недоступна и возможно перестанет отправлять нам пакеты.
Но reject больше грузит процессор роутетра. Поэтому нужно в каждом отдельном случае решать, что будет лучше с точки зрения нагрузки на роутер
Вот так можно это все реализовать в терминале:
/ip
firewall filter
add action=add-dst-to-address-list address-list=black chain=output content=”M=bad” dst-address-list=level2
add action=add-dst-to-address-list address-list=level2 address-list-timeout=1m chain=output content=”M=bad” dst-address-list=level1
add action=add-dst-to-address-list address-list=level1 address-list-timeout=1m chain=output content=”M=bad”
Количество уровней выберете сами, 2-3 самое оптимальное число. что бы и себя не вогнать в бан если случайно 2 раза ошиблись.