FreeBSD: борьба с bruteforce — IPFW+Sshit

Автор: | 01/20/2012
 

Со временем надоедает смотреть на полотенца логов с записями типа:

kira.website.co.ua login failures:
Jan 19 02:00:09 akira sshd[12755]: Invalid user ant from 201.65.243.107
Jan 19 02:00:12 akira sshd[12757]: Invalid user office from 201.65.243.107
Jan 19 02:00:16 akira sshd[12759]: Invalid user pc from 201.65.243.107
Jan 19 02:00:17 akira sshd[12761]: Invalid user ant from 201.65.243.107

Кроме метода, описанного ниже, можно применить «родные» способы защиты демона sshd, о них можно почитать тут>>>.

Для автоблокировки хостов, с которых производится подбор паролей, есть 3 наиболее распространенные утилиты:

Bruteblock
Sshguard
Sshit

Опробуем Sshit — у него самая простая  настройка и логика работы.

Приступим:

# cd /usr/ports/security/sshit
# make install clean

После установки Sshit выводит инструкции по запуску, выполним их.

Добавим в файл конфигурации /etc/syslogd.conf после строки:

auth.info;authpriv.info      /var/log/auth.log

строку:

auth.info;authpriv.info     |exec /usr/local/sbin/sshit

И презапустим syslogd:

# /etc/rc.d/syslogd restart
Stopping syslogd.
Waiting for PIDS: 727.
Starting syslogd.

Если вы не уверены какая версия IPFW у вас, проверьте лог загрузки:

# dmesg | grep ipfw
ipfw2 (+ipv6) initialized

Настройка Sshit производится в файле /usr/local/etc/sshit.conf.

Устанавливаем следующие значения:

# Sample configuration file of sshit.pl
# какой фаревол используем — меняем pf (по-умолчанию) на ipfw2
FIREWALL_TYPE   = ipfw 2
# Количество неудачных попыток входа, после которых применим блокировку
MAX_COUNT       = 3
# Время в секундах, за которое будем считать неудачные попытки, 0 секунд для 3-х попыток — вполне достаточно
WITHIN_TIME     = 60
# Время в секундах, на которое будем блокировать, по-умолчанию 300, я увеличил
RESET_IP        = 1500
IPFW_CMD        = /sbin/ipfw
# Можно указать диапазон правил, между которыми будут добавляться новые — мы сделаем по другому, см. конфиг дальше
#IPFW_RULE_START = 2100
#IPFW_RULE_END   = 2199
#Команда запуска IPWF
IPFW2_CMD       = /sbin/ipfw
#Номер таблицы, в котрую будем заносить заблокированные хосты
IPFW2_TABLE_NO  = 1
#Эти два значения можно закомментировать или удалить — мы не используем PF
#PFCTL_CMD       = /sbin/pfctl
#PF_TABLE        = badhosts

Теперь, добавим в конфигурацию IPFW правило блокировки по данным из таблицы:

$cmd 00020 deny all from «table(1)» to any via $pif

И перезагружаем фаервол для применения новых правил:

# /etc/rc.d/ipfw restart
net.inet.ip.fw.enable: 1 -> 0
net.inet6.ip6.fw.enable: 1 -> 0
Firewall rules loaded.
Firewall logging enabled.

Можно попробовать зайти (с безопасного адреса, на который вы не боитесь временной блокировки) с неверным логином/паролем, и проверить логи:

# less /var/log/auth.log
Jan 20 13:11:27 akira sshd[50423]: Invalid user sdcsdc from 93.74.55.57
Jan 20 13:11:29 akira sshd[50423]: error: PAM: authentication error for illegal user sdcsdc from 93.74.55.57
Jan 20 13:11:29 akira sshd[50423]: Failed keyboard-interactive/pam for invalid user sdcsdc from 93.74.55.57 port 55035 ssh2
Jan 20 13:11:29 akira sshit: BLOCKING 93.74.55.57 with ipfw2

Посмотреть действующие правила в таблице:

# ipfw table 1 list
93.74.55.57/32 0

Что ж, удачно заблокирован домашний IP 🙂

Через указанные в конфиге 1500 секунд в логи добавилась строка о снятии блокировки:

Jan 20 13:36:33 akira sshit: janitor removed block rule  for 93.74.55.57 (reset time of 1500 seconds reached)