Часто бывает, что нет возможности настроить подключение по VPN для пользователей, и часто RDP пробрасывается наружу.. Кто-то даже не меняет порт, что в свою очередь пагубно отражается на безопасности всей сети. В лучшем случае плохие люди просто изменят и удалят то, до чего смогут дотянуться, в худшем - ваши файлы будут зашифрованы, и у вас попросят немного денег (а может и много, тут уже не важно).
Для защиты удаленного доступа от несанкционированного доступа можно использовать простое решение - динамические адресные списки (Address Lists). Логика следующая:
- Пользователь (либо не пользователь) подключается по проброшенному для RDP порту
- Создается первая динамическая запись с IP источника в адресных списках. При повторных попытках входа - создается вторая, третья и так далее.
- Как только будет достигнут лимит, который нами указан - IP попадает в список забаненных, например на сутки.
Выглядит просто, давайте начнем реализовывать. Все примеры будут в формате winbox, если есть необходимость - пишите, опишу как это делается консольно более подробно, так-же в конце статьи будет готовый скрипт для создания необходимых правил.
Для начала переходим в раздел Firewall, все что нам требуется будет производиться только тут.
Фиксация попыток входа, правило первое
Первым шагом в нашей защите будет фиксация попыток входа на RDP. Создаем правило, которое будет фиксировать такие попытки:
Вкладка General
- Chain: forward
- Protocol: tcp
- Dst. Port: 3389 - тут важно заметить, что указывается именно порт, на который производится проброс, а не тот, который открыт на внешнем интерфейсе. Например если у вас наружу открыт порт 15422, и в нате идет проброс на 3389 - надо указывать 3389.
- In.Interface: внешнее подключение, на которое проброшен порт
- Connection State: выбираем new
Вкладка Action
Action: jump (переход)
Jump Target: RDPCheck - название нашего следующего правила
Фиксация попыток входа, правило второе
Получаем данные от первого правила, начинаем создание первой динамической записи.
Создаем правило в цепочке:
Вкладка General
- Chain: RDPCheck (из предыдущего правила)
Вкладка Action
- Action: add src to address list (добавляем источник в список)
- Address List: RDPCheck_Step1 - первый список
- Timeout: 00:30:00 - добавляем на 30 минут
Фиксация попыток входа, правило третье и так далее
Получаем данные от первого правила цепочки, начинаем создание первой динамической записи.
Создаем последующие правила в цепочке:
Вкладка General
- Chain: RDPCheck (из предыдущего правила)
Вкладка Advanced
- Src. Address List: RDPCheck_Spep1 (проверяем наличие IP в уже созданных списках, номер шага = N-1, другими словами тот список, который создан в предыдущем правиле)
Вкладка Action
- Action: add src to address list (добавляем источник в список)
- Address List: RDPCheck_Step2 - N-й список
- Timeout: 00:30:00 - добавляем на 30 минут
Так как при подключении может создаваться несколько подключений со статусом "new", рекомендую создать не менее 7-9 шагов.
На последнем шаге - заносим адрес в список без указания шагов и ставим таймаут 24 часа.
Последнее правило для перебора всех звеньев в цепочке
Вкладка General
- Chain: RDPCheck (из предыдущего правила)
Вкладка Action
- Action: return
Заключительное правило - блокировка
Вкладка General
- Chain: forward
Вкладка Advanced
- Src. Address List: RDPCheck_Spep7 (наш последний динамический список)
Вкладка Action
- Action: drop
Данное правило необходимо поднять как можно выше, оно должно стоять перед разрешающими правилами.
Резюме
Теперь все, кто пытался войти и не смог зайти по причине ошибочного ввода пароля после 2-3 попыток - блокируются на 24 часа. КОнечно время вы можете указать самостоятельно.
Для разблокировки, необходимо удалить IP иp списка "Address Lists"
Консольные команды:
Сразу исправьте интерфейс, используемый для выхода в интернет
/ip firewall filter
add action=drop chain=forward src-address-list=RDPCheck
add action=jump chain=forward connection-state=new dst-port=3389 in-interface=ether5 jump-target=RDPCheck protocol=tcp
add action=add-src-to-address-list address-list=RDPCheck_Step1 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step1
add action=add-dst-to-address-list address-list=RDPCheck_Step2 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step2 src-address-list=RDPCheck_Step1
add action=add-dst-to-address-list address-list=RDPCheck_Step3 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step3 src-address-list=RDPCheck_Step2
add action=add-dst-to-address-list address-list=RDPCheck_Step4 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step4 src-address-list=RDPCheck_Step3
add action=add-dst-to-address-list address-list=RDPCheck_Step5 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step5 src-address-list=RDPCheck_Step4
add action=add-dst-to-address-list address-list=RDPCheck_Step6 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step6 src-address-list=RDPCheck_Step5
add action=add-dst-to-address-list address-list=RDPCheck_Step7 address-list-timeout=30m chain=RDPCheck comment=DRPCheck_Step7 src-address-list=RDPCheck_Step6
add action=add-dst-to-address-list address-list=RDPCheck address-list-timeout=1d chain=RDPCheck comment=DRPCheck_BLOCK src-address-list=RDPCheck_Step7
add action=return chain=RDPCheck