Istio 的授权认证 和 OAuth2/OIDC(如 Keycloak 或 Spring Authorization Server) 解决的是不同层面的安全问题。
-
OAuth2/OIDC :关注的是 "用户身份" 和 "应用授权" 。它回答的问题是:"你是谁? (认证)","你(或代表你的应用)被允许做什么?(授权)"。
-
Istio 的授权 :关注的是 "服务到服务(Workload-to-Workload)" 的通信安全。它回答的问题是:"哪个服务允许调用我的服务? ","这个进来的请求(不管是谁发起的)是否符合我设定的安全策略?"。
让我们用一个更具体的比喻来区分。
一个安保系统比喻
想象一个高度安全的政府大楼:
-
OAuth2/OIDC (Keycloak/Spring Authorization Server) - 大楼入口的门禁和访客中心
-
角色 :这是大楼的主入口安检。
-
过程:
-
你(用户)走到大楼门口,出示你的身份证(用户名/密码)。
-
安保人员(授权服务器)验证你的身份。
-
验证通过后,他们会发给你一张访客卡/员工卡 (JWT)。
-
这张卡上记录了你的身份信息(sub: "张三"),以及你的权限(scope: "访问档案室", "使用会议室")。
-
-
核心关注点 :验证人的身份 ,并颁发一个包含身份和权限的凭证 (JWT)。
-
-
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?" |
它们如何协同工作?
这才是最强大的地方!它们不是二选一,而是最佳拍档。一个典型的现代微服务安全架构如下:
-
用户登录 :用户通过前端与 Keycloak 交互,获取一个 JWT。
-
前端请求后端:前端应用发起 API 请求,将 JWT 放在 Authorization 头中,发往后端的 Order-Service。
-
Istio 入口网关 (Gateway) 拦截 :请求首先到达集群入口的 Istio Gateway。Gateway 上可以配置一个 RequestAuthentication 策略,验证 JWT 的签名和颁发者是否合法。如果 JWT 无效,请求在这里就被拒绝了,根本到不了后端服务。
-
服务间调用与 Istio Sidecar:
-
请求通过了 Gateway,到达了 Order-Service 的 Pod。
-
Order-Service 的 Envoy Sidecar 拦截了这个请求。
-
Sidecar 会检查应用到 Order-Service 的 AuthorizationPolicy。
-
这个策略可能会说:"允许所有来自入口网关的、并且其 JWT 中 scope 字段包含 read:orders 的请求。"
-
Envoy Sidecar 检查 JWT 的内容 ,发现符合策略,于是将请求放行给 Order-Service 的业务容器。
-
-
(可选)应用内部再次验证:Order-Service(一个 Spring Boot 应用)的 oauth2-resource-server 组件也可以再次验证 JWT,并从中提取用户信息(如用户ID)用于业务逻辑(比如查询只属于这个用户的订单)。
总结
-
功能不同 :Keycloak/OAuth2 是发证机关 ,负责用户身份认证和颁发凭证 (JWT)。Istio 是执法机关,在网络层面根据预设的规则(AuthorizationPolicy)对所有流量进行拦截和审查。
-
解耦和分层:
-
Istio 将大量的安全逻辑(如 JWT 验证、服务间认证、访问控制)从业务代码中剥离出来,下沉到基础设施层。这让开发者可以更专注于业务逻辑。
-
Keycloak 将用户管理和身份认证的逻辑从所有业务服务中剥离出来,形成一个统一的身份中心。
-
所以,它们不是相同的功能,而是一个现代云原生安全体系中,分别负责身份认证 和访问控制执行的两个关键组件。将它们结合使用,可以构建一个非常强大、灵活且安全的多层防御体系。