无根 podman keycloak 容器主机上的 fail2ban

无根 podman keycloak 容器主机上的 fail2ban

在 Rocky Linux 9.2 上运行,使用 podman 4.4.1。我有一个 podman Pod,里面有 keycloak + postgresql,以无根方式运行。pod 本身带有--network 'slirp4netns:port_handler=slirp4netns'。keycloak 容器正在运行,--log-driver json-file --log-opt path=/var/log/keycloak.log因此我在主机系统本身上有日志文件。还有一个 traefik 代理使 keycloak 可访问,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 jail 文件中进行了设置,iptables 随后在 FORWARD 链中设置了规则,但仍然不起作用。与使用默认设置(在 INPUT 链中)时的行为相同。

如何让无根 podman 容器遵守 iptables 的 ip 禁令?有什么想法吗?

答案1

Fail2ban(默认情况下)在防火墙级别工作,而防火墙级别本身在 IP 级别工作。

根据您的设置,所有流量都由外部 Traefik 实例中继,该实例的 IP 是唯一与 Keycloak 联系的 IP,这意味着防火墙可以阻止该 IP 或允许它。

如果您想阻止行为不端的 IP,则需要在 Traefik 主机上阻止它们(根据您提供的信息)。

答案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. 只需通过以下方式删除给定的 IPapi/firewall/alias_util/delete/ipv4_blacklist

相关内容