Fail2ban

Долговременный бан для тупых ботов

Например, по умолчанию боты, которые пытаются сломать SSH — блокируются на 10 мин (со временем обнаружения 10 мин и 5 попытками).

Потом netfilter выводит их из бана. Результат ниже.

Через 1 минуту после снятия блокировки бот занялся подбором…

Нехорошо. Как с этим бороться?

Можно увеличить сразу время бана для таких ботов. А можно пойти другим путем.

У fail2ban есть же свой лог :)

tail -f /var/log/fail2ban.log

/var/log/fail2ban.log — вот этот его собственный лог мы еще раз отдадим на анализ в fail2ban:

  • три попадания IP в бан
  • период — сутки
  • бан для такого IP — на месяц

в результате совсем «тупые» боты будут блокированы на 30 дней.

пишем фильтр fail2ban_f.conf:

  • первое выражение regex ищет IP-адреса, которые получили Ban
  • второе выражение regex исключает из списка баны, полученные уже правилом {fail2ban}
 
failregex = ^.*?fail2ban\.actions.*?Ban\s+<HOST>$
ignoreregex = ^.*?fail2ban\.actions.*?\\sBan

и джайл fail2ban_d.conf

 
enabled = true 
filter = fail2ban_f 
# block all ports
action = iptables-allports 
logpath = /var/log/fail2ban.log
maxretry = 3
# 1 day 
findtime = 86400 
# 30 days
bantime = 2592000

Проверяем и запускаем.

ВАЖНО
При ограниченных ресурсах VPS возможно получение ошибок вида «iptables: Memory allocation problem». Это желающих сломать (например SSH) больше, чем место под правила блокировок в iptables

Т.е. работает такой себе хороший ботнет с большим количеством IP.
Смотрим:
cat /proc/user_beancounters
Параметр numiptent определяет количество правил iptables, которые мы можем создать. Колонка held показывает текущее значение. Колонка maxheld показывает максимальное пиковое значение. Колонки barrier и limit должны совпадать и определяют максимально доступное для нас значение. Колонка failcnt содержит число ошибочных обращений. Если оно содержит не 0, возможно, выделенных нам ресурсов уже не хватает. Когда held=limit и возникает упомянутое выше сообщение. В этом случае можно написать хостеру тикет с просьбой увеличить значение numiptent.

Но результат работы jail того стоит, 30 дней побудут в бане

Установка Fail2ban на Debian 7

1. Установка программы на VPS выполняется следующим набором команд:

apt-get update && apt-get upgrade
sudo apt-get install fail2ban

2. Повторите п. 2 из двух предыдущих разделов для создания локальной копии конфигурационного файла jail.conf:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

3. Настройка алгоритма работы Fail2ban задается точно таким же образом, как и для операционных систем Ubuntu и CentOS. Вам необходимо активировать нужные секции jail.local (, и прочие, в зависимости от портов, защиту которых вы хотите активировать) и сохранить результаты редактирования конфигурационного файла. Более подробное описание этой процедуры представлено ниже в разделе «Настройка Fail2ban».

4. После правки конфигурационного файла выполните перезапуск Fail2ban командой

sudo service fail2ban restart

Установка Fail2ban на CentOS 6.*

1. Чтобы установить программу на виртуальный сервер, выполните поочередно такие команды:

yum update
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install fail2ban

2. По аналогии с п. 2 в инструкции для Ubuntu создайте локальную копию конфигурационного файла и откройте этот файл для редактирования командами:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

3. Активируйте защиту своего VPS там, где нужно, редактируя содержимое jail.local. Подробная инструкция по настройке представлена далее в разделе «Настройка Fail2ban». Внимательно следите за корректностью пути к файлу хранения логов в значении параметра logpath.

4. После редактирования конфигурационного файла перезапустите Fail2ban командой

sudo service fail2ban restart

Использование

Fail2ban, после чего включите и запустите службу .

fail2ban-client

Утилита fail2ban-client позволяет следить за «клетками» (jails) (reload, restart, status и т.д.). Чтобы увидеть список всех доступных команд, введите:

$ fail2ban-client

Просмотр включённых «клеток» (jails):

# fail2ban-client status

Проверка статуса «клетки» на примере таковой для sshd:

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     9
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   0.0.0.0

Советы и рекомендации

Пользовательская «клетка» SSH

Важно: Зная ваш IP-адрес, злоумышленник может послать пакеты с подменёнными заголовками отправителя, тем самым лишив вас доступа к серверу. Ключи SSH предоставляют отличное решение проблемы брутфорса без подобных последствий.. Отредактируйте файл , добавив эту секцию и обновив список доверенных IP-адресов в :

Отредактируйте файл , добавив эту секцию и обновив список доверенных IP-адресов в :

/etc/fail2ban/jail.d/sshd.local
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8

Примечание:

  • Может понадобиться задать в файле , чтобы разрешить Fail2ban полноценный мониторинг. В противном случае, ошибки ввода пароля могут быть неправильно зарегистрированы.
  • Fail2ban поддерживает IPv6 с версии 0.10. Настройте межсетевой экран соответственно, например, запустите и включите службу .
  • Fail2ban поддерживает работу с пространствами имён журнала (которые задаются с помощью в файлах юнитов). Задайте параметру , к примеру, значение , чтобы активировать эту возможность.

Совет:

  • При использовании фронтендов iptables, например, ufw (англ.), можно использовать вместо iptables.
  • При использовании Shorewall (англ.) можно прописать и также задать значение параметру в файле . В противном случае, правила, добавленные для блокировки IP-адреса, будут влиять только на новые соединения.

Защита службы

Поскольку Fail2ban следует запускать от имени суперпользователя, можно дополнительно защитить службу с помощью systemd.

Создайте конфигурационный drop-in файл для службы :

/etc/systemd/system/fail2ban.service.d/override.conf
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

Параметр (в строке ) позволяет Fail2ban читать любые файлы и каталоги, а и позволяют Fail2ban управлять любым межсетевым экраном c командной оболочкой. См. для получения более подробной информации.

При использовании параметра иерархия файловой системы будет доступна только для чтения, а позволит Fail2ban также вести запись в заданные каталоги.

От имени суперпользователя создайте каталог и пропишите в файл корректный путь :

/etc/fail2ban/fail2ban.local
logtarget = /var/log/fail2ban/fail2ban.log

Для применения изменений в файлах юнитов и перезапустите службу .

Настройка Fail2ban для SSH

Мы можем настроить Fail2ban, изменив файл /etc/fail2ban/jail.conf. Перед изменением сделайте резервную копию этого файла.

ubuntu@ubuntu:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Теперь мы настроим Fail2ban, чтобы предотвратить злонамеренные входы в службу sshd. Откройте файл /etc/fail2ban/jail.local в своем любимом редакторе.

ubuntu@ubuntu:~$ sudo nano /etc/fail2ban/jail.local

Перейдите в раздел и введите параметры конфигурации в разделе .


ignoreip = 127.0.0.1/8 192.168.18.10/32

bantime = 300

maxretry = 2

findtime = 600

ignoreip – это список масок cidr, IP-адресов или DNS-хостов, разделенных пробелом. Добавьте свои доверенные IP-адреса в этот список, и эти IP-адреса будут внесены в белый список и не будут заблокированы fail2ban, даже если они выполнят атаку грубой силы на сервере.

bantime – это время, в течение которого IP-адрес будет заблокирован после определенного количества неудачных попыток доступа к серверу.

maxretry – это максимальное количество неудачных попыток, после которых IP-адрес блокируется fail2ban на определенное время.

findtime – это время, в течение которого, если хост делает неудачные попытки maxretry, он будет заблокирован.

После настройки вышеуказанных параметров теперь мы настроим сервис, к которому будут применяться вышеуказанные правила. По умолчанию Fail2ban имеет предварительно определенные фильтры для различных сервисов, поэтому нам не нужно вводить какие-либо конкретные записи для сервисов. Мы только включаем или отключаем различные службы в файле конфигурации. Откройте файл /etc/fail2ban/jail.local в своем любимом редакторе.

ubuntu@ubuntu:~$ sudo nano /etc/fail2ban/jail.local

Найдите в файле раздел  и введите в него следующие параметры.


enable = true

port = ssh

filter = sshd

logpath = /var/log/auth.log

maxretry = 3
  • enabled определяет, защищена ли эта служба с помощью fail2ban или нет. Если включено – истина, то служба защищена; в противном случае он не защищен.
  • port определяет служебный порт.
  • filter относится к файлу конфигурации, который будет использовать fail2ban. По умолчанию он будет использовать файл /etc/fail2ban/filter.d/sshd.conf для службы ssh.
  • logpath  определяет путь к журналам, fail2ban будет следить за защитой сервиса от различных атак. Для службы ssh журналы аутентификации можно найти в /var/log/auth.log, поэтому fail2ban будет отслеживать этот файл журнала и обновлять брандмауэр, обнаруживая неудачные попытки входа в систему.
  • maxretry определяет количество неудачных попыток входа в систему, прежде чем они будут заблокированы fail2ban.

После применения вышеуказанной конфигурации для fail2ban перезапустите службу, чтобы сохранить изменения.

ubuntu@ubuntu:~$ sudo systemctl restart fail2ban.service

ubuntu@ubuntu:~$ sudo systemctl status fail2ban.service

Отладка работы fail2ban

После добавления правил блокировки ip адресов с помощью fail2ban, я некоторое время наблюдаю за сервером, чтобы проверить правильность работы. Для этого делаю вот такое окно в отдельном мониторе и наблюдаю некоторое время.

Здесь открыт лог postfix, dovecot и fail2ban. Если вижу, что правила отрабатываются корректно, завершаю настройку. На этом этапе могут быть заблокированы валидные ip адреса пользователей, у которых одна из учеток указана с неверным паролем. В итоге он банится по ip и у него вообще перестает работать вся почта. Если это локальные пользователи, то можно всю их подсеть добавить в доверенные, но я бы не рекомендовал так делать. В этом случае вы не узнаете, что кто-то вас перебирает из локальной сети. А это случается не редко.

Запуск fail2ban

Теперь необходимо запустить (или перезапустить) fail2ban и (если это необходимо, например iptables еще не был запущен) iptables.

Для запуска iptables (его нужно запустить первым) выполните следующую команду:

Для перезапуска fail2ban выполните следующую команду:

Для проверки, что fail2ban запущен успешно и правило загружено, выполните следующую команду:
и (если есть второе правило)

Для отображения списка правил iptables выполните следующую команду:

В случае, если Вы только что установили fail2ban / iptables, не забудьте убедиться, что они настроены у Вас стартовать автоматически при загрузке системы!

Работа со списком заблокированных адресов

Просмотр

Получить статистику заблокированных адресов можно следующей командой:

fail2ban-client status <имя правила>

Получить список правил можно командой:

fail2ban-client status

При наличие заблокированных 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 <IP-адрес>

например:

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

После необходимо перечитать правила:

firewall-cmd —reload

Структура конфигурационных файлов

Файлы настроек находятся в каталоге /etc/fail2ban/. Для понимания работы утилиты, рассмотрим их более детально:

action.d/*.* — конфигурация выполняемых действий;

fail2ban.conf — дефолтный конфигурационный файл;

fail2ban.d/*.* — пользовательские настройки администратора для Fail2ban;

filter.d/*.* — шаблоны для анализа логов и настройки шаблонов;

jail.conf — дефолтные настройки сервисов;

jail.d/*.* — пользовательские настройки администратора для сервисов.

Файлы paths-arch.conf, paths-common.conf, paths-debian.conf и paths-opensuse.conf хранят в себе настройки путей для различных операционных систем семейства Linux.

Действия и фильтры

Действия

Файлы с настройкой действий находятся в каталоге /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 из лога)

  • Вопрос — может ли fail2ban работать без файла фильтра? 
  • Нет, не может. Приложению fail2ban необходимо получить IP-адрес из лога — а это как раз делает фильтр с помощью regex

Пишем свой фильтр. Свой фильтр можно создавать с названием myfilter.conf в папке filter.d/

Общая структура фильтра. В файле фильтра может быть два раздела:

  • [INCLUDES} — необязательно
    • before = common.conf
    • after = filtername.local
    • failregex = ….
    • ignoreregex = ….

Раздел указывает на файлы фильтров, которые читаются до или после этого файла. Файл common.conf считывается и помещается перед другими строками в этом файле, а файл filtername.local — после . Эти файлы устанавливают некоторые параметры, которые будут использоваться далее в конфигурации.

Раздел  указывает на выражения regex, которые нужно применить к файлу лога или исключить из обработки.

Формат выражения failregex:

  • должно начинаться с символа ^ — это означает для fail2ban, что будет анализироваться текст после формата даты Y-m-d H:i:s. Есть недокументированная возможность вместо символа ^ использовать свое выражения для формата даты (если в Вашем логе дата формируется по другому), cм. ошибку Debian # 491253
  • директива <HOST> — для определения IP-адреса в строке лога (для версии ниже 0.10 работает только для IP v4). Этот тэг <HOST> — внутренняя замена fail2ban регулярного выражения (?:::f{4,6}:)?(?P<host>\S+)

Итого вида failregex = ^ регулярное выражение <HOST> регулярное выражение

Правила, используемые вашей версией fail2ban, зависят от версии питона, используемого в системе.

# python -V
Python 2.7.13

У нас фильтр будет относительно простой, т.к. в логе уже собраны адреса IP только «вредителей», не нужно дополнительно искать по условию regex текстовую строку с описанием ошибки. Нам нужно простое регулярное выражение, которое будет «видеть» IP в строках лога.

failregex = ^ <HOST>

Проверим, как работает фильтр (команда + лог + фильтр). Для проверки может быть в качестве фильтра использован или файл с фильтром или сам фильтр (в  кавычках)

fail2ban-regex /var/www/user/data/www/_mylog/test.log  '^ <HOST>'

удобно тестировать по одной строке.

Результат

  • 311 совпадений найдено
  • формат даты распознан

Итого наш вариант файла testfilter.conf для папки filter.d

failregex = ^ <HOST>
ignoreregex =

Проверяем полностью

fail2ban-regex /var/www/user/data/www/_mylog/test.log /etc/fail2ban/filter.d/testfilter.conf

Вот кстати, полный отчет fail2ban по обнаружению формата даты в логе

Date template hits:
|-  date format
|  Day(?P<_sep>)MON(?P=_sep)Year?24hour:Minute:Second(?:.Microseconds)?(?: Zone offset)?
|  (?:DAY )?MON Day 24hour:Minute:Second(?:.Microseconds)?(?: Year)?
|  Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
|  Day(?P<_sep>)Month(?P=_sep)(?:Year|Year2) 24hour:Minute:Second
|  Month/Day/Year:24hour:Minute:Second
|  Month-Day-Year 24hour:Minute:Second.Microseconds
|  TAI64N
|  Epoch
|  Year-Month-Day24hour:Minute:Second(?:.Microseconds)?(?:Zone offset)?
|  ^24hour:Minute:Second
|  ^<Month/Day/Year2@24hour:Minute:Second>
|  ^Year2MonthDay ?24hour:Minute:Second
|  MON Day, Year 12hour:Minute:Second AMPM
|  ^MON-Day-Year2 24hour:Minute:Second

Блокировка всех портов кроме HTTP, HTTPS и SSH

sudo touch /etc/iptables.firewall-rules

*filter
# Разрешаем весь внутренный трафик на интерфейсе lo и запрещаем внутренний трафик, который не
использует lo
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Разрешаем все уже установленные входящие соединения
-A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем весь исходящий трафик
-A OUTPUT -j ACCEPT
# Разрешаем все входящие HTTP и HTTPS соединения
-A INPUT -p tcp —dport 80 -j ACCEPT
-A INPUT -p tcp —dport 443 -j ACCEPT
# Разрешаем подключение на порт 49681 для SSH
-A INPUT -p tcp -m state —state NEW —dport 49681 -j ACCEPT
# Разрешаем пинг
-A INPUT -p icmp -m icmp —icmp-type 8 -j ACCEPT
# Запишем в лог все соединения, что были сброшены файерволом
-A INPUT -m limit —limit 5/min -j LOG —log-prefix «iptables denied: » —log-level 7
# Запретим все соединения, что явно не разрешены
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT

sudo touch /etc/network/if-pre-up.d/firewall
sudo chmod +x /etc/network/if-pre-up.d/firewall

#!/bin/sh
/sbin/iptables-restore

Первый раз указанную в скрипте команду нужно выполнить вручную от суперпользователя, чтобы сразу после
настройки включить защиту, а при дальнейших перезагрузках ОС правила будет добавлять скрипт.
Проверить, какие правила добавлены в iptables можно следующим способом:

sudo iptables -L

Динамическая защита от ботов при помощи fail2ban

Fail2ban обычно не входит в базовый набор утилит системы, и её нужно установить:

sudo apt-get install fail2ban

Перед началом работы рекомендуется сделать копию конфигурационного файла и вносить изменения только в
него, так как оригинальный конфиг может быть перезаписан при обновлении:

cd /etc/fail2ban/ && cp jail.conf jail.local

Утилита fail2ban из коробки имеет несколько готовых фильтров для Apache, но я бы рекомендовал создать
свои: один для лога access, а второй — для error. Виртуальные хосты следует настроить таким образом,
чтобы эти логи для всех сайтов были общими, что позволяет защищать все сайты на сервере сразу при
помощи всего лишь двух фильтров. Создадим пустые файлы для фильтров:

cd /etc/fail2ban/filter.d/
touch apache-access.conf
touch apache-error.conf

Примерное содержимое для фильтра apache-access.conf:

# Apache Access Filter

failregex =
^.* ‹HOST› .*///.*
^.* ‹HOST› .*\\\.*
^.* ‹HOST› .*w00tw00t.*
^.* ‹HOST› .*WinHttpRequest.*
ignoreregex =

Его можно и нужно дополнять новыми строками в секции failregex на основании того, какую подозрительную
активность вы нашли в логе access.log. Выше блокируются запросы, содержащие слова
«w00tw00t», «WinHttpRequest» или по три слеша в ту или другую сторону. Фильтр для
error.log имеет точно такую же структуру:

# Apache Error Filter

failregex =
^.*\.*w00tw00t.at.ISC.SANS.DFind.*
^.*\.*Lost connection to MySQL server during query.*
^.*\.*client denied by server configuration.*
^.*\.*Invalid URI in request.*
^.*\.*/admin.php’ not found or unable to stat
^.*\.*/wp-login.php’ not found or unable to stat
^.*\.*/vam_rss2_info.php’ not found or unable to stat
^.*\ File does no exist: .*typo3
^.*\ File does no exist: .*hostcmsfiles
^.*\ File does no exist: .*administrator
^.*\ File does no exist: .*bitrix
^.*\ File does no exist: .*bbadmin
^.*\ File does no exist: .*WebAdmin
^.*\ File does no exist: .*webmanage
^.*\ File does no exist: .*fck
^.*\ File does no exist: .*fckeditor
^.*\ File does no exist: .*web
ignoreregex =

В файл конфига jail.local в разделе HTTP servers необходимо подключить недавно созданные фильтры.
Правильно укажите пути до файлов с логами, иначе работать не будет:

enabled = true
port = http,https
filter = apache-access
logpath = /path/to/access.log
maxretry = 1
findtime = 600
bantime = 86400

enabled = true
port = http,https
filter = apache-error
logpath = /path/to/error.log
maxretry = 1
findtime = 600
bantime = 86400

Полезно заодно включить (поменять с false на true поле enabled) предустановленные фильтры и
. Для того, чтобы активировать защиту, перезапустим fail2ban:

sudo service fail2ban restart

После этого фильтры fail2ban и список заблокированных за плохое поведение IP-адресов можно будет
увидеть в выводе команды:

sudo iptables -L

Результат

Пришло время подвести итог. Наш юный сервер стал уже не таким доверчивым, он не реагирует на пакеты,
приходящие на порты, отличные от HTTP, HTTPS и SSH. Он может оценить, хорошо ли ведёт себя тот или
иной клиент, и забанить в противном случае. Он будет защищаться при попытке взлома SSH.

Конфигурационный файл Fail2ban

Настройки Fail2ban хранятся в конфигурационном файле .

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

Менять какие-либо параметры напрямую в файле не рекомендуется. Вместо этого необходимо создать новый файл , разместив его в той же директории.

Можно либо сделать копию оригинального файла (может быть удобно, если вы планируете настроить Fail2ban для защиты нескольких служб, не только SSH):

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Либо создать пустой файл с таким именем и внести нужные параметры в него:

sudo touch /etc/fail2ban/jail.local

В новом файле будет достаточно указать только те настройки, значения которых вы хотите изменить: для всех параметров, которые вы не пропишете отдельно, Fail2ban будет применять значения по умолчанию.

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

Выставить защиту вашего FTP сервера так же не трудно. Однако, перед настройкой вы должны учесть, какой из FTP вы используте (vsFTPd, proFTPd, Pure-FTPd etc), настройки могут отличаться. Например, если вы используете Pure-FTPd, добавим секцию для фильтра в главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local


enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = pure-ftpd
logpath = /var/log/messages
maxretry = 3

Создадим фильтр:

root@host:~$ vim /etc/fail2ban/filter.d/pure-ftpd.conf



__errmsg = (?:Authentication failed for user)
failregex = pure-ftpd(?:\)?: \(.+?@\) \ %(__errmsg)s \\s*$
pure-ftpd: \(\?\:?@\) \ (?:Authentication failed for user) \\s*$
ignoreregex =

Управление правилами fail2ban

Временное отключение блокировки IP адреса

Для этого Вам необходимо воспользоваться услугой iptables. Сначала мы выведем список правил на консоль, а затем выбрав нужные IP, удалим их из бана.

Для просмотра списка правил введите команду:

Вы увидите сообщение следующего вида:

Нас интересует удалить из бана IP адрес 1.2.3.4, который (как мы видим) находится в цепочке правил (chain) под названием fail2ban-ASTERISK. Набираем команду:

В случае успешного выполнения команды никаких сообщений не появится, и если мы теперь снова запустим команду

то увидим, что IP адрес исчез из блокировки iptables (хотя и остался в блокировке fail2ban!). При этом мы снова можем подключаться к серверу asterisk

Постоянное отключение блокировки IP адреса

Для того, чтобы fail2ban не блокировал определенный IP адрес (или несколько IP адресов) независимо от того, сколько неудачных попыток подбора пароля (и прочих “неправомерных” действий) они совершили, необходимо произвести дополнительную настройку jails в файле /etc/fail2ban/jail.conf

В каждом правиле файла jail.conf может присутствовать параметр ignoreip, который задает список IP адресов, попадающих в “белый список” для этого правила

Поскольку правил у нас может быть два, обратите внимание, что Ваш IP необходимо прописывать в обоих правилах!. Параметр имеет следующий вид:

Параметр имеет следующий вид:

То есть Вы можете прописывать как подсети, так и отдельные IP адреса (в данном случае в “белый список” попадают IP 127.0.0.1-127.0.0.255, 192.168.0.1-192.168.255.255 и 1.2.3.4).

Разблокировка IP адреса, с которого производилось тестирование

Во время проверки правильности настройки fail2ban Вы неоднократно запускали SIP клиента для тестирования работы по блокировке будущих атак из интернета. И в процессе последующей работы Вам, возможно, также понадобится время от времени производить действия, последствиями которых может быть блокировка со стороны fail2ban / iptables. Хотелось бы не дожидаться, когда fail2ban “соизволит” разблокировать IP сам (а это может быть довольно долго – поскольку параметр bantime можно выставить хоть на час, хоть на день, хоть на год).

Существуют 2 пути решения подобной проблемы:

  1. Внести IP адрес в правилах fail2ban в список ignoreip. Но иногда это может быть нежелательно (чтобы, например, производить периодическое тестирование работы fail2ban)
  2. Обычно время findtime (это длительность интервала в секундах, за которое событие должно повториться maxretry раз, после чего бан вступит в силу) намного меньше, чем bantime (это время бана в секундах, по истечении которого IP адрес удаляется из списка заблокированных). Например, findtime выставляется в 10 минут, а bantime – час. Либо findtime – час, а bantime – день или даже больше. И так далее. Поэтому имеет смысл сделать паузу длительностью не менее, чем findtime с момента последнего тестирования (и забанивания Вашего IP адреса), после чего перезагрузить сервис fail2ban. При перезагрузке сервиса fail2ban все блокировки аннулируются. Однако при последующей загрузке fail2ban логи анализируются снова, и если в логах в течение findtime было maxretry неудачных попыток подключения с одного IP, этот IP будет снова забанен сразу после запуска fail2ban.

Тестирование конфигурации fail2ban

Вы можете проверить, как будет применяться фильтр fail2ban к тому или иному логу. Для этого можно запустить команду:

Где /var/log/asterisk/messages – это пример пути к файлу с логами, который будет фильтроваться, а /etc/fail2ban/filter.d/asterisk.conf – сам фильтр, который содержит те фрагменты , которые должны быть в логе .

И напоследок: вместо перезагрузки fail2ban с помощью  можно выполнить следующую команду 

Защита NGINX

a) Фильтр аутентификации

Допустим, на ваших сайтах есть разделы требующие аутентификации. Выполнить базовую защиту этих разделов от подбора паролей так же поможет Fail2ban. По умолчанию, защита NGINX доступна из коробки, однако её необходимо активировать. Для этого, в конфигурационном файле /etc/fail2ban/jail.conf находим блок , где изначально указан только logpath. Добавляем в него значения:

root@host:~$ vim /etc/fail2ban/jail.local

на выходе у нас должно получиться следующее:

enabled = true
filter   = nginx-http-auth
port     = http,https
bantime = 600
maxretry = 6

logpath = %(nginx_error_log)s

Обратите внимание на то, как указаны пути к логам. Начиная с версии Fail2ban 0.9.х, писать полные пути не обязательно

Если расположение логов защищаемого сервиса стандартное, то пути к ним предусмотрены разработчиками. Значение %(nginx_error_log)s будет равнозначно пути /var/log/nginx/error. log. Вы можете использовать оба варианта.

Теперь создадим файл nginx-http-auth.conf

root@host:~$ vim /etc/fail2ban/filter.d/nginx-http-auth.conf

В который вносим следующие значения, которые являются фильтрами для корректной работы правила:

failregex = ^ \ \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"),
client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

            ^ \ \d+#\d+: \*\d+ no user/password was provided for basic authentication,
client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

б) Фильтр доступа к скриптам

Fail2ban является довольно гибки и функциональным инструментом. Если необходимого инструмента в jail.conf нет, опытный администратор может его написать сам. Например, мы хотим заблокировать ip адрес, который обращается к файлам с расширениями php, asp, exe, pl, cgi, scgi. Это очень полезный фильтр для обнаружения всякого рода эксплойтов.

Внимание! Будьте внимательны при использовании этого фильтра. Оно имеет смысл если у вас статический сайт, или вы четко уверены, к выполнению каких скриптов необходимо применить фильтрацию

Если сайт разрабатывали не вы, обратитесь за консультацией к разработчику

Для начала отредактируем главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

В него необходимо добавить секцию , которая по умолчанию не существует:

enabled = true
port = http,https
filter = nginx-noscript
logpath = %(nginx_access_log)s
bantime = 600
maxretry = 6

Теперь создадим файл фильтра, к которому будет отсылаться наше правило при анализе access.log web-сервера:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-noscript.conf

Вносим в него следующее:

failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =

Изменения вступят в силу после перезагрузки сервиса Fail2ban

root@host:~$ systemctl restart fail2ban

в) Фильтр сканеров

Сами по себе сканеры не несут какой либо угрозы сайту, однако сканирование вашего сайта может быть тем самым звоночком, что злоумышленник ищет его уязвимые места. Определить сканеры легко по всплеску ошибок 403 и 404 в /var/log/nginx/access.log. Итак, приступим:

root@host:~$ vim /etc/fail2ban/jail.local

Добавляем следующие блоки:

enabled = true
filter = nginx-404
port = http,https
logpath = %(nginx_access_log)s
bantime = 86400
findtime = 600
maxretry = 30


enabled = true
filter = nginx-403
port = http,https
logpath = %(nginx_access_log)s
bantime = 86400
findtime = 600
maxretry = 30

Создаем правило фильтрации для ошибок 403:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-403.conf


failregex = ^ .* "(GET|POST) +" 403
ignoreregex = .*(robots.txt|favicon.ico|jpg|png)

Создаем правило фильтрации для ошибок 404:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-404.conf


failregex = ^ .* "(GET|POST) +" 404
ignoreregex = .*(robots.txt|favicon.ico|jpg|png)

Перезапускаем сервис:

root@host:~$ systemctl restart fail2ban

Рассмотренный фильтр так же очень полезен при настройке фильтрации для web-сервера Apache. Он служит своего рода защитой от DDoS аттак и существенно может улучшить производительность web-сервера. Логика данного фильтра следующая: 404 — это код состояния HTTP, который указывает, что запрошенная веб-страница не может быть найдена на сервере. Другими словами, запрошенная веб-страница не существует или не работает.

И хакеры используют это как инструмент DDoS. Они генерируют тысячи запросов в минуту к несуществующим веб-страницам, что приводит к снижению производительности web-сервера или его полной неработоспособности.

Заключение

Такая нехитрая и эффективная в некоторых случаях защита у нас получилась. Я в течении дня собираю около тысячи попыток залогиниться через wp-admin. Не все боты долбятся 3 раза подряд и попадают в бан. Я бы даже сказал, большая часть этого не делает. Но они и не представляют опасности. Подобная этой настройка защитит в первую очередь от массового нашествия, которое способно серьезно замедлить работу сайта и хостинга в целом. Закрытие доступа на уровне iptables очень эффективный способ сохранить ресурсы сервера.

Помогла статья? Подписывайся на telegram канал автора

Рекомендую полезные материалы по схожей тематике:

Онлайн курс по Linux

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Administrator Linux. Professional» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Что даст вам этот курс:

  • Знание архитектуры Linux.
  • Освоение современных методов и инструментов анализа и обработки данных.
  • Умение подбирать конфигурацию под необходимые задачи, управлять процессами и обеспечивать безопасность системы.
  • Владение основными рабочими инструментами системного администратора.
  • Понимание особенностей развертывания, настройки и обслуживания сетей, построенных на базе Linux.
  • Способность быстро решать возникающие проблемы и обеспечивать стабильную и бесперебойную работу системы.

Проверьте себя на вступительном тесте и смотрите подробнее программу по .

Важность своевременного обновления сервера — взлом centos сервера через уязвимость bash.
Эпидемия вируса шифровальщика vault — как защитить свои данные.

Базовая настройка centos для обеспечения минимальной защиты сервера.

Создание резервной копии сайта и ее хранение на Яндекс.Диске.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: