Защита ssh от брутфорса
Для зашиты нашего сервера от перебора паролей можно воспользоваться утилитами sshguard или sshit.
Принципы работы.
sshguard и sshit работают по одному принципу. Анализируют системные сообщения о неверной аутентификации и в случае достижения определенного значения заносят атакующий ip в блокирующее правило файервола. Через определенное время ip из правила удаляется.
Соответсвенно для работы необходим настроенный файервол.
SSHGuard
sshguard умеет работать с
- AIX native firewall — for IBM AIX operating systems
- netfilter/iptables — for Linux-based operating systems
- Packet Filter (PF) — for BSD operating systems (Open, Free, Net, DragonFly -BSD)
- IPFirewall (IPFW) — for FreeBSD and Mac OS X
- IP Filter (IPFILTER) — for FreeBSD, NetBSD and Solaris
- tcpd's hosts_access (/etc/hosts.allow) — portable across UNIX
- null — portable do-nothing backend for applying detection but not prevention
Я использую PF поэтому в заметке примеры на PF.
Установка sshguard.
FreeBSD:
Устанавливаем из портов
cd /usr/ports/security/sshguard-pf/&& make install clean
Если по каким-то причинам Вы не используете порты, скачайте последнию версию с сайта sshguard и соберите в ручную
./configure --with-firewall=pf && make && make install
Debian:
apt-get install sshguard
Настройка ОС для работы sshguard.
Создаем файл для хранения логов
# touch /var/log/sshguard
Debian (wheezy):
Редактируем в //etc/default/sshguard следующую строчку
#mcedit /etc/default/sshguard #ARGS="-a 40 -p 420 -s 1200" ARGS="-a 5 -p 420 -s 2400 -b 5:/etc/sshguard/blacklist"
и перезапускаем sshguard
service sshguard restart
FreeBSD:
Нам необходимо добавить две строки в конфигурацию PF
table <sshguard> persist
объявляем таблицу куда sshguard вносит ip роботов.
block in quick on $if0 proto tcp from<sshguard> to $if0 port ssh label "ssh brute"
Собственно само блокирующее правило, его стоит разметить на самом верху блока правил конфигурационного файла PF. $if0 интерфейс на котором будут блокироваться подключения, для блокировки на всех интерфейсах замените на any.
Перечитайте файл конфигурации
#pfctl -f /etc/pf.conf
Далее удалите комментарий или добавьте ( если отсутствует) строку в /etc/syslog.conf
auth.info;authpriv.info |exec/usr/local/sbin/sshguard
и перезапустите syslog
#/etc/rc.d/syslogd restart
Собственно после этих манипуляций sshguard будет блокировать атаки с параметрами по умолчанию.
При атаке в /var/log/auth.log мы увидим примерно следующие
Jun1611:01:40 www sshd[31817]:Invalid user test from61.172.251.183Jun1612:29:48 www sshd[31957]:Invalid user test from85.114.130.168Jun1612:29:49 www sshd[31959]:Invalid user test from85.114.130.168Jun1612:29:49 www sshd[31961]:Invalid user test from85.114.130.168Jun1612:29:50 www sshd[31963]:Invalid user test from85.114.130.168Jun1612:29:50 www sshguard[29978]:Blocking85.114.130.168:4for>420secs:4 failures over 2 seconds.
Настройка параметров sshguard
sshguard имеет ряд параметров которые мы можем переопределить
-a количество неудачных попыток аутентификации после которого ip будет заблокирован. По умолчанию 4.
-p через сколько секунд ip будет разблокирован. По умолчанию 420.
-s сколько секунд sshguard помнит ip. По умолчанию 1200. Чтоб было понятней если с ip идет одна атака в 30 минут то он ни когда не попадет в бан при дефолтовой настройке.
-w белые ip, сети, или путь к файлу белых адресов. Формат файла одна строка — одна запись, # определяет комментарии.
-b определяет через сколько блокировок ip будет добавлен в черный список и путь до него. Черный список загружается при старте sshguard и автоматически не очищается.
у sshguard нет файла конфигурации параметры задаются при старте sshguard. В нашем случае sshguard пускается syslog поэтому отредактируем syslog.conf так, что sshguard будет блокировать ip после 3 неудачных попыток аутонтификации на 30 минут, а после 5 блокировок заносить его в черный список.
auth.info;authpriv.info |exec/usr/local/sbin/sshguard -a 3-p 1500-b 5:/usr/local/etc/sshguard.blacklist
первый раз блокируется на 420 секунд и удаляется через 7 минут
второй раз на 2*420 у удаляется через 14 минут
третий раз на 2*2*420 и удаляется через 28 минут и тд...
2^(N-1)*420 N-й раз.
Sshit
Sshit — это perl скрипт соответственно необходимо чтобы в системе был perl, а так же 2 модуля
- IPC::Shareable
- Proc::PID::File
Sshit умеет работать только с pf и ipfw.
Установка sshit
cd /usr/ports/security/sshit/&& make install clean
Конфигации sshit.
Sshit имеет конфигурационный файл /usr/local/etc/sshit.conf в котором можно переопредилить значения по умолчанию.
FIREWALL_TYPE ="pf"; # Какой firewall используем MAX_COUNT =3; # Количество неудачных попыток аутентификации после которого ip блокируется WITHIN_TIME =60; # В течении сколько секунд должно произойти заданное кол-во неудачных аутентификаций RESET_IP =300; # Через сколько секунд ip будет разблокирован. PFCTL_CMD ="/sbin/pfctl"; PF_TABLE ="badhosts"#имя таблицы куда заносятся плохие ip
Настройка ОС для работы sshit.
По аналогии с настройкой под sshguard редактируем файл конфигурации PF
table <badhosts> persist
block in quick on $if0 proto tcp from<badhosts> to $if0 port ssh label "ssh brute"
перечитываем конфигурационный файл
#pfctl -f /etc/pf.conf
Редактируем syslog.conf
auth.info;authpriv.info |exec/usr/local/sbin/sshit
и перезапустите syslog
#/etc/rc.d/syslogd restart