Блокировка bruteforce атак на ssh с помощью PF во FreeBSD



Блокировка bruteforce атак на ssh с помощью PF

GreenX: Не дали мне спокойно перевести Руководство пользователя PF - запарили сканить. Поиск выдал статью, информацию из которой я попытаюсь применить и перевести. Все здесь крутится вокруг новой фичи - max-src-conn-rate, в OpenBSD она появилась с версии 3.7, а в FreeBSD, если ничего не путаю, с 6 августа 2005 в RELENG_5 и RELENG_6.
Как принято указываю, что вольный перевод сделал я, т.е. Андрей Н. Грошев aka GreenX.

Множество людей имеющих на машине публичный IP адрес, и sshd слушающий 22 порт, замечают многочисленные попытки атак. Эти попытки заполняют логи, да и просто раздражают. Вот то, как я с это решил...

В OpenBSD 3.7, pf получил действительно хорошую функцию названную max-src-conn-rate, которая определяет, как быстро могут создаваться новые соединения.

Подключающиеся хосты, превысившие это ограничение могут быть помещены в таблицу, а все "состояния" (states) включающие IP адрес хоста, могут быть сброшены.

Когда у меня есть таблица с IP нарушителей, то могу легко блокировать их в начале правил фильтрации. Но так как я не хочу блокировать хост навсегда, или до следующей перезагрузки, я использовал маленькую утилиту, чтобы периодически очищать эту таблицу.

Начнем с замечательного PF правила:
# специальное правило для ssh
pass in on $ext_if proto tcp from any to ($ext_if) port ssh
flags S/SA keep state
(max-src-conn-rate 3/30, overload <ssh-bruteforce> flush global)

Ключевое слово здесь - конечно "max-src-conn-rate". Параметры говорят PF помещать каждый IP превышающий норму подключений, более 3 подключений за 30 секунд, в таблицу названную "ssh-bruteforce". Как часто нормальные пользователи подключаются по ssh, чаще этого? Конечно вы можете установить это в 6/60 или что-то большее, лучше соответствующее вашему случаю. И наконец, но не в последнюю очередь, PF убивает все "состояния" порожденные плохим хостом.

Что бы не пускать хулиганов, я добавлю правило в начало моего набора правил:
# block the ssh bruteforce bastards
block drop in quick on $ext_if from <ssh-bruteforce>

Прекрасно, теперь таблица будет пополняться плохими хостами, и они будут заблокированы. Но как я говорил выше, я не хочу блокировать их навсегда. Для этого нам пригодится expiretable. Эта утилита, написанная Henrik Gustafsson, просматривает таблицу и удаляет ("истекшие") записи старше указанного времени.

Она находится в портах (sysutils/expiretable), но вошла после 3.8, поэтому вы должны либо дойти до -current, или собирать ее руками. Теперь добавим это правило в основной crontab:
*/5 * * * * /usr/local/sbin/expiretable -t 3600 ssh-bruteforce

Каждые пять минут, я выкидываю записи, которым более одного часа.

Это - то, как я избавляюсь от тысяч попыток входа в систему, заполняющих мои лог файлы.

GreenX: Вот взяло и сразу не заработало . Но для начала, про порт expiretable в наших портах (т.е. FreeBSD) он появился 8 января 2006г. А в crontab я, на вcякий случай, прописал запуск от имени root и -v, что бы логи не опустели, и было что почитать.

По поводу "не заработало", просто я редактировал уже существующие правила и не обратил внимания, что ниже стоит правило "пропускать быстро любой ssh", поскольку правило из этой статьи без "quick" пакеты пролетали до следующего разрешающего правила.

http://wiki.bsdportal.ru/doc:grblocksshbroteforce

Обновлено: 12.03.2015