Fork me on GitHub

The WebDevil

Enjoy development

Некоторое время назад начали приходить сообщения мониторилки о том, что сервис ssh недоступен на одном из серверов. И он таки был недоступен, потом поднялся сам.
Как показал просмотр логов – по ssh активно шел перебор паролей.
Я решил блочить нарушителей, а не перевесить ssh на другой порт.

Под FreeBSD

У меня все это получилось по прочтении стаьи Лисяры. Немножко подправил его шаги, но совсем незначительно.

cd /usr/ports/security/sshit
make install clean
echo "auth.info;authpriv.info                         |exec /usr/local/sbin/sshit" >> /etc/syslog.conf

Теперь все попытки входа будут фильтроваться через sshit. Осталось подправить его конфиг /usr/local/etc/sshit.conf:

MAX_COUNT       = 5
FIREWALL_TYPE   = ipfw2

Так как sshit парсит строчки лога регулярными выражениями, а syslogd имеет нехорошую привычку сокращать в строки вида:

Jan  6 17:08:29 server last message repeated 3 times

Чтоб такие сокращения убрать, надо в /etc/rc.conf найти/зменить/добавить в

syslogd_flags="-ss"

ключик -c, а лучше -cc:

syslogd_flags="-cc -ss"

А также в /etc/rc.firewall дописать создание/опустошение таблицы, в которую будут добавляться нарушители:

${fwcmd} add 60000 deny ip from "table(0)" to my 22

(у меня это в строке сразу над ${fwcmd} add 65000 pass all from any to any).
Вообще оно должно быть до правила разрешающего все (если такое есть).
Теперь рестарить все нужные сервисы:

/etc/rc.d/syslogd restart
/etc/rc.d/sshd restart

и все нарушители будут блочиться файрволом в таблице 0 (ipfw table 0 list). Через некоторое время (вроде бы как 5 минут) они будут разблокированы.

Для Linux

Тут все оказалось проще и веселее.

Вариант №1 – через iptables.
Всего две команды:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

Но у этого способа есть минус. Он не знает, чем все закончилось. Если за 60 секунд было 8 подключений – IP блокируется.

Способ №2 – посредством fail2ban.
Устанавливаем:

apt-get install fail2ban

И даже править ничего не надо. Ну… почти ничего. В логе встречается строка “last message repeated N times”, которая все портит. И в sysklogd нехватает возможности это исправить. syslog-ng вроде бы такого не делает, и пишет во все те же логи. Вот я его себе и установил сразу.
В /etc/fail2ban можно найти конфиги, которыми можно настроить его и на ftp, и на ssh, и на несколько других сервисов.

6 Responses to “ssh bruteforce prevention”

  1. Реально не знал про fail2ban – пойду пробывать.

    интернет бизнес

  2. to my 22

    Наверное имелось ввиду to me 22 ?

    anycolor

  3. да fail2ban очень интересная прога :)
    гибкая и тд и тп. сам ею давно пользуюсь
    кроме ссх она умееь и другие вещи проверять кстати

    DeViL

  4. anycolor
    нет, именно to my 22

    dm

  5. my – это вся сетка, а me это айпишки сервака логичнее конечно me, но это смаря какие правила перед этим стоят :)

    snake851

  6. и лучше не юзать в ядре IPFEREWALL_DEFAULT_TO_ACCEPT или как оно та, что делает файрвол типа: “запреьить это, а все разрешить”, лучше разрешать конкретное а остальное все лочить

    snake851