Защита ssh от брутфорса

В один прекрасный день мне надоело наблюдать в логах кучу записей о попытке ботов подобрать пасс к моему хосту, не то чтоб я боялся root закрыт, учетки типа demon, webmaster, oracle не используются, пароли стойкие, просто достала сотня другая мусорных записей в день. И решил я прикрутить какую-нибудь защиту от этих гадов.

Чем защищаем?

Полазив в портах и в инете я остановился на 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.
Устанавливаем из портов
cd /usr/ports/security/sshguard-pf/ && make install clean

Если по каким-то причинам Вы не используете порты, скачайте посследнию версию с сайта sshguard и соберите в ручную
./configure --with-firewall=pf && make && make install


Настройка ОС для работы sshguard.
Нам необходимо добавить две строки в конфигурацию 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 мы увидим примерно следующие
Jun 16 11:01:40 www sshd[31817]: Invalid user test from 61.172.251.183
Jun 16 12:29:48 www sshd[31957]: Invalid user test from 85.114.130.168
Jun 16 12:29:49 www sshd[31959]: Invalid user test from 85.114.130.168
Jun 16 12:29:49 www sshd[31961]: Invalid user test from 85.114.130.168
Jun 16 12:29:50 www sshd[31963]: Invalid user test from 85.114.130.168
Jun 16 12:29:50 www sshguard[29978]: Blocking 85.114.130.168:4 for >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


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

Вот собственно и всё.

Комментарии (7)

RSS свернуть / развернуть
в капилка положим.
0
Пробовал так защищаться, когда работал у провайдера. Но когда за одним натом сидит несколько админов и несколько саппортов(хоть и с минимум провами), то бывают казусы — один ступит с паролем и все седят пока не разбанится ИП или приходится ехать через весь город на АТС. Я нашёл другой выход — просто поменял порт на ssh и всё пучком.

ЗЫ: Изучаю интерфейс — думал в посте это стрелки прокрутки, я нехотел ставить минус. Сори.
0
ну так для этого у sshguard'a есть белые списки, которые не подлежат блокировке.
ps минус компенсировал плюсов, я думаю Егоров не сильно обидится ;)
0
нормально. я уже плюнул на спину! ©
0
А нечто подобное под OpenSuse 10.2 прикрутить можно? SSH защищена ключом, но долбят постоянно — тоже километры логов наблюдаю.
0
sshguard можно прикрутить, только правила на iptables, а не на pf в остальном все тоже самое.
0
Вот и пригодилось. Вывожу Фряху на общедоступный уровень — если всё получится и будут нюансы — отпишусь…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.