fail2ban на хосте для контейнера podman keycloak без прав root

fail2ban на хосте для контейнера podman keycloak без прав root

работает на Rocky Linux 9.2 с podman 4.4.1. У меня есть Pod podman с keycloak + postgresql внутри, работающий без прав root. Сам pod с --network 'slirp4netns:port_handler=slirp4netns'. Контейнер keycloak работает с , --log-driver json-file --log-opt path=/var/log/keycloak.logпоэтому у меня есть файл журнала на самой хостовой системе. Также есть прокси-сервер traefik, делающий keycloak доступным, ssl terminate на traefik + ssl terminate на самом keycloak.

Пока все работает, я вижу в журналах реальный IP-адрес пользователя, пытающегося войти. Fail2ban запущен на хост-системе, регулярное выражение также работает и блокирует правильный IP-адрес, НО даже несмотря на то, что IP заблокирован (я вижу это в fail2ban-client status keycloak), пользователь все еще может продолжать отправлять логины.

/etc/fail2ban/jail.d/keycloak.local

[keycloak]
backend = auto
enabled = true
filter = keycloak
maxretry = 3
bantime = 86400
findtime = 86400
logpath = /var/log/keycloak.log
action = iptables-allports[name=keycloak]

Итак, до запрета iptables пуст:

iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

После запрета:

iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
f2b-keycloak  tcp  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain f2b-keycloak (1 references)
target     prot opt source               destination         
REJECT     all  --  xx.xx.xx.xx       0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Я также читал что-то о том, что Docker использует цепочку FORWARD, поэтому я установил action = iptables-allports[name=keycloak, protocol=all, chain=FORWARD]файл jail keycloak, тогда iptables имел правило в цепочке FORWARD, но оно все равно не работало. То же самое поведение, что и при использовании настройки по умолчанию (в цепочке INPUT).

Как заставить контейнер podman без root подчиняться запрету ip из iptables? Есть идеи?

решение1

Fail2ban работает (по умолчанию) на уровне брандмауэра, который, в свою очередь, работает на уровне IP.

Учитывая ваши настройки, весь трафик ретранслируется внешним экземпляром Traefik, IP-адрес которого является единственным, с которым можно связаться с Keycloak, что означает, что брандмауэр может либо заблокировать этот IP-адрес, либо разрешить его.

Если вы хотите заблокировать некорректно работающие IP-адреса, вам необходимо заблокировать их на хосте Traefik (с учетом предоставленной вами информации).

решение2

Возня с fail2ban и заголовком X-Forwarded-For не будет удовлетворительным решением. Я решил это с помощью подхода API opnsense. Краткое резюме:

  • создал пользователя (ключ API) с разрешениями для alias_util и конечных точек состояний брандмауэра диагностики.
  • создал псевдоним ipv4_blacklistтипа Внешний (расширенный)
  • создал правило брандмауэра wan для блокировки всего из источникаipv4_blacklist
  • создано пользовательское действие keycloak с использованием actionbanиactionunban

для actionbanвас нужны две команды:

  1. Добавление указанного IP в черный список черезapi/firewall/alias_util/add/ipv4_blacklist
  2. Завершение активных сеансов с помощью api/diagnostics/firewall/kill_states, поэтому действие запрета вступает в силу немедленно

для actionunbanодной команды достаточно:

  1. Просто удалите указанный IP черезapi/firewall/alias_util/delete/ipv4_blacklist

Связанный контент