Некоторое время назад начали приходить сообщения мониторилки о том, что сервис 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, и на несколько других сервисов.