Рейтинг:0

Fail2ban на CentOS 7 с запретом Traefik на базе Docker без добавления правила iptables

флаг fr

Я настроил экземпляр Traefik, запускаемый движком Docker в режиме Swarm, с «классической» конфигурацией (см. ниже, для краткости я помещаю только важные [для меня] части. Не стесняйтесь спрашивать более подробную информацию, если вам это нужно).

Установлен Fail2Ban, а также firewalld (дистрибутив CentOS). Пока что я поставил простую настройку фильтра/джейла, в основном для блокировки DOS и брутфорса, просматривая лог доступа Traefik.

Моя проблема: когда я пытаюсь с Никто или же Гидра, я вижу, что мой пробный IP-адрес был занесен в черный список:

# статус клиента fail2ban symfony-auth
Статус для джейла: symfony-auth
|- Фильтр
| |- В настоящее время не удалось: 3
| |- Всего неудачно: 906
| `- Список файлов: /var/log/traefik/access.log
`- Действия
   |- В настоящее время забанено: 1
   |- Всего забанено: 2
   `- Список запрещенных IP-адресов: 37.19.218.169

Но ничего не меняется в части правил iptables, и я вижу, что данный IP-адрес не заблокирован.Более того, если я попытаюсь перейти на сайт с заблокированного IP, я смогу это сделать, даже если он забанен.

Я должен добавить, что у меня есть 00-файл firewalld.conf, с инструкциями по умолчанию относительно действий для этого дистрибутива:

# кот /etc/fail2ban/jail.d/00-firewalld.conf
# Этот файл является частью пакета fail2ban-firewalld для настройки использования
# действия firewalld как действия по умолчанию. Вы можете удалить этот пакет
# (вместе с пустым мета-пакетом fail2ban), если вы не используете firewalld
[ПО УМОЛЧАНИЮ]
banaction = firewallcmd-rich-rules[actiontype=<мультипорт>]
banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
бэкэнд = systemd

Наконец, у меня нет разницы во времени, как указано здесь.

# хвост /var/журнал/сообщения
12 июл 13:28:05 ....
# timedatectl
               Местное время: пн 2021-07-12 13:30:18 UTC
           Всемирное время: пн 2021-07-12 13:30:18 UTC
                 Время RTC: Пн 2021-07-12 13:30:13
                Часовой пояс: UTC (UTC, +0000)
Синхронизация системных часов: да
              Служба NTP: активна
          RTC в местной ТЗ: нет


Так почему же мой заблокированный IP-адрес все еще может достичь целевого веб-сайта? Спасибо за ваши выводы и просветления.

Фрагменты

Траефик докер-compose.yml

Ведущая часть

версия: "3.3"

Сервисы:
  обратный прокси:
    изображение: "traefik:v2.4"
    команда:
      # Конфигурация журнала
      #- "--log.level=ОТЛАДКА"
      - "--log.filepath=/var/log/traefik/traefik.log"
      - "--accesslog.filepath=/var/log/traefik/access.log"
     

Объемная часть :

    # ...
    тома:
      # Чтобы сохранить сертификаты
      - traefik-сертификаты:/letsencrypt
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - /var/журнал/traefik:/var/log/traefik/
    # ...

Fail2Ban

Мой фильтр

/etc/fail2ban/filter.d/my_filter.conf

[Определение]
failregex = ^<HOST>.*"(GET|POST|HEAD).*" (404|444|403|400|301) .*$
игнорироватьregex =

Моя тюрьма

[моя_тюрьма]
 включено = верно
 порт = http,https
 фильтр = мой_фильтр
 logpath = /var/log/traefik/access.log
 максимальная попытка = 10

Статус клиента

# статус клиента fail2ban
Положение дел
|- Количество тюрем: 2
`- Список джейлов: sshd, my_jail
Рейтинг:1
флаг il

Так почему же мой заблокированный IP-адрес все еще может достигать целевого веб-сайта?

Тому может быть 3 причины:

  1. твой брандмауэр серверная часть (iptables?) не подходит для этого, видеть https://github.com/fail2ban/fail2ban/issues/1609#issuecomment-303085942 (или же https://github.com/firewalld/firewalld/issues/44#issuecomment-408211978) для подробностей. Вскоре новый бэкэнд nftables firewalld сможет справиться с этим должным образом, поэтому вам, возможно, придется переключиться на это, или...
    Это также может привести нас к следующим двум причинам (первая более связана, чем вторая):

  2. если ваша сетевая подсистема имеет какие-то правила белого списка (и я так предполагаю), например правила conntrack, обходящие уже установленные соединения перед цепочками fail2ban, то добавление правил в таблицы fail2ban, отбрасывая IP, не повлияет на это установленное соединения (например, в случае keep-alive), тогда будут отклонены только новые соединения... в этом случае либо убедитесь, что соединение на веб-сервере отклоняется после сбоев аутентификации, либо переупорядочьте цепочки (цепочки fail2ban перед white- правила листинга) или убить соединение с помощью дополнительной команды в бан действий, например ss -K dst "[<ip>]" или же conntrack -D -s <ip>и т.д. См. https://github.com/fail2ban/fail2ban/pull/3018/commits/8f6a8df3a45395620e434fd15b4ede694a1d00aa (или же https://github.com/fail2ban/fail2ban/commit/bbfff1828061514e48395a5dbc5c1f9f81625e82) по аналогичной проблеме с ufw;

  3. поскольку он докеризован, вам, вероятно, придется определить цепочка = DOCKER-ПОЛЬЗОВАТЕЛЬ или подобное, просто действие брандмауэрcmd-богатые правила не подходит для этого (нет параметра цепь вообще)... Используйте другое действие запрета (например, собственные сетевые фильтры, такие как iptables/ipset или nftables), поддерживающие это.

В любом случае нужно проверить, как входящий трафик (включительно установленный) доходит до результирующих цепочек/таблиц, которые создает fail2ban для бана IP, учитывая все предустановленные цепочки/таблицы docker и firewalld.
В качестве альтернативы просто используйте блокирующие действия для собственных подсистем сетевого фильтра, таких как iptables+ipset или nftables (например, с соответствующей целевой таблицей для цепочек fail2ban, например DOCKER-ПОЛЬЗОВАТЕЛЬ вместо ВХОД).

флаг fr
Спасибо за ваш удивительно подробный ответ. Дело было действительно в вашем третьем, я полностью пропустил несколько цепочек, касающихся Iptables. Добавление `chain = DOCKER-USER` заставило его работать без проблем.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.