Защита своих серверов от брутфорса один из самых важных и фундаментальных аспектов всей безопасности. Если вам сутками перебирают комбинации логин-пароль, то не за горами тот день, когда хоть что то да подберут. Для этого нужно ограничить количество попыток установки соединения в определённый период. Мне нравится следующая конфигурация. Пользователь раз в 15 минут может установить коннект с сервером на SSH порт. Только по истечении этого времени он может это сделать ещё раз. То есть даже особо не важно, правильный или нет был указан пароль. Система помечает его пакеты для себя. И если попытка повторяется — ему будет отказано.
Теперь немного усовершенствуем нашу схему.
Первым делом включим так называемую «защиту от дурака» — перевесим SSH-сервер на другой порт. К примеру на 987
Для этого необходимо всего лишь в конфигурационном файле /etc/ssh/sshd_config найти строку
Port 22
и заменить 22 на нужный порт. В нашем случае на 987. После этого для применния настроек нужно перезапустить демон SSH
service sshd restart
Пол дела сделано. Поехали дальше.
В офисе, откуда я работаю с сервером, внешний статический IP. Это поможет нам в идентификации. Нужно объяснить фаерволу, что мы хорошие и нас было бы неплохо пускать всегда. Добавим сначала постоянное разрешение с наших офисных IP. Для этого в файле /etc/sysconfig/iptables добавим следующие строки.
-A INPUT -p tcp -m tcp --dport 987 -m iprange --src-range X.X.75.91-Y.Y.75.94 -j ACCEPT -A INPUT -p tcp -m tcp --dport 987 -m iprange --src-range X.X.201.90-Y.Y.201.94 -j ACCEPT
Это правило позволит нам пропускать трафик из нашей сети постоянно. Вне зависимости от количества подключений.
Далее серьёзнее. Остальной трафик идущий на SSH, не попавший под эти правила будет помечаться и логироваться. На основании логов и будет происходить блокировка.
параметр —seconds отвечает за время, на которое будет блокироваться возможнсть установки соединения.
—hitcount указывает начиная с какого необходимо отказывать в соединении.
-A INPUT -p tcp --dport 987 -m state --state NEW -m recent --set --name SSH -j ACCEPT -A INPUT -p tcp --dport 987 -m recent --update --seconds 900 --hitcount 2 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force " -A INPUT -p tcp --dport 987 -m recent --update --seconds 900 --hitcount 2 --rttl --name SSH -j DROP
Как оказалось, ничего сложного.
Теперь нужно только перечитать правила. Я особо не заморачиваюсь и просто рестартую службу
/etc/init.d/iptables restart iptables: Сбрасываются правила межсетевого экрана: [ OK ] iptables: Цепочкам назначается политика ACCEPT: nat mangle [ OK ] iptables: Выгружаются модули: [ OK ] iptables: Применяются правила межсетевого экрана: [ OK ]
Как оказалось, ничего сложного.
P.S. В этой статье не описывается ничего, кроме защиты от брутфорса. Так как это было моё знакомство с iptables то особо решил не отходить от темы. Остальные ключевые моменты будут описаны в следующих статьях.