You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Keycloak Gatekeeper RBAC的Kubernetes服务间通信问题

问题分析与解决方案

首先直接回答你的疑问:是的,你的临时方案确实会让Kubernetes集群内的任意服务都能无认证访问testapp:8081。这个端口直接指向了应用的原始端口(8080),完全绕过了keycloak-gatekeeper的拦截逻辑,相当于把应用裸暴露在集群内部——任何有权限在集群内创建Pod的用户或服务,都可以直接访问你的testapp,没有任何访问控制,存在不小的安全风险,并不适合长期使用。

下面给你几个更安全、符合Kubernetes最佳实践的解决方案:

方案1:基于集群内部IP/CIDR的白名单免认证

利用keycloak-gatekeeper的IP白名单功能,放行集群内部的合法流量,不需要额外端口,所有访问都走同一个端口,由gatekeeper统一管控。

配置步骤:

  1. 先获取你的Kubernetes集群的Pod CIDR范围(集群内所有Pod的IP段):

    kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
    

    输出可能类似10.244.0.0/24 10.244.1.0/24,把这些段合并成一个或多个CIDR。

  2. 修改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才能访问你的应用,安全性更高。

配置步骤:

  1. 在keycloak-gatekeeper的配置中启用Kubernetes服务账号认证:

    enable-kubernetes-auth: true
    kubernetes-service-account: "testapp-sa"  # 允许访问的ServiceAccount名称
    kubernetes-auth-realm: "kubernetes"       # 自定义一个realm名称用于标识K8s认证
    
  2. 给需要访问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
    
  3. 内部服务在请求时,需要带上ServiceAccount的Token(默认挂载在/var/run/secrets/kubernetes.io/serviceaccount/token):

    # 示例curl请求
    curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" http://testservice:8080
    

    keycloak-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:33