Защита 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

Понравилась статья, расскажи о ней друзьям, нажми кнопку!