启用Keycloak Gatekeeper RBAC的Kubernetes服务间通信问题
首先直接回答你的疑问:是的,你的临时方案确实会让Kubernetes集群内的任意服务都能无认证访问testapp:8081。这个端口直接指向了应用的原始端口(8080),完全绕过了keycloak-gatekeeper的拦截逻辑,相当于把应用裸暴露在集群内部——任何有权限在集群内创建Pod的用户或服务,都可以直接访问你的testapp,没有任何访问控制,存在不小的安全风险,并不适合长期使用。
下面给你几个更安全、符合Kubernetes最佳实践的解决方案:
方案1:基于集群内部IP/CIDR的白名单免认证
利用keycloak-gatekeeper的IP白名单功能,放行集群内部的合法流量,不需要额外端口,所有访问都走同一个端口,由gatekeeper统一管控。
配置步骤:
先获取你的Kubernetes集群的Pod CIDR范围(集群内所有Pod的IP段):
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'输出可能类似
10.244.0.0/24 10.244.1.0/24,把这些段合并成一个或多个CIDR。修改keycloak-gatekeeper的注入配置(比如ProxyInjector的CR或者ConfigMap),添加白名单规则:
# 示例gatekeeper配置片段 skip-authorization: false whitelist-source-range: - "10.244.0.0/16" # 替换成你的集群Pod CIDR - "10.96.0.0/12" # 可选,集群Service CIDR,避免Service IP被拦截 allow-anonymous: false这样,当请求来自集群内部的Pod或Service IP时,gatekeeper会跳过认证直接放行;外部请求依然需要通过Keycloak登录认证。
方案2:基于Kubernetes服务账号(ServiceAccount)的认证
让内部服务使用Kubernetes的ServiceAccount Token进行身份验证,keycloak-gatekeeper验证令牌的合法性后允许访问,这样只有授权的ServiceAccount才能访问你的应用,安全性更高。
配置步骤:
在keycloak-gatekeeper的配置中启用Kubernetes服务账号认证:
enable-kubernetes-auth: true kubernetes-service-account: "testapp-sa" # 允许访问的ServiceAccount名称 kubernetes-auth-realm: "kubernetes" # 自定义一个realm名称用于标识K8s认证给需要访问testapp的内部服务绑定对应的ServiceAccount:
# 示例:给内部服务的Deployment指定ServiceAccount apiVersion: apps/v1 kind: Deployment metadata: name: internal-service spec: template: spec: serviceAccountName: testapp-sa # 对应gatekeeper配置中的账号 containers: - name: internal-service image: your-image内部服务在请求时,需要带上ServiceAccount的Token(默认挂载在
/var/run/secrets/kubernetes.io/serviceaccount/token):# 示例curl请求 curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" http://testservice:8080keycloak-gatekeeper会验证这个Token是否有效,以及是否属于配置中允许的ServiceAccount,验证通过后放行。
方案3:使用服务网格(如Istio)实现服务间mTLS认证
如果你的集群已经部署了Istio之类的服务网格,可以通过Sidecar实现服务间的mTLS加密和身份认证,同时和keycloak-gatekeeper配合,实现外部用户OIDC认证、内部服务mTLS认证的双重管控。
核心思路:
- 外部流量通过Ingress Gateway进入,由keycloak-gatekeeper处理OIDC认证。
- 内部服务间的通信由Istio Sidecar自动加密,通过mTLS验证对方身份,只有授权的服务才能访问testapp。
这种方案适合复杂的微服务架构,能提供更全面的安全管控,但需要额外的服务网格部署成本。
总结一下,你的临时方案虽然能快速解决服务间通信问题,但安全隐患较大,建议尽快替换成上述更安全的方案。优先考虑方案1(IP白名单)或方案2(ServiceAccount认证),根据你的集群安全需求选择。
内容的提问来源于stack exchange,提问作者cclloyd

