Расскажу ещё про один блокировщик подбора паролей. Теперь он будет работать в паре с pf. Сам sshit представляет собой скрипт на языке perl со всеми вытекающими отсюда последствиями. То есть, при наличии необходимых знаний языка perl вы можете нелету (а именно так он и работает) изменять сам скрипт. Это же (то есть налету) можно делать и с конфигурационным файлом.
Примечание: для OpenBSD его так же можно использоват, не смотря на то, что его нет в репозитариях. Учитывая что это скрипт на perl’e – просто скопируйте себе этот бинарник и конфиг и следуйте указанием в статье. Единственное отличие – это то, что в OpenBSD в syslogd нету флага ‘-c’.
И так. Приступим к усановке. Обновляем порты и ставим sshit:
cd /usr/ports/security/sshit/ && make install clean
После установке появится пример конфигурационного файла sshit.conf в папке /usr/local/etc. По умолчанию он заточен под pf и готов сразу к использованию (вообще-то он так же работает и с ipfw, но здесь мы будем обсуждать именно работу с файерволом pf). Но я бы лично изменил один параметр, который отвечает за время пребывания ip в списке заблокированных. По умлолчанию это 5 минут, но я всегда ставлю 2 суток. И так, меняем:
RESET_IP = 172800
Перед тем, как приступать к настройкам рекомендую сделать следующее: добавим в файл /etc/ssh/sshd_config
UseDNS no
Зачем мы это делаем? Затем, что бы при попытке установить соединение демон ssh не пытался преобразовать IP обратно в имя. В этом случае sshit не сможет занести доменное имя в таблицу чёрного списка. Поэтому лучше отказаться от преобразования ip-адресов в доменные имена.
После установки, обязательно “пропатчить” сам sshit. Строку:
if (/(failed|error|Invalid user) .*from (\d+\.\d+\.\d+\.\d+|[\da-f:]*:[\da-f:]+|([\da-z-]+\.)+[a-z]{2,4})/i ) { # IPv4 & IPv6
заменяем на
if (/(failed|error|Invalid user|User) .*from (\d+\.\d+\.\d+\.\d+|[\da-f:]*:[\da-f:]+|([\da-z-]+\.)+[a-z]{2,4})/i ) { # IPv4 & IPv6
то есть дописываем в regexp слово User. Иначе не будут блокироваться такие попытки:
User root from 61.174.51.231 not allowed because not listed in AllowUsers
Теперь переходим к настройке файервола pf. Я предлагаю создать 2 таблицы: одна для плохих IP, другая же – для хороших. Вы спросите, зачем вторая таблица? Отвечаю. У меня пару раз бывали ситуации, когда я по ошибке вводил неправильный пароль и меня банила собственноручно настроенная система блокировки. Немного обидно. Но что поделаешь, система не может определять, это я или кто-то другой. Поэтому я всегда пишу разрешающие правила, для “белых” IP, что бы в случае каких-то случайных попаданий в чёрный список, никто ничего не заметил.
И так, добавим в самый вверх определение наших таблиц:
table <whitelist> const {IP1/32, IP2/32}
table <badhosts> persist
Вот, что значат ключевые слова после названия таблиц:
const – содержимое таблицы не может быть изменено, после того, как таблица была создана. Когда этот атрибут не указан, pfctl(8) может быть использован для добавления или удаления адресов из таблицы, в любое время, даже при securelevel(7) равному двум или больше.
persist – заставляет ядро держать таблицу в памяти, даже когда к ней не применено никаких правил. Без этого атрибута, ядро автоматически удалит таблицу, когда последнее правило ссылающееся на таблицу будет очищено.
А теперь пишем собственно сами правила:
#allow safenet
pass quick on $ext_if from <whitelist> to $extip
pass quick on $ext_if from $extip to <whitelist>
#bad guys
block quick on $ext_if from <badhosts> to any
block quick on $ext_if from any to <badhosts>
Куда их добавлять? Лично я добавляю как можно выше. Я специально добавил ключевое слово quick, что бы правила применялись сразу (Напомню, что без этого параметра будет применено самое последнее правило, в отличии от ipfw, в котором применяется первое правило).
После перечитываем правила и переходим к настройке syslog’a.
Добавляем в /etc/syslog.conf строчку, которая будет овтечать за процесс мониторинга подбора паролей в режиме реального времени:
auth.info;authpriv.info | exec /usr/local/sbin/sshit
Теперь открываем файл /etc/rc.conf и добавляем такое:
syslogd_flags="-c"
Если у вас уже есть строчка syslogd_flags, то просто добавьте туда параметр ‘-c’. Если этого не сделать, то в логах будут появляться сообщения вида:
Apr 17 18:32:16 srv-test last message repeated 2 times
Наконец-то подходим к финалу: перегружаем syslogd:
#/etc/rc.d/syslog restart
и пробуем подобрать пароль. После 4 попыток в журналах событий будем наблюдать такую строчку:
Apr 17 18:38:09 srv-test sshit: BLOCKING 10.0.3.185 with pf
что значит, что ip=10.0.3.185 у нас попал в чёрный список. Если же возникают какие-то сбои или sshit не может занести ip в таблицу или же ip находится в белом списке и с него идёт подбор паролей, то мы будем видеть такую строчку:
Apr 17 18:40:26 srv-test sshit: block for 10.0.3.185 not working!
Если хочется посмотреть, кто же занесён в чёрный список, выполним такю команду:
#pfctl -t badhosts -T show
1.1.1.1
2.2.2.2
Что бы вручную удалить IP из таблицы выполним такую команду:
#pfctl -t badhosts -T delete 1.1.1.1
Если вы не нашли ответ на свой вопрос в этой статье, обращайтесь к справочному руководству файервола pf.