--- title: Istio External Auth 与全局鉴权(Envoy ext_authz、OPA 与验证) date: 2025-11-26 keywords: - ext_authz - OPA - EnvoyFilter - AuthorizationPolicy - JWT description: 在Istio中通过Envoy ext_authz对接外部鉴权服务或OPA,实现入口与服务间统一鉴权,并提供策略与端到端验证方法。 categories: - 文章资讯 - 编程技术 --- ## 概述 ext_authz可在HTTP请求进入服务前调用外部鉴权服务,结合OPA策略或自研鉴权接口,统一实现跨服务的授权控制与审计,支持JWT解析与细粒度规则。 ## 关键实践与参数 - 入口层: Gateway或Sidecar插入 `envoy.filters.http.ext_authz` - 超时与缓存: 配置鉴权超时、失败策略与结果缓存 - JWT与属性: 解析令牌并传递用户属性给鉴权服务 - 审计: 记录拒绝事件与规则命中 ## 示例/配置/实现 ```yaml apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: ext-authz namespace: istio-system spec: workloadSelector: labels: { istio: ingressgateway } configPatches: - applyTo: HTTP_FILTER match: context: GATEWAY listener: { portNumber: 443 } patch: operation: INSERT_BEFORE value: name: envoy.filters.http.ext_authz typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz http_service: server_uri: uri: http://authz.svc.cluster.local/check cluster: ext-authz timeout: 0.5s authorization_request: headers_to_add: [{ header: "x-user", value: "%REQ(x-user)%" }] authorization_response: allowed_upstream_headers: ["x-user", "x-roles"] ``` ```rego # OPA 示例策略 package authz default allow = false allow { input.path = ["/api", "orders"] input.method = "GET" some r r := input.user.roles[_] r == "reader" } ``` ## 验证 - 允许与拒绝: 根据角色访问不同路径返回200或403 - 性能与超时: 鉴权服务超时时采取失败策略并告警 - 审计: 记录拒绝与规则命中日志,可追溯 - 安全属性: JWT解析与用户属性传递正确 ## 注意事项 - 鉴权服务需高可用与低延迟 - 缓存与失败策略需谨慎,避免放过风险请求 - 与现有AuthorizationPolicy协同,保持策略一致 - 定期审计与测试策略覆盖

发表评论 取消回复