启用Istio Sidecar配置后RequestAuthentication验证失败
Istio Sidecar配置导致JWT认证失效问题排查
问题背景
本地运行部署了Istio的Kubernetes集群,分两个命名空间部署服务:
authserver:授权服务器,通过ClusterIP服务向集群内暴露resourceserver:资源服务器,同样通过ClusterIP服务暴露
为资源服务器配置了Istio的认证与授权规则:
RequestAuthentication配置
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: resource-service-auth namespace: resourceserver spec: selector: matchLabels: app: my-resource jwtRules: - issuer: "http://authorization-service.authserver" audiences: - "client" jwksUri: "http://authorization-service.authserver/oauth2/jwks"
AuthorizationPolicy配置
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: resource-service-authz namespace: resourceserver spec: selector: matchLabels: app: my-resource action: DENY rules: - from: - source: notRequestPrincipals: ["*"]
原本上述配置可正常拦截无效JWT、放行有效JWT,但为资源服务器添加以下Sidecar配置后,使用有效JWT请求时出现认证错误:
Sidecar配置
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: resourceservice-sidecar namespace: resourceserver spec: workloadSelector: labels: app: resourceservice egress: - hosts: - "authservice/*" outboundTrafficPolicy: mode: REGISTRY_ONLY
错误表现:
- 默认配置下:返回
Jwks doesn't have key to match kid or alg from Jwt - 修改
PILOT_JWT_ENABLE_REMOTE_JWKS="envoy"后:返回Jwks remote fetch is failed
问题原因及修复方案
1. 核心问题:Sidecar出口规则配置错误
你的Sidecar配置中,egress.hosts设置为authservice/*,但授权服务器的服务所在命名空间是authserver,服务名是authorization-service,这个匹配规则完全错误,导致JWKS拉取路径被阻断:
- 默认模式下,Istiod会替Sidecar拉取JWKS密钥,但
REGISTRY_ONLY模式限制了集群内流量只能流向Sidecar规则允许的目标,因规则未放通authserver命名空间的服务,Istiod无法获取有效JWKS,只能返回空或无效的密钥集合,最终JWT校验失败。 - 切换到
envoy模式后,由Sidecar自身发起JWKS拉取请求,但同样因为出口规则未放通正确地址,请求被拦截,直接报拉取失败。
2. 修复Sidecar配置
修改egress.hosts为授权服务器所在的命名空间,或者直接指定具体服务地址:
方案一:放通整个authserver命名空间的服务
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: resourceservice-sidecar namespace: resourceserver spec: workloadSelector: labels: app: resourceservice egress: - hosts: - "authserver/*" outboundTrafficPolicy: mode: REGISTRY_ONLY
方案二:指定具体服务地址
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: resourceservice-sidecar namespace: resourceserver spec: workloadSelector: labels: app: resourceservice egress: - hosts: - "authorization-service.authserver.svc.cluster.local" outboundTrafficPolicy: mode: REGISTRY_ONLY
3. 额外校验点
- 标签一致性:你的认证规则匹配的是
app: my-resource,但Sidecar匹配的是app: resourceservice,确保资源服务器Pod的标签与这两个规则的标签一致,避免Sidecar未正确挂载到目标Pod上。 - 服务连通性:修复Sidecar后,可在资源服务器Pod内部执行
curl http://authorization-service.authserver/oauth2/jwks,确认能正常获取JWKS密钥内容。
内容的提问来源于stack exchange,提问作者Brian K
相关产品推荐
相关产品推荐

