fail2ban en el host para el contenedor de capas de claves podman sin raíz

fail2ban en el host para el contenedor de capas de claves podman sin raíz

ejecutándose en Rocky Linux 9.2 con podman 4.4.1. Tengo un podman Pod con keycloak + postgresql adentro, ejecutándose sin raíz. La cápsula en sí con --network 'slirp4netns:port_handler=slirp4netns'. El contenedor de capa de claves se está ejecutando, --log-driver json-file --log-opt path=/var/log/keycloak.logpor lo que tengo el archivo de registro en el sistema host. También hay un proxy traefik que hace que keycloak sea accesible, terminación ssl en traefik + terminación ssl en keycloak.

Todo funciona hasta ahora, veo la dirección IP real de un usuario que intenta iniciar sesión en los registros. Fail2ban se está ejecutando en el sistema host, la expresión regular también funciona y está prohibiendo la dirección IP correcta, PERO aunque la IP está prohibida (lo veo en fail2ban-client status keycloak), el usuario aún puede continuar enviando inicios de sesión.

/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]

Entonces, antes de la prohibición, iptables está vacío:

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

Después de la prohibición:

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

También leí algo acerca de que Docker está usando la cadena FORWARD, así que configuré action = iptables-allports[name=keycloak, protocol=all, chain=FORWARD]el archivo keycloak jail, iptables tenía entonces la regla en la cadena FORWARD pero todavía no funcionaba. El mismo comportamiento que cuando se usa la configuración predeterminada (en la cadena de ENTRADA).

¿Cómo puedo hacer que el contenedor podman desarraigado obedezca la prohibición de ip de iptables? ¿Algunas ideas?

Respuesta1

Fail2ban funciona (por defecto) a nivel de firewall, que a su vez funciona a nivel de IP.

Dada su configuración, todo el tráfico es retransmitido por una instancia externa de Traefik cuya IP es la única que contacta con Keycloak, lo que significa que el firewall puede bloquear esa IP o permitirla.

Si desea bloquear las IP que se comportan mal, debe bloquearlas en el host de Traefik (dada la información que proporcionó).

Respuesta2

Jugar con fail2ban y el encabezado X-Forwarded-For no sería una solución satisfactoria. Resolví esto utilizando el enfoque API opnsense. Sumario rápido:

  • Creó un usuario (clave API) con permisos para alias_util y puntos finales de estados de firewall de diagnóstico.
  • creó un alias ipv4_blacklistde tipo Externo (avanzado)
  • creó una regla wan de firewall para bloquear todo desde la fuenteipv4_blacklist
  • creó una acción personalizada de capa de clave usando actionbanyactionunban

porque actionbannecesitas dos comandos:

  1. Agregar la IP dada a la lista negra a través deapi/firewall/alias_util/add/ipv4_blacklist
  2. Eliminar las sesiones activas a través de api/diagnostics/firewall/kill_states, para que la acción de prohibición entre en vigor inmediatamente

para actionunbanun comando es suficiente:

  1. Simplemente elimine la IP proporcionada a través deapi/firewall/alias_util/delete/ipv4_blacklist

información relacionada