無根 podman keycloak 容器的主機上的 failed2ban

無根 podman keycloak 容器的主機上的 failed2ban

使用 podman 4.4.1 在 Rocky Linux 9.2 上運行。我有一個 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監獄文件中設置了,iptables然後在FORWARD鏈中設置了規則,但它仍然不起作用。與使用預設設定(在 INPUT 鏈中)時的行為相同。

如何讓無根 podman 容器遵守 iptables 的 ip 禁令?有任何想法嗎?

答案1

Fail2ban(預設)在防火牆層級工作,而防火牆本身在 IP 層級工作。

根據您的設置,所有流量均由外部 Traefik 執行個體中繼,該執行個體的 IP 是唯一聯繫 Keycloak 的 IP,這表示防火牆可以阻止該 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. 只需透過刪除給定的IP即可api/firewall/alias_util/delete/ipv4_blacklist

相關內容