Категорії
FreeBSD OpenBSD Security

sshit: удобный блокировщик для pf

Расскажу ещё про один блокировщик подбора паролей. Теперь он будет работать в паре с 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.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff