在Kubernetes上限制Keycloak控制台的公网访问权限
解决方案:禁止Keycloak管理控制台公网访问
方法一:通过Ingress规则直接拦截(推荐)
NetworkPolicy仅支持四层网络控制,无法区分HTTP路径,而Keycloak管理控制台和业务接口共用同一端口,因此在Ingress层面做七层路径拦截更高效。
针对公网可访问的Ingress,添加路径拦截规则:
- 对管理控制台默认路径
/auth/admin(若有自定义路径请调整)配置拒绝策略 - 保留其他业务路径的正常访问权限
示例Ingress配置(以NGINX Ingress Controller为例):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: keycloak-public annotations: nginx.ingress.kubernetes.io/configuration-snippet: | location ~* /auth/admin { deny all; return 403 Forbidden; } spec: rules: - host: public-keycloak.your-domain.com http: paths: - path: /auth pathType: Prefix backend: service: name: keycloak-service port: number: 8080
内网访问的Ingress无需添加该注解,即可正常访问管理控制台。
方法二:修正NetworkPolicy规则(解决原配置失效问题)
若坚持使用NetworkPolicy,先排查以下常见失效原因:
- 确认集群CNI插件支持NetworkPolicy(如Calico、Cilium,Flannel默认不支持)
- 确认NetworkPolicy的Pod选择器精准匹配Keycloak Pod
- 公网流量通过Ingress Controller进入集群,需针对Ingress Controller的Pod标签/IP段配置规则
正确的NetworkPolicy配置示例(假设Ingress Controller标签为app.kubernetes.io/name=nginx-ingress):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: keycloak-network-policy spec: podSelector: matchLabels: app: keycloak # 替换为你的Keycloak Pod标签 policyTypes: - Ingress ingress: # 允许集群内网IP段访问所有端口(示例为192.168.0.0/16,需替换为实际内网段) - from: - ipBlock: cidr: 192.168.0.0/16 ports: - protocol: TCP port: 8080 # 允许Ingress Controller访问,结合Ingress规则拦截/admin路径 - from: - podSelector: matchLabels: app.kubernetes.io/name: nginx-ingress ports: - protocol: TCP port: 8080
注意事项
- 若Keycloak版本较新,管理控制台路径可能为
/admin而非/auth/admin,请根据实际版本调整 - 测试公网访问时,需清除浏览器缓存或使用隐私窗口,避免缓存导致的误判
内容的提问来源于stack exchange,提问作者Stieg
相关产品推荐
相关产品推荐

