- Как защитить SSH сервер от атаки методом перебора (грубой силой — брут-форсинга) используя fail2ban
- Установка Fail2ban на Linux
- Для установки fail2ban на CentOS или RHEL, сначала, установите репозиторий EPEL, и затем выполните следующую команду.
- Для установки fail2ban на Fedora, просто запустите:
- Для установки fail2ban на Ubuntu, Debian или Linux Mint:
- Настройка Fail2ban для SSH сервера
- Тестирование защиты с Fail2ban на SSH от атаки перебором паролей
- Проверка статуса Fail2ban и разблокировка заблокированных IP адресов
- Установка Fail2ban на автозагрузку и включении
- Настройка и использование Fail2ban на Linux
- Установка и запуск
- Базовая настройка
- Настройка правил
- Исключения
- Действия и фильтры
- Действия
- Фильтры
- Примеры правил
- CentOS
- Ubuntu
- Asterisk
- NGINX
- NGINX DDoS (req limit)
- Работа со списком заблокированных адресов
- Просмотр
- Удаление
- Аналоги
Как защитить SSH сервер от атаки методом перебора (грубой силой — брут-форсинга) используя fail2ban
Одной из распространённых атак на службу SSH является атака методом перебора, когда удалённый атакующий бесконечно пытается залогиниться с различными паролями. Конечно, есть аргументы против аутентификации с помощью паролей для SSH, и есть альтернативные механизмы аутентификации, такие существующие варианты как аутентификация с публичным клюём или двух-факторная аутентификация сведут на нет атаку брут-форсингом. Не в даваясь в дискуссию о преимуществах и недостатках различных методов аутентификации, давайте рассмотрим ситуацию, когда необходима аутентификация паролем. Как вы защитите ваш SSH сервер против атак грубой силой?
fail2ban — это хорошо известный, с открытым кодом фреймворк по предотвращению вторжений для Linux, он мониторит различные лог-файлы системы (например, /var/log/auth.log or /var/log/secure) и автоматически задействуют различные способы защиты против выявленных подозрительных действий. На самом деле, fail2ban может быть очень полезен для защиты против атак по перебору паролей на SSH сервер.
В этом уроке я продемонстрирую как установить и настроить fail2ban для защиты SSH сервера против атак брут-форсингом с удалённых IP адресов.
Установка Fail2ban на Linux
Для установки fail2ban на CentOS или RHEL, сначала, установите репозиторий EPEL, и затем выполните следующую команду.
Для установки fail2ban на Fedora, просто запустите:
Для установки fail2ban на Ubuntu, Debian или Linux Mint:
Настройка Fail2ban для SSH сервера
Сейчас вы готовы для конфигурирования fail2ban для усиления вашего SSH сервера. Вам нужно отредактировать конфигурационный файл в /etc/fail2ban/jail.conf. Конфигурационный файл содержит секцию «DEFAULT», где вы определяете параметры по умолчанию для всех сервисов, которые мониторятся, и специфичные для каждого сервиса секции, где вы определяете любые специфичные для сервиса джэйлы (например SSH, Apache и т. д.) для перезаписи параметров по умолчанию.
В секции джейлов определённых сервисов (где-то после секции [DEFAULT]) вам нужно задать секцию [ssh-iptables], где вы зададите особые настройки для джэйлов SSH. Текущий бан IP адресов делается iptables.
Последующий пример в /etc/fail2ban/jail.conf, который содержит настройку джэйла «ssh-iptables». Конечно, там могут быть и другие джейлы для разных приложений, в зависимости от ваших нужд.
В соответствии с приведённой конфигурацией, fail2ban будет автоматически банить любые удалённые IP адреса, с которых поступило хотя бы 3 неудачных попытки за последние 10 минут. Однажды забаненный, IP нарушителя будет оставаться заблокированным в течение 24 часов. Уведомление об этом событии будет отправлено по почте.
После того, как конфигурационный файл готов, перезапустите службу fail2ban как показано ниже.
На Debian, Ubuntu или CentOS/RHEL 6:
На Fedora или CentOS/RHEL 7:
Чтобы проверить, успешно ли запущен fail2ban, выполните команду fail2ban-client с аргументом «ping». Если служба fail2ban запущена нормально, вы должны увидеть ответ «pong».
Тестирование защиты с Fail2ban на SSH от атаки перебором паролей
Чтобы проверить, работает ли fail2ban, попробуйте войти на сервер SSH используя неверный пароль для симуляции брут-форс атаки. В то же время, проверяйте /var/log/fail2ban.log, который записывает все интересные события, которые происходят в fail2ban.
Согласно логу выше, fail2ban забанил IP адрес 192.168.1.8, поскольку выявил множественные ошибки в попытка залогиниться на SSH с этого IP адреса.
Проверка статуса Fail2ban и разблокировка заблокированных IP адресов
Джейл «ssh-iptables» в fail2ban использует iptables для блокировки IP адресов нарушителей, вы можете легко проверить бан, посмотрев текущие правила iptables как показано ниже.
Если вы хотите разблокировать IP адреса от fail2ban, вы можете также выполнить команду iptables:
В то время, как вы можете проверять и управлять списком заблокированных IP в fail2ban вручную с помощью команд iptables, как было показано, верным способом, на самом деле, является использование инструмента командной строки ail2ban-client. Этот инструмент позволяет вам управлять не только джэйлом «ssh-iptables», но также любыми другими типами джэйлов fail2ban в унифицированным интерфейсе командной строки.
Для проверки статуса fail2ban (который покажет список активных в настоящее время джейлов):
Чтобы проверить статус конкретного джейла (например, ssh-iptables):
Вышеприведённая команда покажет список забаненных IP адресов.
Для разблокировки конкретного IP адреса:
Обратите внимание, если вы остановите fail2ban, все заблокированные IP адреса будут разблокированы. Когда вы перезапустите fail2ban, он найдёт список IP адресов нарушителей из /var/log/secure (или /var/log/auth.log) и перезабанит эти IP адреса, если не истекло время бана.
Установка Fail2ban на автозагрузку и включении
После того, как вы успешно протестировали fail2ban, последним шагов по задействованию fail2ban является автоматический запуск при включении питания сервера. На основанных на Debian дистрибутивах, автозапуск fail2ban включен по умолчанию. На основанных на Red Hat дистрибутивах, включите автостарт следующим способом.
На CentOS/RHEL 6:
На Fedora или CentOS/RHEL 7:
В этом уроке я продемонстрировал как установить и настроить fail2ban для защиты SSH сервера. Хотя fail2ban может смягчить атаку перебором паролей, пожалуйста помните, он не может защитить SSH сервера против сложных (распределённых) кампаний по брут-форсингу, когда атакующие обходят fail2ban используя тысячи подконтрольных ботам IP адресов.
Источник
Настройка и использование Fail2ban на Linux
Описывая Fail2ban в двух словах, можно сказать, что он позволяет на основе анализа логов блокировать тех, кто злоупотребляет доступностью сервера по сети. Например, защитить почтовые ящики от взлома путем перебора паролей или многократного запроса какого-либо ресурса.
Читая некоторые статьи в интернете, может сложиться неправильное мнение, что Fail2ban нужен только для защиты от брут-форс атак (перебор паролей). На самом деле, данный программный продукт — система реагирования на подозрительные действия.
Установка и запуск
Для систем на базе пакетов Debian или Red Hat команды будут немного отличаться.
CentOS / Red Hat:
yum install fail2ban
Ubuntu / Debian:
apt-get install fail2ban
CentOS 6:
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install fail2ban
Для запуска службы вводим следующие команды:
systemctl enable fail2ban
systemctl start fail2ban
* Для старых систем без systemd это будут команды chkconfig fail2ban on / update-rc.d fail2ban defaults и service fail2ban start.
Базовая настройка
Процесс настройки fail2ban не зависит от дистрибутива Linux. Основной конфигурационный файл находится по пути /etc/fail2ban/jail.conf. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.
Для начала создаем первый файл, в котором будут храниться настройки по умолчанию:
Приведем его к виду. Настройка будет немного отличаться в зависимости от операционной системы.
а) для CentOS / Red Hat:
[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
ignoreip = 127.0.0.1/8
б) для Ubuntu / Debian:
[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = iptables
ignoreip = 127.0.0.1/8
- maxretry — количество действий, которые разрешено совершить до бана.
- findtime — время в секундах, в течение которого учитывается maxretry;
- bantime — время, на которое будет блокироваться IP-адрес;
- action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска;
- ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.
* В данном примере, если в течение 8 минут (480) будет найдено 5 строк (maxretry = 4), содержащих критерий фильтра, Fail2ban заблокирует IP-адрес, с которого идет подключение на 12 минут (720);
* В секции [DEFAULT] хранятся общие настройки для всех правил. Каждую из настроек можно переопределить при конфигурировании самого правила.
Настройка правил
Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d, например:
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 10
findtime = 600
- ssh — название для правила;
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
- action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
* обратите внимание, что мы переопределили параметры по умолчанию maxretry, findtime и action.
Чтобы изменения вступили в силу, перезапускаем сервис:
systemctl restart fail2ban
* в старых версиях service fail2ban restart.
Исключения
Для гарантии, что fail2ban не заблокирут компьютер администратора или другой важный узел, предусмотрена настройка исключений с помощью опции ignoreip. Опция может быть применена как на глобальном уровне (default), так и для конкретного правила.
Для того, чтобы задать общую настроку, откроем наш файл default:
[DEFAULT]
.
ignoreip = 192.168.0.0/24 95.95.95.95
* в данном примере под фильтры не будут попадать адреса с 192.168.0.1 по 192.168.0.255 и адрес 95.95.95.95.
Для конкретного правили настройки будут, примерно, следующие:
[ssh]
.
ignoreip = 192.168.1.22
* в данном примере мы добавили в белый список один адрес 192.168.1.22, который не будет блокироваться.
Обязательно перезагружаемся, чтобы настройки применились:
systemctl restart fail2ban
* добавление адреса в белый список не удаляет его из блокировки. Поэтому, если IP попал в блок, нужно будет его удалить вручную.
Действия и фильтры
Действия
Файлы с настройкой действий находятся в каталоге /etc/fail2ban/action.d. Чтобы блокировать адрес, Fail2ban создает правило в брандмауэре netfilter. Для этого, чаще всего, используются утилиты iptables или firewall-cmd. Последняя применяется в последних версиях CentOS / Red Hat / Fedora. iptables более универсальная и может использоваться, почти, во всех системах Linux.
Остановимся на описании самых используемых действий:
- iptables — создание простого правила в netfilter с помощью одноименной утилиты;
- iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
- iptables-ipset — использование ipset для придания более лаконичного вида правилам;
- iptables-allports — блокирует для адреса все порты;
- firewallcmd-new — создание простого правила в netfilter с помощью firewall-cmd;
- firewallcmd-ipset — добавляет правила с помощью утилиты firewall-cmd, используя ipset;
- firewallcmd-rich-rules — создает rich-rules при помощи firewall-cmd.
Подробнее, как создаются правила в netfilter при помощи iptables и firewalld.
Фильтры
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d.
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шпаргалки.
Примеры правил
В данных примерах блокировка IP-адреса будет происходить на 12 минут после 4-х попыток ввода пароля в течение 8 минут. Эти параметры берутся из настроек [DEFAULT]. Если их нужно переопределить, просто добавляем их при описании правила.
CentOS
[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure
Ubuntu
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd]
logpath = /var/log/auth.log
Asterisk
[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/messages
NGINX
[nginx]
enabled = true
port = http,https
filter = nginx-http-auth
action = iptables-multiport[name=nginx, port=»http,https», protocol=tcp]
logpath = /var/log/nginx/error.log
NGINX DDoS (req limit)
Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правило может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
Для начала, необходимо настроить NGINX:
В раздел http добавим:
http <
.
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
.
* данная настройка создает зону с интенсивностью запросов в 1 запрос в секунду.
После настраиваем лимит для конкретного виртуального домена в разделе server — location:
server <
.
location / <
.
limit_req zone=one burst=5 nodelay;
.
* данная настройка вместе с предыдущей зоной, созданной в секции http, позволит лимитировать запросы — 1 запрос в секунду при всплеске 5 запросов.
Проверяем конфигурационный файл nginx и перезапускаем сервис:
systemctl reload nginx
В лог-файле (по умолчанию /var/log/nginx/error.log) при превышении лимита подключения мы должны увидеть запись на подобие:
2020/11/16 19:11:08 [error] 1330844#1330844: *16640836 limiting requests, excess: 10.520 by zone «one», client: xxx.xxx.xxx.xxx, server: dmosk.ru, request: «GET / HTTP/1.1», host: «dmosk.ru», referrer: «https://dmosk.ru/page1»
* обратите внимание, что в вашем случае путь до лога может быть другой. Он определяется в конфигурационном файле NGINX.
Теперь можно приступать к настройке fail2ban. Создаем фильтр:
[Definition]
ngx_limit_req_zones = [^»]+
failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone «(?:%(ngx_limit_req_zones)s)», client:
ignoreregex =
* данный файл может быть уже создан и настроен при установке fail2ban. Если это так, то ничего не меняем и идем дальше.
Создаем правило в fail2ban:
[nginx-ddos]
enabled = true
port = http,https
filter = nginx-limit-req
action = iptables-multiport[name=nginxddos, port=»http,https», protocol=tcp]
logpath = /var/log/nginx/error.log
* еще раз обращаю внимание на путь logpath — в вашем случае он может быть другим.
После настройки не забываем перезапустить fail2ban:
systemctl restart fail2ban
Работа со списком заблокированных адресов
Просмотр
Получить статистику заблокированных адресов можно следующей командой:
Получить список правил можно командой:
При наличие заблокированных IP-адресов мы увидим, примерно, следующее:
`- action
|- Currently banned: 2
| `- IP list: 31.207.47.55 10.212.245.29
С помощью iptables:
iptables -L -n —line
С помощью firewall-cmd:
firewall-cmd —direct —get-all-rules
Удаление
Средствами fail2ban:
Для удаление адреса из списка вводим:
fail2ban-client set unbanip
fail2ban-client set ssh unbanip 31.207.47.55
С помощью iptables:
iptables -D -s IP-адрес
iptables -D fail2ban-ssh -s 10.212.245.29
С помощью firewall-cmd:
firewall-cmd —direct —permanent —remove-rule
firewall-cmd —direct —permanent —remove-rule ipv4 filter f2b-sshd 0 -s 188.134.7.221
После необходимо перечитать правила:
Аналоги
Если быть честным, достойных аналогов нет. Вот что-то похожее:
- tallow — сырая и еще не готовая для продуктивного использования. Также мало документации.
- RDPDefender — удобный аналог для Windows, но только для защиты RDP.
- IPBan — для Windows. Настройка из командной строки.
- ts_block — для Windows.
Источник