Когда-то эта тема уже подымалась [1]. Рассматривалось решение блокировки 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: !* and restart syslogd. Also you should add ipfw2 table and the corresponding deny rule. # ipfw add deny ip from table(1) to any Next, you'll want to setup periodical cleanup of ipfw2 table. Add following bruteblockd_enable="YES" 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 адресов
regexp = sshd.*Illegal user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) # Количество неудачных попыток входа в течении времени within_time, max_count = 4 # Время, в секундах в течении которого должны произойти max_count within_time = 300 # Время жизни правила блокировки, по истечению которого bruteblockd # 30 минут # Номер таблицы ipfw2 |
Конфигурационный файл готов. Думаю, исходя из подробных коментариев, все понятно. А стандартные регулярные выражения немного сменил, исходя из анализа лог-файлов. Также можете устанавливать свои значения счетчика, времени и таблицы 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 |
Собственно запуск...
# 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 |