MikroTik защита от брутфорса (Brute force)

MikroTik защита от брутфорса (Brute force)

В данной статье рассмотрим пример того, как настроить защиту от брутфорса (Brute force) на маршрутизаторе MikroTik. Для примера рассмотрим защиту для VPN (pptp, l2tp), ssh и ftp

 

 

 

 

Содержание

Введение

В последнее время всё чаще встречаемся с брутфорсом (Brute force - метод взлома учетных записей посредствам подбора паролей к ним).  Чаще всего атака идет на стандартные сервисы и, соответственно, стандартные порты. Например:

  • SSH - TCP 22 port
  • PPTP - TCP 1723 port, GRE (не имеет порт)
  • L2TP - UDP 1701, 4500, 500 ports
  • RDP - TCP 3389 port
  • VNC - TCP 5900 port

Если вы используете сложные пароли, то подобрать их будет нелегко. Поэтому основная проблема, которая возникает при брутфорсе, это падение скорости сети. Часто это именно "скорость интернета". На входящий интерфейс маршрутизатора поступает большое количество пакетов с высокой скоростью, канал забивается, и "полезные" пакеты проходят с меньшей скоростью, чем хотелось бы.
Также стоит отметить, что многие серверы и маршрутизаторы ведут логи попыток авторизации. Если этих попыток тысячи, то размер логов может достигать нескольких десятков гигабайт. Это приводит к повышенной нагрузке на дисковую подсистему и быстрому расходу места.

В данной статье расскажем о том, как обезопасить себя от брутфорс (Brute force) - атак, используя маршрутизатор MikroTik.

Описание тестового стенда

  • Маршрутизатор Mikrotik
  • RouteOS 6.48.2
  • На маршрутизаторе открыт ssh и vpn-сервер(PPTP)

План работ. Краткое описание действий

Действовать будем так, как нам говорит официальная документация, но с небольшими правками и дополнениями.

Для защиты от брутфорс-атаки на SSH - TCP 22 port и PPTP - TCP 1723 port (для примера взяты стандартные порты) будем блокировать ip-адреса всех, кто попытается установить четыре соединения подряд с интервалом меньше одной минуты.

Реализуем это следующим образом:

  • При первом подключении по SSH добавляем ip-адрес в список ssh_stage1, если менее чем через одну минуту приходит ещё один запрос на подключение, добавляем в список ssh_stage2 и т.д. После списка ssh_stage3 идет список blacklist
  • Для подключений по PPTP такая же логика, только меняем название списков на pptp_stage1 - pptp_stage3
  • Для списка ip-адресов blacklist создадим правило блокировки в Firewall

Правила защиты от брутфорс - атак на SSH и PPTP

Как и говорилось выше, блокировать будем ip - адреса, с которых было четыре запроса на соединение с интервалом менее одной минуты.

Для этого создадим: 

  • по 4 правила в IP-Firewall-Filter для SSH и для PPTP, которые будут добавлять ip-адреса для блокировки в список blacklist
  • правило блокировки в для всех ip-адресов из списка blacklist

Правила для SSH

/ip firewall filter

add chain=input protocol=tcp dst-port=22 connection-state=new \
src-address-list=ssh_stage3 action=add-src-to-address-list address-list=blacklist \
address-list-timeout=10d comment="blacklist" disabled=no

add chain=input protocol=tcp dst-port=22 connection-state=new \
src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 \
address-list-timeout=1m comment="ssh-stage3" disabled=no

add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage1 \
action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=1m comment="ssh-stage2" disabled=no

add chain=input protocol=tcp dst-port=22 connection-state=new action=add-src-to-address-list \
address-list=ssh_stage1 address-list-timeout=1m comment="" disabled=no

Правила для PPTP

/ip firewall filter

add chain=input protocol=tcp dst-port=1723 connection-state=new \
src-address-list=pptp_stage3 action=add-src-to-address-list address-list=blacklist \
address-list-timeout=10d comment="blacklist" disabled=no

add chain=input protocol=tcp dst-port=1723 connection-state=new \
src-address-list=pptp_stage2 action=add-src-to-address-list address-list=pptp_stage3 \
address-list-timeout=1m comment="pptp-stage3" disabled=no

add chain=input protocol=tcp dst-port=1723 connection-state=new src-address-list=pptp_stage1 \
action=add-src-to-address-list address-list=pptp_stage2 address-list-timeout=1m comment="pptp-stage2" disabled=no

add chain=input protocol=tcp dst-port=1723 connection-state=new action=add-src-to-address-list \
address-list=pptp_stage1 address-list-timeout=1m comment="" disabled=no

правило для блокировки ip-адресов из списка "blacklist"

/ip firewall raw
add chain=prerouting src-address-list=blacklist action=drop \
comment="drop brute forcers" disabled=no

 Детальное описание правил

Для понимания детально рассмотрим каждую строку правил для SSH и правило блокировки ip-адерсов из списка "blacklist".
Начнём с привил для SSH. Строки будем рассматривать с конца. Начнем с четвертой.

строка 4

add chain=input protocol=tcp dst-port=22 connection-state=new action=add-src-to-address-list \
address-list=ssh_stage1 address-list-timeout=1m comment="" disabled=no

Этой строкой "говорим" микротику добавить на одну минуту (address-list-timeout=1m) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=ssh_stage1)

строка 3

add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage1 \
action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=1m comment="ssh-stage2" disabled=no

Этой строкой "говорим" микротику добавить на одну минуту (address-list-timeout=1m) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=ssh_stage2), если этот ip-адрес уже находится в списке ssh_stage1 (src-address-list=ssh_stage1)

Аналогично добавляем в список ssh_stage3 - строка 2

строка 1

add chain=input protocol=tcp dst-port=22 connection-state=new \
src-address-list=ssh_stage3 action=add-src-to-address-list address-list=blacklist \
address-list-timeout=10d comment="blacklist" disabled=no

Этой строкой "говорим" микротику добавить на десять дней (address-list-timeout=10d) ip-адрес нового соединения (connection-state=new), поступившего на порт 22 TCP (protocol=tcp dst-port=22) в адрес-лист  (address-list=blacklist), если этот ip-адрес уже находится в списке ssh_stage3 (src-address-list=ssh_stage3)

Блокировка ip-адресов из списка "blacklist"

/ip firewall raw
add chain=prerouting src-address-list=blacklist action=drop \
comment="drop brute forcers" disabled=no

После того как мы создали правила заполнения списка "blacklist", нужно добавить правило блокировки всех ip-адресов, входящих в него. Для этого нужно правильно выбрать цепочку, в которой будем осуществлять блокировку, и вид блокировки. 

Цепочку предлагаю выбрать PREROUTING. Обратите внимание, что есть RAW PREROUTING и MANGLE PREROUTING.  В нашем случае используется RAW PREROUTING, так как эта обработка идет первой. Это позволит снизить нагрузку на процессор.
В официальной документации предлагают делать правило в цепочке INPUT. Возможно, это сделано для того, чтобы было удобней управлять правилами в разделе "IP-Firewall-Filter Rules".

Вид блокировки. Что выбрать DROP или REJECT?

Для того, чтобы выбрать, нужно понимать разницу между drop и reject.

  • reject - отбросить пакет и отправить ICMP сообщение об отклонении
  • drop - просто отбрасывает пакет

В сети давно идет холивар на тему что лучше. Выбор зависит от того, какие задачи нужно решить и от чего защититься.

В нашем примере будем использовать Drop, это позволит снизить нагрузку на процессор и уменьшить исходящий трафик, так как маршрутизатор не будет отправлять ответ (как при reject), а просто сбрасывать соединение.

Обратите внимание, что  есть RAW PREROUTING и MANGLE PREROUTING.  В нашем случае используется RAW PREROUTING, так как эта обработка идет первой.