расставляй правильно приоритеты и не отвлекайся на мелочи

Защищаем FTP от brute-force атак

Очень возможно, что для кого-то это уже давно пройденный этап, когда для меня это лишь очередной опыт. Возможно кто-то скажет: «Зачем это, ведь у большинства современных ftp серверов есть средства лимитирующие количество неудачных попыток подключения», — да, я в курсе, к примеру в proftpd, который я использую, есть параметр MaxLoginAttempts, но тем не менее, его использование при атаках не спасает от разростания логов, как собственно ftp, так и логов безопасности, а так-же от чрезмерной загрузки самого ftp сервера.

Со временем я понял, что попытки подбора паролей грубой силой необходимо пресекать на гораздо более раннем этапе. Это позволяет более жестко «гасить» атакующего и разгружать сам сервис, позволяя ему выполнять свое непосредственное предназначение.

Ни что лучше других ни справляется с задачей фильтрации «ненужных» tcp пакетов, — как замечательный сетевой фильтр Linux — iptables (сейчас «кошковеды» закидают своими контр-доводами :) ).

Но, нам нужен не просто netfilter, нам нужен к нему модуль ip_recent, который, если мне не изменяет память, появился с iptables только в ядре 2.4.22, поэтому, если Вы «счастливый» обладатель более раннего ядра, а на одном из моих серверов возникла именно такая ситуация, то Вам предстоит приятное времяпровождение за сборкой свежего kernel’а или iptables, что в данной ситуации практически одно и то-же.

С надеждой на лучшее, приступаем непосредственно к защите нашего ftp сервера, который для tcp модели начальных подключений клиентов ни что иное как 21-ый порт (во загнул :)). С места в карьер сразу предлагаю рассмотреть слямзиную откуда-то из Интернета конфигурацию для iptables:

iptables -N FTPSCAN
iptables -A INPUT -p tcp —dport 21 -m state —state NEW -j FTPSCAN

# — White list
# It’s me:
iptables -A FTPSCAN -s 192.168.128.111/32 -j ACCEPT
# IE clients:
iptables -A FTPSCAN -s 88.123.246.42/32 -j ACCEPT
# — end of white list

iptables -A FTPSCAN -m recent —set —name FTP
iptables -A FTPSCAN -m recent —update —seconds 180 —hitcount 6 —name FTP -j DROP

Теперь займемся разборами всех этих записей:
В первой строке мы создаем CHAIN, цепочку, куда будем помещать наши правила, и обзываем ее FTPSCAN.
Далее, вторая строка, если на локальный сервис (INPUT), по протоколу tcp, на 21-ый порт прилетел пакет на установку нового соединения (—state NEW), то нам нужно отправить его для дальнейшего анализа в нашу вновь созданную цепочку FTPSCAN, в которой:
1. Существует белый список (зачем он нужен рассмотрим чуть ниже). В котором проверяется адрес источника (к примеру, -s 192.168.128.111/32), с которого поступил «пойманный» пакет, и если это разрешенный источник, пакет сразу же отпускается на волю (-j ACCEPT).
2. Если пакет прошел через весь белый список и адрес источника нигде не совпал, значит он пришел не от доверенного источника и нам необходимо его пометить (поставить на счетчик в список, который мы назвали как FTP: -m recent —set —name FTP), этим как-раз занимается модуль ip_recent, в предпоследней строке.
3. И, последней строкой, мы проверяем, если помеченный источник успел побывать (—update) в нашем списке (—name FTP) 6 раз (—hitcount 6) за последние 180 секунд (—seconds 180), мы должны прекратить это безобразие (-j DROP), или, иначе, просто обновить по нему данные (это делает все тот-же —update).

Зачем нам нужен белый список? В основном он нужен для клиентов упорно не желающих пользоваться никакими ftp клиентами, кроме как встроенным в Windows клиентом работающим в IE. Специфика его работы такова, что при начальном соединении, если Вы заранее не позаботились о вводе имени пользователя и пароля, он несколько раз пытается зайти на ftp сервер анонимно, и иногда этой «анонимной долбежки» бывает достаточно для того, что-бы наша ловушка его заблокировала.

Теперь пара примеров по работе со списком формируемым ip_recent (не забываем, что мы назвали его FTP):
-просмотреть список: echo /proc/net/ipt_recent/FTP
-обнулить список: echo clear > /proc/net/ipt_recent/FTP

И напоследок: натравляем на наш сервис Гидру с любимым password словарем и получаем результат:

Hydra (http://www.thc.org) starting at 2008-03-11 10:25:32
[DATA] 16 tasks, 1 servers, 194775 login tries (l:1/p:194775), ~12173 tries per task
[DATA] attacking service ftp on port 21
Process 4350: Can not connect [timeout], process exiting
Process 4351: Can not connect [timeout], process exiting
Process 4352: Can not connect [timeout], process exiting
Process 4353: Can not connect [timeout], process exiting
Process 4354: Can not connect [timeout], process exiting
Process 4355: Can not connect [timeout], process exiting
Process 4356: Can not connect [timeout], process exiting
Process 4357: Can not connect [timeout], process exiting
Process 4358: Can not connect [timeout], process exiting
Process 4359: Can not connect [timeout], process exiting

Чего и требовалось достичь, — полного разочарования от работы Гидры :) Да хранит Вас firewall!

Ответить
Обязательные поля помечены *