루트 없는 Podman keycloak 컨테이너를 위한 호스트의 Fail2ban

루트 없는 Podman keycloak 컨테이너를 위한 호스트의 Fail2ban

Podman 4.4.1을 사용하여 Rocky Linux 9.2에서 실행 중입니다. 내부에 keycloak + postgresql이 포함되어 루트 없이 실행되는 podman Pod가 있습니다. 포드 자체에는 --network 'slirp4netns:port_handler=slirp4netns'. keycloak 컨테이너가 실행 중이므로 --log-driver json-file --log-opt path=/var/log/keycloak.log호스트 시스템 자체에 로그 파일이 있습니다. keycloak에 액세스할 수 있도록 하는 traefik 프록시, traefik의 SSL 종료 + keycloak 자체의 SSL 종료도 있습니다.

지금까지는 모든 것이 작동하며 로그에서 로그인을 시도하는 사용자의 실제 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]keycloak 감옥 파일에 설정했는데 iptables에는 FORWARD 체인에 규칙이 있었지만 여전히 작동하지 않았습니다. 기본 설정(INPUT 체인에서)을 사용할 때와 동일한 동작입니다.

루트 없는 Podman 컨테이너가 iptables의 IP 금지를 따르도록 하려면 어떻게 해야 합니까? 어떤 아이디어가 있나요?

답변1

Fail2ban은 기본적으로 IP 수준에서 작동하는 방화벽 수준에서 작동합니다.

설정에 따라 모든 트래픽은 IP가 Keycloak에 연결되는 유일한 인스턴스인 외부 Traefik 인스턴스에 의해 릴레이됩니다. 이는 방화벽이 해당 IP를 차단하거나 허용할 수 있음을 의미합니다.

오작동하는 IP를 차단하려면 Traefik 호스트에서 해당 IP를 차단해야 합니다(제공한 정보에 따라).

답변2

Fail2ban 및 X-Forwarded-For 헤더를 조작하는 것은 만족스러운 솔루션이 아닙니다. 나는 opnsense API 접근 방식을 사용하여 이 문제를 해결했습니다. 빠른 요약:

  • alias_util 및 진단 방화벽 상태 엔드포인트에 대한 권한이 있는 사용자(api 키)를 생성했습니다.
  • 외부 유형의 별칭 생성 ipv4_blacklist(고급)
  • 소스의 모든 것을 차단하는 방화벽 wan 규칙을 만들었습니다.ipv4_blacklist
  • actionban및를 사용하여 keycloak 사용자 정의 작업을 생성했습니다 .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

관련 정보