Istio 的授权认证 和 OAuth2/OIDC

发布于:2025-06-19 ⋅ 阅读:(9) ⋅ 点赞:(0)

Istio 的授权认证 和 OAuth2/OIDC(如 Keycloak 或 Spring Authorization Server) 解决的是不同层面的安全问题。

  • OAuth2/OIDC:关注的是 “用户身份” 和 “应用授权”。它回答的问题是:“你是谁?(认证)”,“你(或代表你的应用)被允许做什么?(授权)”。

  • Istio 的授权:关注的是 “服务到服务(Workload-to-Workload)” 的通信安全。它回答的问题是:“哪个服务允许调用我的服务?”,“这个进来的请求(不管是谁发起的)是否符合我设定的安全策略?”。

让我们用一个更具体的比喻来区分。


一个安保系统比喻

想象一个高度安全的政府大楼:

  1. OAuth2/OIDC (Keycloak/Spring Authorization Server) - 大楼入口的门禁和访客中心

    • 角色:这是大楼的主入口安检

    • 过程

      • 你(用户)走到大楼门口,出示你的身份证(用户名/密码)。

      • 安保人员(授权服务器)验证你的身份。

      • 验证通过后,他们会发给你一张访客卡/员工卡 (JWT)

      • 这张卡上记录了你的身份信息(sub: "张三"),以及你的权限(scope: "访问档案室", "使用会议室")。

    • 核心关注点验证人的身份,并颁发一个包含身份和权限的凭证 (JWT)

  2. Istio 的授权策略 (AuthorizationPolicy) - 每个房间门口的保安

    • 角色:这是大楼内部,每个重要房间门口的独立保安

    • 过程

      • 你拿着你的访客卡 (JWT) 去档案室。

      • 门口的保安(Istio-Proxy/Envoy)会拦截你。他不关心你是谁(他相信门口门禁发的卡),他只关心他收到的指令

      • 他的指令(AuthorizationPolicy)可能是:

        • 指令1:“只允许来自‘秘书处’这个服务(Service Account)的请求进入。” (这是服务到服务的认证,mTLS)。

        • 指令2:“检查访客卡 (JWT),只有卡上写着 scope 包含 访问档案室 的人才能进来。” (基于 JWT 的授权)。

        • 指令3:“只允许在工作日的上午9点到下午5点之间进入。” (基于请求属性的策略)。

        • 指令4:“只允许通过 GET 方法访问,不允许 POST。” (基于 HTTP 方法的策略)。

    • 核心关注点:在网络层面强制执行访问控制策略,验证服务身份请求属性,不负责颁发凭证。


功能对比与协作

特性 OAuth2/OIDC (Keycloak, etc.) Istio 安全 (AuthorizationPolicy)
层面 (Layer) 应用层 (L7) 网络/基础设施层 (L3/L4/L7)
主要目标 用户认证 (Authentication) 和 用户授权 (Authorization) 服务间认证 (mTLS) 和 服务间/请求级授权 (Authorization)
核心产物 身份令牌 (Identity Token) 和 访问令牌 (Access Token, JWT) 访问控制策略的强制执行 (Enforcement)
谁来执行? 你的应用程序本身需要集成 SDK (如 spring-boot-starter-oauth2-resource-server) 来解析和验证 JWT。 附加到你的应用 Pod 上的 Envoy 代理 (Sidecar),对应用完全透明。
回答的问题 “用户张三是否有权查看订单?” “订单服务是否允许被支付服务调用?” <br> “这个发往/api/orders的请求,其 JWT 是否包含read:orders的 scope?”

它们如何协同工作?

这才是最强大的地方!它们不是二选一,而是最佳拍档。一个典型的现代微服务安全架构如下:

  1. 用户登录:用户通过前端与 Keycloak 交互,获取一个 JWT

  2. 前端请求后端:前端应用发起 API 请求,将 JWT 放在 Authorization 头中,发往后端的 Order-Service。

  3. Istio 入口网关 (Gateway) 拦截:请求首先到达集群入口的 Istio Gateway。Gateway 上可以配置一个 RequestAuthentication 策略,验证 JWT 的签名和颁发者是否合法。如果 JWT 无效,请求在这里就被拒绝了,根本到不了后端服务。

  4. 服务间调用与 Istio Sidecar

    • 请求通过了 Gateway,到达了 Order-Service 的 Pod。

    • Order-Service 的 Envoy Sidecar 拦截了这个请求。

    • Sidecar 会检查应用到 Order-Service 的 AuthorizationPolicy。

    • 这个策略可能会说:“允许所有来自入口网关的、并且其 JWT 中 scope 字段包含 read:orders 的请求。”

    • Envoy Sidecar 检查 JWT 的内容,发现符合策略,于是将请求放行给 Order-Service 的业务容器。

  5. (可选)应用内部再次验证:Order-Service(一个 Spring Boot 应用)的 oauth2-resource-server 组件也可以再次验证 JWT,并从中提取用户信息(如用户ID)用于业务逻辑(比如查询只属于这个用户的订单)。

总结

  • 功能不同:Keycloak/OAuth2 是发证机关,负责用户身份认证和颁发凭证 (JWT)。Istio 是执法机关,在网络层面根据预设的规则(AuthorizationPolicy)对所有流量进行拦截和审查。

  • 解耦和分层

    • Istio 将大量的安全逻辑(如 JWT 验证、服务间认证、访问控制)从业务代码中剥离出来,下沉到基础设施层。这让开发者可以更专注于业务逻辑。

    • Keycloak 将用户管理和身份认证的逻辑从所有业务服务中剥离出来,形成一个统一的身份中心。

所以,它们不是相同的功能,而是一个现代云原生安全体系中,分别负责身份认证访问控制执行的两个关键组件。将它们结合使用,可以构建一个非常强大、灵活且安全的多层防御体系。


网站公告

今日签到

点亮在社区的每一天
去签到