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.log
por 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_blacklist
de tipo Externo (avanzado) - creó una regla wan de firewall para bloquear todo desde la fuente
ipv4_blacklist
- creó una acción personalizada de capa de clave usando
actionban
yactionunban
porque actionban
necesitas dos comandos:
- Agregar la IP dada a la lista negra a través de
api/firewall/alias_util/add/ipv4_blacklist
- 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 actionunban
un comando es suficiente:
- Simplemente elimine la IP proporcionada a través de
api/firewall/alias_util/delete/ipv4_blacklist