среда, 5 октября 2016 г.

Защищаем сервер FTP за Mikrotik анализируя пакеты опцией "content".

  Недавно в статье "Защита WAN-интерфейса в Mikrotik" я рассказывал как защитить наше устройство и минимизировать атаки из-вне. Но почти во всех конфигурациях мы используем пробросы портов для предоставления сервисов нашим клиентам или для личного пользования. Пробросив порт, защиту мы возлагаем на наш внутренний сервис. Но Mikrotik довольно универсально устройство, которое позволяем защитить даже наши внутренние сервисы, к которым мы можем подключиться из-вне. В текущей статье, на примере FTP-сервера, я покажу вариант такой реализации.
  Имеем FTP-сервер Serv-U File Server, на который проброшен порт 21 с WAN-интерфейсов (их 2) Mikrotik. Сразу скажу, я никогда не использую дефолтный порт, так как это небезопасно, но для примера подойдет.
  Правило проброса порта:
/ip firewall nat
add action=dst-nat chain=dstnat comment=ftp dst-address-list=wan dst-port=21 protocol=tcp to-addresses=10.2.0.7
  Где "wan" - адрес лист наших wan-интерфейсов (их два, с обоих сервер доступен), 10.2.0.7 - адрес нашего ftp-сервера.
  После этого мы попробуем защитить ftp от перебора паролей. Для этого воспользуемся опцией "content" в правилах /ip firewall. Эта опция позволяет проанализировать пакеты которые входят\проходят\выходят из маршрутизатора и найти текстовые соответствия в этих пакетах - если соответствие найдено - выполняется определенное действие.


  Для того, что-бы понять, какое сообщение нам пишет наш ftp сервер при неправильном пароле нужно к нему подключиться, например, через telnet-клиент. Для того, что-бы использовать встроенный в Windows 7 клиент предварительно его нужно включить в "панель управления - программы и компоненты - включение и отключение компонентов windows"


  После включение запускаем командную строку и подключаемся к нашему серверу.


За красным прямоугольником - домен нашего сервера, за ним порт. Типичное подключение к ftp выглядит так:
# telnet 192.168.1.3 21
> 220 Welcome!
> USER ftp
> 331 Password required for ftp
> PASS ftp
> 230 Logged on
> PASV
> 227 Entering Passive Mode (192,168,1,3,195,109)
> LIST
После приглашения пытаемся авторизироваться. Вводим логин, после проверки вводим НЕПРАВИЛЬНЫЙ пароль.


    Как видим на неправильный пароль наш сервер отвечает сообщением "530 Not logged in.". Его мы и будет ловить.
  Есть два варианта реализации идеи. Через "прыжки" по адрес-листам и через лимиты соединений. 

  Первый вариант:


    Правила имеют очередность. В них используется "/interface list", который введен с версии RouterOS 6.36.
  Правило блокирует все соединения на 21 порт с адрес-листа ftp_blacklist с двух WAN интерфейсов.
/ ip firewall filter
add action=drop chain=forward comment="drop ftp brute forcers" dst-port=21 in-interface-list=wan protocol=tcp src-address-list=ftp_blacklist
  Правило добавляет злоумышленника в черный список (ftp_blacklist) после четвертой попытки входа в течении одной минуты.
/ ip firewall filter
add action=add-dst-to-address-list address-list=ftp_blacklist address-list-timeout=1w chain=forward comment="auto-firewall ftp - stage 5" content="530 Not logged in." dst-address-list=ftp_stage4
  Третья попытка входа за минуту.
/ ip firewall filter
add action=add-dst-to-address-list address-list=ftp_stage4 address-list-timeout=1m chain=forward comment="auto-firewall ftp - stage 4" content="530 Not logged in." dst-address-list=ftp_stage3
  Вторая попытка (в течении одной минуты).
/ ip firewall filter
add action=add-dst-to-address-list address-list=ftp_stage3 address-list-timeout=1m chain=forward comment="auto-firewall ftp - stage 3" content="530 Not logged in." dst-address-list=ftp_stage2
  Первая попытка входа (в течении одной минуты).
/ ip firewall filter
add action=add-dst-to-address-list address-list=ftp_stage2 address-list-timeout=1m chain=forward comment="auto-firewall ftp - stage 2" content="530 Not logged in." dst-address-list=ftp_stage1
  Начальный вход на ftp.
/ ip firewall filter
add action=add-src-to-address-list address-list=ftp_stage1 address-list-timeout=1m chain=forward comment="auto-firewall ftp - stage 1" dst-port=21 in-interface-list=wan protocol=tcp
  Объяснение снизу-вверх. Начальная стадия (стадия 1) добавляет IP-адрес в список адресов ftp_stage1 (с таймаутом 1 минута). И после каждой попытки входа, в течении одной минуты, IP будет добавляться в новые списки (stage2 - stage4). В конце достигнет последней стадии, на которой добавляет IP-адрес в ftp_blacklist (таймаут - 1 неделя). Визуально это выглядит так.



  Если же вы используете ftp-сервер встроенный в Mikrotik, правила отличаются. Вместо цепочки forward нужно использовать input и output. Допустим wan-интерфейс один - ether1 и ftp-сервер является тот-же Mikrotik. Тогда сообщение ftp-отказа будет отличатся - "530 Login incorrect". Правила будут выглядеть так.
/ ip firewall filter
add chain=input in-interface=ether1 protocol=tcp dst-port=21 src-address-list=ftp_blacklist action=drop comment="drop ftp brute forcers" disabled=no
add chain=output content="530 Login incorrect" dst-address-list=ftp_stage4 action=add-dst-to-address-list address-list=ftp_blacklist address-list-timeout=1w comment="auto-firewall ftp - stage 5" disabled=no
add chain=output content="530 Login incorrect" dst-address-list=ftp_stage3 action=add-dst-to-address-list address-list=ftp_stage4 address-list-timeout=1m comment="auto-firewall ftp - stage 4" disabled=no
add chain=output content="530 Login incorrect" dst-address-list=ftp_stage2 action=add-dst-to-address-list address-list=ftp_stage3 address-list-timeout=1m comment="auto-firewall ftp - stage 3" disabled=no
add chain=output content="530 Login incorrect" dst-address-list=ftp_stage1 action=add-dst-to-address-list address-list=ftp_stage2 address-list-timeout=1m comment="auto-firewall ftp - stage 2" disabled=no
add chain=input in-interface=ether1 protocol=tcp dst-port=21 action=add-src-to-address-list address-list=ftp_stage1 address-list-timeout=1m comment="auto-firewall ftp - stage 1" disabled=no
  Принцип правил тот-же.

 Второй вариант:


Второй вариант основан на использовании функции в Firewall "dst-limit". Правила имеют очередность.
 Первое правило блокирует все соединения на 21 порт с адрес-листа blacklist с двух WAN интерфейсов.
/ ip firewall filter
add action=drop chain=forward dst-port=21 in-interface-list=wan protocol=tcp src-address-list=blacklist
  Правило разрешает только 9 неправильных ввода пароля за 1 минуту.
/ ip firewall filter
add chain=forward content="530 Not logged in." dst-limit=1/1m,9,dst-address/1m protocol=tcp src-address=10.2.0.7 src-port=21
  При превышении этого значения, правило, которое выше, перестает пропускать пакеты и срабатывает следующее правило, которое помещает IP в блек-лист на 3 часа.
/ ip firewall filter
add action=add-dst-to-address-list address-list=blacklist address-list-timeout=3h chain=forward content="530 Not logged in." protocol=tcp src-address=10.2.0.7 src-port=21
  При использовании Mikrotik в качестве ftp-сервера и wan-порта ether1 это выглядит так:
/ ip firewall filter
add chain=input in-interface=ether1 protocol=tcp dst-port=21 src-address-list=blacklist action=drop
# accept 10 incorrect logins per minute
add chain=output action=accept protocol=tcp content="530 Login incorrect" dst-limit=1/1m,9,dst-address/1m
#add to blacklist
add chain=output action=add-dst-to-address-list protocol=tcp content="530 Login incorrect" address-list=blacklist address-list-timeout=3h
  Аналогично можно защищать и другие сервисы, порты на которые выброшены наружу. В ряде случаев можно даже не пользоваться опцией "content", а использовать только хопы (попытки новых подключений) по аналогии с 9 пунктом моей статьи только для цепочки forward. Не забываете: не используйте стандартные логины (admin, user, ftp), стандартные порты (для ftp - 21 порт). Используйте сложные пароли и создавайте отдельных пользователей для работы с сервисами. Для нашего случае подойдет пользователь, у которого права только ftp.



Используемые материалы:

Подписаться на новые статьи.

3 комментария:

  1. В первом примере все-таки не "dst-address-list=ftp_stage4" (и следующие), а "src-address-list=ftp_stage4"

    ОтветитьУдалить
  2. А с RDP так можно?

    ОтветитьУдалить