Сервер в кармане, или просто о сложном!

главная - Статьи - Mikrotik

Защита Mikrotik от брутфорса

Дата обновления: 04.03.2020

Теги: SSH Mikrotik

Брутфорс - это когда кто-то пытается, порой долго и упорно, подобрать наш пароль к чему-угодно методом перебора. В Linux для защиты от этого успешно используется fail2ban. В микротике такого удовольствия нет, поэтому мы будем иметь удовольствие создавать защиту от brutforce своими руками, т.е. будем блокировать по IP тех, кто пытается сканировать наш микротик.

Бан по IP

Буквально чуть-чуть оффтопа. Если мы хотим кого-то срезать, есть варианты действий: Reject или Drop.

Drop - как будто ничего вообще тут нет, коннект отваливается по таймауту. Если сканировать тем же nmap-ом защищенный таким образом порт, мы получим задержку порядка 2 секунд (ну, ок, просто задержку):

$ nmap -v -Pn -p 80 1.2.3.4
...
Host is up.
PORT   STATE    SERVICE
80/tcp filtered http

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.05 seconds

Reject делает моментальный сброс соединения, в ответ отправляется сообщение о сбросе, например, Port Unreachable. При этом сканирующий получает моментальный ответ, что порт ему закрыт:

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

Т.е. мы, с одной стороны, освободили свой микротик от висящего в ожидании отлупа по таймауту соединения, с другой - косвенно сообщили "злоумышленнику", что мы его запрос отловили и отклонили. Я не сталкивался с DDoS атаками, когда отправка Reject получается накладным в плане что мы сами устанем отправлять ответы.

Что выбрать вам - Drop или Reject - сказать трудно, это отдельный вопрос, но традиционно я использую Drop.

Наблюдаем и баним настойчивых

Полный листинг команд, который вы наверняка видели в официальной wiki (http://wiki.mikrotik.com/wiki/Bruteforce_login_prevention):

add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="drop ssh brute forcers" disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=10d comment="" 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="" 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="" 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

И в сети много где есть этот наборчик. Я просто чуть-чуть объясню, что он делает.

Идея такова: даем три легитимные попытки в течение короткого времени на коннект по ssh (22/tcp, если у вас другой порт - поставте свой). При четвертой попытке - баним на 10 дней. Имеем право. Итак, по шагам.

1. При установлении нового соединения (connection-state=new) с портом 22/tcp мы запоминаем ip источника и помещаем его в список "ssh_stage1" на 1 минуту:

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

2. Если в течение этой минуты этот "кто-то" (а его мы запомнили в "ssh_stage1") еще раз захочет установить новое соединение с 22/tcp, мы его добавим в список "ssh_stage2", и тоже на 1 минуту:

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="" disabled=no

3. Если в течение этой минуты этот "кто-то" (теперь он в "ssh_stage2") опять захочет соединиться с 22/tcp, мы его добавляем в список "ssh_stage3" (да, вы угадали, опять на 1 минуту):

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="" disabled=no

4. Если же он упорный, то что же, мы его на 10 дней добавим в наш "черный список" "ssh_blacklist", ибо нефиг.

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

5. А этой командой всех из списка "ssh_blacklist" баним без тени сомнения (обратите внимание, что правило по-умолчанию неактивно):

add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="drop ssh brute forcers" disabled=yes

В реальности, когда я сделал такую схему и попробовал соединиться из консоли Linux к внешнему ip моего mikrotik, уже со второй попытки (а не с 3 или 4) ip "злоумышленника" попал в список "ssh_blacklist". Я ssh к микротик не использую, поэтому в моем случае это не смертельно, но если вы в самом деле подключаетесь так удаленно, то сначала может быть неплохо не включать правило (disabled=yes), отвечающее за бан. В список пускай попадают, нет вопросов. Оцените на практике, сколько раз вам требуется подключаться подряд до попадания всписок бана. После проверок активируйте правило бана по списку "ssh_blacklist"! Прошу прощения, что команды длинные, но парсер съедает обратный слеш, так что приходится в одну строку.


Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?