läuft auf Rocky Linux 9.2 mit Podman 4.4.1. Ich habe einen Podman Pod mit Keycloak + PostgreSQL darin, der ohne Root läuft. Der Pod selbst mit --network 'slirp4netns:port_handler=slirp4netns'
. Der Keycloak-Container läuft mit, --log-driver json-file --log-opt path=/var/log/keycloak.log
sodass ich die Protokolldatei auf dem Hostsystem selbst habe. Es gibt auch einen Traefik-Proxy, der Keycloak zugänglich macht, SSL-Terminierung auf Traefik + SSL-Terminierung auf Keycloak selbst.
Bisher funktioniert alles, ich sehe die echte IP-Adresse eines Benutzers, der versucht, sich in den Protokollen anzumelden. Fail2ban läuft auf dem Hostsystem, der reguläre Ausdruck funktioniert auch und sperrt die richtige IP-Adresse, ABER obwohl die IP gesperrt ist (ich sehe es in fail2ban-client status keycloak
), kann der Benutzer weiterhin Anmeldungen übermitteln.
/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]
Vor der Sperrung war iptables also leer:
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
Nach dem Verbot:
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
Ich habe auch etwas darüber gelesen, dass Docker die FORWARD-Kette verwendet, also habe ich sie action = iptables-allports[name=keycloak, protocol=all, chain=FORWARD]
in der Keycloak-Jail-Datei festgelegt. Iptables hatte dann die Regel in der FORWARD-Kette, aber sie funktionierte trotzdem nicht. Gleiches Verhalten wie bei Verwendung der Standardeinstellung (in der INPUT-Kette).
Wie kann ich dafür sorgen, dass der Root-Podman-Container die IP-Sperre von iptables beachtet? Irgendwelche Ideen?
Antwort1
Fail2ban funktioniert (standardmäßig) auf Firewall-Ebene, die wiederum auf IP-Ebene funktioniert.
Bei Ihrem Setup wird der gesamte Datenverkehr von einer externen Traefik-Instanz weitergeleitet, deren IP die einzige ist, die Kontakt mit Keycloak aufnimmt. Dies bedeutet, dass die Firewall diese IP entweder blockieren oder zulassen kann.
Wenn Sie fehlerhafte IPs blockieren möchten, müssen Sie sie auf dem Traefik-Host blockieren (anhand der von Ihnen bereitgestellten Informationen).
Antwort2
Das Herumspielen mit fail2ban und dem X-Forwarded-For-Header wäre keine zufriedenstellende Lösung. Ich habe das Problem mit dem opnsense-API-Ansatz gelöst. Kurze Zusammenfassung:
- hat einen Benutzer (API-Schlüssel) mit den Berechtigungen für die Endpunkte „Alias_util“ und „Diagnose-Firewallzustände“ erstellt.
- einen Alias
ipv4_blacklist
vom Typ „Extern (erweitert)“ erstellt - erstellte eine Firewall-WAN-Regel, um alles von der Quelle zu blockieren
ipv4_blacklist
- erstellte benutzerdefinierte Keycloak-Aktion mit
actionban
undactionunban
dafür actionban
benötigst du zwei Befehle:
- Hinzufügen der angegebenen IP zur Blacklist über
api/firewall/alias_util/add/ipv4_blacklist
- Beenden Sie die aktiven Sitzungen über
api/diagnostics/firewall/kill_states
, damit die Sperraktion sofort wirksam wird.
denn actionunban
ein Befehl genügt:
- Löschen Sie einfach die angegebene IP über
api/firewall/alias_util/delete/ipv4_blacklist