Posterous theme by Cory Watilo

ssh bruteforce prevention

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

Под FreeBSD

У меня все это получилось по прочтении стаьи Лисяры. Немножко подправил его шаги, но совсем незначительно. [cc lang="bash"] cd /usr/ports/security/sshit make install clean echo "auth.info;authpriv.info |exec /usr/local/sbin/sshit" >> /etc/syslog.conf [/cc] Теперь все попытки входа будут фильтроваться через sshit. Осталось подправить его конфиг /usr/local/etc/sshit.conf: [cc lang="bash"] MAX_COUNT = 5 FIREWALL_TYPE = ipfw2 [/cc] Так как sshit парсит строчки лога регулярными выражениями, а syslogd имеет нехорошую привычку сокращать в строки вида: [cc lang="text"] Jan 6 17:08:29 server last message repeated 3 times [/cc] Чтоб такие сокращения убрать, надо в /etc/rc.conf найти/зменить/добавить в [cc lang="bash"] syslogd_flags="-ss" [/cc] ключик -c, а лучше -cc: [cc lang="bash"] syslogd_flags="-cc -ss" [/cc] А также в /etc/rc.firewall дописать создание/опустошение таблицы, в которую будут добавляться нарушители: [cc lang="bash"] ${fwcmd} add 60000 deny ip from "table(0)" to my 22 [/cc] (у меня это в строке сразу над ${fwcmd} add 65000 pass all from any to any). Вообще оно должно быть до правила разрешающего все (если такое есть). Теперь рестарить все нужные сервисы: [cc lang="bash"] /etc/rc.d/syslogd restart /etc/rc.d/sshd restart [/cc] и все нарушители будут блочиться файрволом в таблице 0 (ipfw table 0 list). Через некоторое время (вроде бы как 5 минут) они будут разблокированы.

Для Linux

Тут все оказалось проще и веселее. Вариант №1 - через iptables. Всего две команды: [cc lang="bash"] 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 [/cc] Но у этого способа есть минус. Он не знает, чем все закончилось. Если за 60 секунд было 8 подключений - IP блокируется. Способ №2 - посредством fail2ban. Устанавливаем: [cc lang="bash"] apt-get install fail2ban [/cc] И даже править ничего не надо. Ну... почти ничего. В логе встречается строка "last message repeated N times", которая все портит. И в sysklogd нехватает возможности это исправить. syslog-ng вроде бы такого не делает, и пишет во все те же логи. Вот я его себе и установил сразу. В /etc/fail2ban можно найти конфиги, которыми можно настроить его и на ftp, и на ssh, и на несколько других сервисов.
| Viewed
times
Filed under: