Со временем надоедает смотреть на полотенца логов с записями типа:
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)