podman 4.4.1 を搭載した Rocky Linux 9.2 で実行しています。内部に keycloak + postgresql を備えた podman Pod があり、ルートレスで実行しています。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 jail ファイルで設定しました。iptables には FORWARD チェーンのルールがありましたが、それでも機能しませんでした。デフォルト設定 (INPUT チェーン) を使用した場合と同じ動作です。
ルートレス podman コンテナーが iptables からの IP 禁止に従うようにするにはどうすればよいですか? 何かアイデアはありますか?
答え1
Fail2ban は (デフォルトでは) ファイアウォール レベルで動作し、ファイアウォール レベル自体は IP レベルで動作します。
設定により、すべてのトラフィックは、Keycloak に接続する唯一の IP を持つ外部の Traefik インスタンスによって中継されるため、ファイアウォールはその IP をブロックするか許可することができます。
不正な IP をブロックしたい場合は、Traefik ホストでブロックする必要があります (提供した情報に基づいて)。
答え2
fail2ban と X-Forwarded-For ヘッダーをいじるのは満足のいく解決策ではありません。私は opnsense API アプローチを使用してこれを解決しました。簡単な要約:
- alias_util および診断ファイアウォール状態エンドポイントの権限を持つユーザー (API キー) を作成しました。
ipv4_blacklist
外部(詳細)タイプのエイリアスを作成しました- ファイアウォールのWANルールを作成し、ソースからのすべてをブロックしました
ipv4_blacklist
actionban
およびを使用してKeycloakカスタムアクションを作成しましたactionunban
2 つのコマンドが必要ですactionban
:
- 指定されたIPをブラックリストに追加するには
api/firewall/alias_util/add/ipv4_blacklist
- を介してアクティブセッションを強制終了し
api/diagnostics/firewall/kill_states
、禁止アクションが直ちに有効になります
1 つのコマンドでactionunban
十分です。
- 指定されたIPを単に削除する
api/firewall/alias_util/delete/ipv4_blacklist