Bruteblock - защита от перебора паролей по ssh


Опубликовано muff

Когда-то эта тема уже подымалась. Рассматривалось решение блокировки ip с помощью sshit. Решил дополнительно ознакомиться с еще одной программой того же назначения - bruteblock.

Кстати... Для защиты от ssh-брутефорса не обязательно сразу же устанавливать дополнительный софт . Существуют также варианты запуска демона sshd на нестандартном порту, разрешения доступа только с определенных IP, авторизация по ключах... Но я все-таки остановился на анализе лог-файлов и автоматической блокировке доступа.

Для начала немного общей информации о bruteblock. Программа bruteblock позволяет блокировать попытки подбора паролей к сервисам UNIX. Программа анализирует журнал запущенных служб и
заносит ip злоумышленников в определенную таблицу firewall ipfw2. Через некоторое, определённое пользователем, время программа удаляет их из этой таблицы. Использование регулярных выражений позволяет использовать утилиту для практически любой службы. Утилита написана на C и не использует вызова внешних программ, работая с таблицами IPFW2 через RAW SOCKETS API.

Итак, приступим непосредственно к установке bruteblock. Устанавливать, как всегда, будем из портов:# cd /usr/ports/security/bruteblock && make install clean

Как хороший, "порядочный" порт, bruteblock вывел на экран список необходимых действий по завершению установки:Configuration of the bruteblock is done via configuration files
located at /usr/local/etc/bruteblock/

To run the script, append following lines to /etc/syslog.conf:

!*
auth.info;authpriv.info |exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/ssh.conf

and restart syslogd.

Also you should add ipfw2 table and the corresponding deny rule.
For example,

# ipfw add deny ip from table(1) to any

Next, you'll want to setup periodical cleanup of ipfw2 table. Add following
lines to /etc/rc.conf:

bruteblockd_enable="YES"
bruteblockd_table="1"
bruteblockd_flags="-s 5"

and start bruteblockd: /usr/local/etc/rc.d/bruteblockd.sh start

Тем лучше для нас... Кстати, пора ознакомиться с принципом работы bruteblock. Утилита bruteblock состоит из двух частей – bruteblock и bruteblockd. Файл bruteblock прописывается в /etc/syslog.conf и обеспечивает анализ журнала и добавление ip адресов в таблицу IPFW2. Каждая запись IPFW2 содержит такие поля:
адрес/маска, значение. Значение – это необязательное поле, которое может содержать любое число формата unsigned int. Оно может использоваться для выборки подмножества таблицы в правилах IPFW2. Утилита bruteblock использует это поле для хранения времени действия правила, в unix формате. Утилита bruteblockd периодически проверяет указанную таблицу и удаляет устаревшие записи. Таким образом удалось избежать необходимости IPC bruteblock/bruteblockd и обеспечить возможность хранить в одной таблице записи для нескольких сервисов. Кроме того, всегда можно легко получить список актуальных блокировок и при необходимости отредактировать его.

С принципом работы ознакомились, пора приступать к настройке. Для начала ознакомимся с тем, что у нас находится в каталоге /usr/local/etc/bruteblock/ . В каталоге уже есть готовые конфигурационные файлы для ssh і ftp. Я же затрону только настройку для ssh.

Редактируем /usr/local/etc/bruteblock/ssh.conf до следующего состояния:# cat /usr/local/etc/bruteblock/ssh.conf

# regexp - регулярное выражение, по которому производится поиск ip адресов
# при попытках подбора паролей. Формат регулярных выражений - PCRE.
# "regexp0","regexp1",... "regexp9" . опциональные поля, содержащие до 10
# дополнительных регулярных выражений при попытках подбора паролей.
# Формат регулярных выражений - PCRE.

regexp = sshd.*Illegal user S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp1 = sshd.*Failed password for (?:illegal user )?S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp2 = sshd.*error: PAM: authentication error for illegal user S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp3 = "sshd.*Failed keyboard-interactive/pam for S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})"
regexp4 = sshd.*Invalid user S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp5 = sshd.*error: PAM: authentication error for S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp6 = sshd.*Did not receive identification string from (d{1,3}.d{1,3}.d{1,3}.d{1,3})
regexp7 = sshd.*User S+ from (d{1,3}.d{1,3}.d{1,3}.d{1,3}) not allowed because not listed in AllowUsers

# Количество неудачных попыток входа в течении времени within_time,
# после которых bruteblock добавляет ip в таблицу ipfw2.

max_count = 4

# Время, в секундах в течении которого должны произойти max_count
# неудачных попыток входа.

within_time = 300

# Время жизни правила блокировки, по истечению которого bruteblockd
# удаляет правило из таблицы.

# 30 минут
reset_ip = 1800

# Номер таблицы ipfw2
ipfw2_table_no = 101

Конфигурационный файл готов. Думаю, исходя из подробных коментариев, все понятно. А стандартные регулярные выражения немного сменил, исходя из анализа лог-файлов. Также можете устанавливать свои значения счетчика, времени и таблицы ipfw.

Пора включить парсилку логов. Для этого в /etc/syslog.conf вносим такую строку:auth.info;authpriv.info |exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/ssh.conf

Чтобы изменения вступили в силу, перестартовываем syslogd. Кстати, что бы не сбивать с толку наш блокировщик сообщениями вида "last message was repeated 5 times", предварительно добавим в /etc/rc.conf следующую строку "syslogd_flags="-c""
# echo '# Syslogd settings change' >> /etc/rc.conf
# echo 'syslogd_flags="-c"' >> /etc/rc.conf
# sh /etc/rc.d/syslogd restart
Stopping syslogd.
Starting syslogd.

Теперь пора добавить запрещающее правило в файрвол. Я создаю его под номером 11, чтобы оно стояло первым в списке правил файрвола.# ipfw add 11 deny all from "table(101)" to me

Ну а как именно "запихнуть" в стартовый скрипт файрвола, думаю догадаетесь

Пора, собственно, запустить bruteblockd и наслаждаться результатами проделанной работы. В /etc/rc.conf добавляем следующие строки:
# echo '# Bruteblockd' >> /etc/rc.conf
# echo 'bruteblockd_enable="YES"' >> /etc/rc.conf
# echo 'bruteblockd_table="101"' >> /etc/rc.conf
# echo 'bruteblockd_flags="-s 5"' >> /etc/rc.conf

Собственно запуск...# sh /usr/local/etc/rc.d/bruteblockd start
Starting bruteblockd.

Чтобы окончательно "успокоиться" решено смоделировать ситуацию брутефорса. С "дружественного"

сервера нарочно неверно пытаюсь авторизоваться на сервер с только что установленным и настроенным bruteblockd. После нескольких неверных попыток сервер авторизации соединение разорвалось. В лог-файл /var/log/auth.log bruteblock вписал строку о "нарушителе":# tf /var/log/auth.log | grep bruteblock
Dec 12 02:01:32 router bruteblockd[24317]: starting....
Dec 12 02:02:37 router bruteblockd[24339]: starting....
Dec 12 02:03:41 router bruteblock[24139]: Adding 195.3.159.250 to the ipfw table 101

Что ж... Настройка завершена успешно. Можно и поспать

Примечание:

Для более уверенной работы советую отключить резолвинг ДНС-имен для ssh. Для этого в /etc/ssh/sshd_config необходимо добавить параметр "UseDNS no" и перезапустить sshd:

# echo 'UseDNS no' >> /etc/ssh/sshd_config

# sh /etc/rc.d/sshd restart

Обновлено: 12.03.2015