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

Версия для печатиОтправить другуPDF version

Защита FreeBSD сервера

Когда-то эта тема уже подымалась. Рассматривалось решение блокировки 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 периодически проверяет указанную таблицу и удаляет устаревшие записи. Таким образом удалось  обеспечить возможность хранить в одной таблице записи для нескольких сервисов. Кроме того, всегда можно легко получить список актуальных блокировок и при необходимости отредактировать его.

С принципом работы ознакомились, пора приступать к настройке. Для начала ознакомимся с тем, что у нас находится в каталоге /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 192.168.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

 

Ваша оценка: Нет Средняя: 5 (10 голосов)

Дякую за чудову приблуду

Дякую за чудову приблуду (програму).

Але маю питання:

Зробив все як написано та зробив рестарт syslogd

Чтобы изменения вступили в силу, перестартовываем syslogd.
Кстати, что бы не сбивать с толку наш блокировщик сообщениями вида "last message was repeated 5 times",
предварительно добавим в /etc/rc.conf следующую строку "syslogd_flags="-c""

але всеодно ці повідомлення не пропадають

Dec 13 09:34:16 vhd sshd[21099]: error: PAM: authentication error for root from 193.xxx.xxx.150
Dec 13 09:34:19 vhd last message repeated 2 times
Dec 13 09:34:49 vhd sshd[21171]: error: PAM: authentication error for root from 193.xxx.xxx.150
Dec 13 09:34:53 vhd last message repeated 2 times
Dec 13 09:34:56 vhd sshd[21176]: error: PAM: authentication error for root from 193.xxx.xxx.150
Dec 13 09:34:57 vhd last message repeated 2 times
Dec 13 09:35:01 vhd sshd[21182]: error: PAM: authentication error for root from 193.xxx.xxx.150

можливо ще щось треба зробити?

Спроби авторизуватись з неіснуючими користувачами блокуються гарно, а от коли користувач є, наприклад root або хтось інший,

то з'являються ці повідомлення і блокування не відбувається .(

 

Дуже дивно... Спробуйте

Дуже дивно...

Спробуйте визначити PID, під яким працює syslogd і зупинити його. Після зупинки запустити syslogd знову. Приклад:

# ps -ax | grep syslogd
  603  ??  Ss     0:57,67 /usr/sbin/syslogd -l /var/run/log -l /var/named/var/run/log -s
# kill -9 603
# sh /etc/rc.d/syslogd start
Starting syslogd.

 

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

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})

можно заменить на 2 регулярных выражения

regexp          = sshd.*(?:[Ii]llegal user|[Ii]nvalid user|error for) \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

regexp2         = sshd.*Did not receive identification string from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
 

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

На одном из серверов сменил правила. Тестовый бан отработался.

Проверим, как дальше дело пойдет. Нужно набрать в логах немного статистики...

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

опишите ситуацию с мониторингом 2х служб, наример ssh и VPN или ftp 

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

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

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

Добрый день,

 

тоже очень интересно решение для почты (для других служб). Если у вас появилось время на написание статьи, напоминаю вам, что это было бы интересно.

 

P.S. Благодарю, за потраченное время. 

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

Со временем все также - его катастрофически не хватает! Однако некоторые рекомендации все же дам. Например, добавим поддержку Exim (остальные службы можно по аналогии, главное смотреть формат логов и писать соответствующие регекспы).

Создадим конфигурационный файл bruteblockd для Exim - /usr/local/etc/bruteblock/exim.conf. Содержание (зависит от Вашего формата логов):

regexp=\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\] F=<.*> rejected RCPT .*: Unknown user
regexp2=exim.* \[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\] .* rejected RCPT .* relay not permitted
regexp3=exim.* \[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\] .* rejected RCPT .* Sender verify failed
# Number of failed login attempts within time before we block
max_count = 4
# Time in seconds in which all failed login attempts must occur
within_time = 300
# Time in seconds to block ip in firewall - 15 minutes
reset_ip = 900
# IPFW table number to add "bad" hosts
ipfw2_table_no = 101

Необходимо, чтобы в syslog писались события Exim. Соответственно:

# echo 'mail.notice |exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/exim.conf' >> /etc/syslog.conf

После этого перезапускаем syslog и bruteblock, проверяем результаты...

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

Лучше так не делать. По порядку: Unknown user - проверка всегда должна быть доступна, в т.ч. - для келлаута. Мало-ли кто может отсылать почту от адресов из домена релей или просто сделать описку в адресе - это законно. А залочится весь релей.

relay not permitted - так можно залочить серверы, тестирующие вас на открытый релей.

Sender verify failed - т.е., если один из отправителей описАлся в имейле, то залочим весь релей - замечательно.

Все эти правила лишь сильно вредят - письмо и так не проходит, зато можно залочить вполне нормальные почтовые сервисы. Бороться со спамом нужно средствами самого Exim. А блокировать нужно совсем другое - подборку паролей для SMTP авторизации.

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

Доброго времени суток

Уважаемые коллеги установил эту замечательную программу на FreeBSD 8.3, пользователей блокирует отлично, только есть одно но, если я хочу сбросить применившиеся правила к хосту мне приходиться перезагружать сервер. Подскажите пожалуйста как можно решить данную проблему, потому как обычный перезапуск firewall и демона bruteblock никак не помогают?

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

 Вообщем спасибо за ответ, которого нет:))) Нашел решение данной проблемы, уже и забыл, что писал сюда,сегодня вспомнил и решил написать ответ.

Вообщем для удаления правила bruteblock нужно выполнить команду:

ipfw table №таблицы delete и IP адрес

У меня в системе это номер 3 поэтому я ввожу команду:

ipfw table 3 delete 1.1.1.1

где 3 - это номер таблицы

1.1.1.1 - IP адрес, который мы удаляем из списка запретов

Для просмотра списка заблокированных адресов, в таблице IPFW, вводим команду:

ipfw table 5 list

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

Сорри, "проморгал".
Во время переноса сайта на другой сервер несколько дней почта не "бегала", уведомление о новом комментарии не пришло, а сам коммент видимо не увидел.
Спасибо, что не поленились и поделились информацией. Думаю она кому-то да и пригодится.

Кстати, синтаксис работы с таблицами можно посмотреть в man ipfw:

ipfw table number add addr[/masklen] [value]
ipfw table number delete addr[/masklen]
ipfw table {number | all} flush
ipfw table {number | all} list

 

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

прикрутив цю приблуду до net.inet.tcp.log_in_vain=1

працює

 

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература