В статье «Защита от подбора паролей по ssh» мы рассматривали способ защиты от подбора паролей при помощи связки sshit и ipfw
Случилось так что на одном из серверов эта связка не захотела корректно работать. Разбираться что не так особо не хотелось, к тому же
в репозитории портов имелись и другие средства.
Сначала решил попробовать sshguard. Однако почитав документацию я понял (возможно и не правильно) что sshguard использует
по умолчанию диапазон правил ipfw 55000-55050. Мне это было не удобно, тому же не использует таблицы ipfw. Напильником же
хотелось работать по минимуму. Решено было смотреть на что то следующее.
Следующим оказался bruteblock
Беглый обзор manа обрадовал, поскольку данный порт обещал защиту от перебора паролей не только по ssh, но и по ftp, а так же возможность интеграции с почтовым сервером. Решено было пробовать.
Ищем нужный порт
#whereis bruteblock
#bruteblock:/usr/ports/security/bruteblock
устанавливаем одним из способов:
#portinstall /usr/ports/security/bruteblock
либо:
#cd /usr/ports/security/bruteblock
# make && make install && make clean
Правим конфигурационный файл:
/usr/local/etc/bruteblock/ssh.conf
Вместо правил установленных по умолчанию
regexp = sshd.*(?:Illegal|Invalid) user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1 regexp1 = sshd.*Failed \S+ for (?:(?:illegal|invalid) user )?\S+ from (\d{1,3}\.\d regexp2 = sshd.*error: PAM: authentication error for (?:(?:illegal|invalid) user ) regexp3 = sshd.*Did not receive identification string from (\d{1,3}\.\d{1,3}\.\d{1
пишем следующие:
regexp = sshd.*Illegal user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp1 = sshd.*Failed password for (?:illegal user )?\S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp2 = sshd.*error: PAM: authentication error for illegal user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp3 = "sshd.*Failed keyboard-interactive\/pam for \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" regexp4 = sshd.*Invalid user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp5 = sshd.*error: PAM: authentication error for \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp6 = sshd.*Did not receive identification string from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) regexp7 = sshd.*User \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) not allowed because not listed in AllowUsers
коротко остальные параметры:
max_count = 3 — количество неудачных попыток до срабатывания блокировки.
Анализ логов показывает что переборщики как правило делают именно 3 попытки для одного логина, затем используют следующий
within_time = 60 — время в секундах в течении которого происходит эти самые неудачные 3 попытки.
reset_ip = 18000000 — время на которое блокируется IP. У меня установлено несколько дней, но вам решать сможете ли вы попасть
на сервер если что то пойдет не так.
ipfw2_table_no = 2 — номер таблицы ipfw (в данном случае 2)
С ssh.conf закончили. Следующий шаг устанавливаем парсер логов.
В файл /etc/syslog.conf добавляем такую строчку:
после:
auth.info;authpriv.info /var/log/auth.log
добавляем:
auth.info;authpriv.info |exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/ssh.conf
Перестартовываем syslogd
# sh /etc/rc.d/syslogd restart
В rc.local добавляем строчку:
/sbin/ipfw add 150 deny ip from 'table(2)' to any
дабы правило автоматически создавалось при перезагрузки сервера
и применяем это же правило
Последний штрих, добавляем в rc.conf следующие строчки
bruteblockd_enable="YES"
bruteblockd_table="2"
bruteblockd_flags="-s 5"
и стартуем bruteblock
# /usr/local/etc/rc.d/bruteblockd start
Посмотреть кто сейчас в бане можно командой:
# ipfw table 2 list
Есть один минус — после перезагрузки сервера таблица 2 IPFW очищается и приходится собирать все заново.
Я решил проблему таким способом:
раз в сутки сбрасываю содержимое таблицы в файл, а при загрузке сервера заполняю эту же таблицу из файла при помощи простого скрипта
# cat blockip.sh
#!/bin/sh
ipfw table 2 flush
cat /home/setevoy/blockip.txt | while read ip; do
ipfw table 2 add $ip
done