0

我有几个微服务并使用 istio。由于某些业务需求,需要每个微服务中的最终用户角色详细信息。我想知道如何在请求标头中填充声明(最终用户角色)(jwt)。我在 istio yml 下进行了配置。

outputPayloadToHeader此元素有助于在标头中填充不记名令牌。Istio 只是验证 jwt(承载)。但想知道如何配置以在请求标头中填充 jwt 有效负载元素。我已附上屏幕截图,有效负载属性应传播到请求标头。这样我的微服务(想要名称(“Gaurav Agarwal”))将从标题中读取。无论如何配置RequestAuthentication或任何其他方式?

在此处输入图像描述

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: "jwt-example"
  namespace: default
spec:
  selector:
    matchLabels:
      app: servicea
  jwtRules:
    - issuer: "testing@secure.istio.io"
      jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.12/security/tools/jwt/samples/jwks.json"
      outputPayloadToHeader: x-jwt
4

1 回答 1

1

发布社区 wiki 答案以获得更好的可见性。随意扩展它。


目前,在 Isito 中使用RequestAuthentication. Istio 论坛上有一个主题与一个非常相似的问题 - Setting request headers with values from a JWT , last pinged 10 days ago (state for 03.12.2021) - 你可以考虑订阅它。

还有一个不错的文档 -将 JWT 声明复制到标题中,通过来自不同网站的建议和可能的解决方案/解决方法总结了这个问题:

有几种现有的解决方案和解决方法

  • 解决方案 1:WASM 过滤器 - 开发了一个专用的 WASM 过滤器,用于将声明复制到标头,作为 ASM 客户的解决方法。- 该解决方案需要部署和配置专用的 WASM 过滤器,采用过程有点繁重,由于使用 EnvoyFIlter API,可能不适合所有 ASM 客户。- 在现有的基于 WASM 的解决方案附录中查看更多详细信息。
  • 解决方案 2:Lua 过滤器 - OSS 社区开发了一些示例 lua 过滤器配置,用于将声明复制到标头。- 这个解决方案非常轻量级,因为它只使用上游 Envoy 中的原生内置 Lua 过滤器。配置很简单,并且具有很大的灵活性,因为它只是一些 lua 代码。这个解决方案仍然需要使用 EnvoyFilter API,并且 ASM 也不支持 Lua 过滤器。- 在讨论,istio.io线程中查看更多详细信息。
  • 解决方案 3:在 VirtualService 中重用未记录的功能 - 此解决方案是在此设计中开发的,以重用虚拟服务中的未记录功能,以将动态元数据(JWT 声明)复制到 HTTP 标头。- 这可能是最轻量级的解决方案,因为它只需要一流的 Istio 虚拟服务 API。- 此解决方案存在一些限制,例如该功能未记录并直接使用 Envoy 日志记录格式,该功能也受到限制,可能不支持对 HTTP 标头和字符串以外的类型声明进行适当的清理。- 以下是将“group”声明复制到“x-istio-jwt-group”标头的示例虚拟服务:
apiVersion:  networking.istio.io/v1alpha3  
kind:  VirtualService  
metadata:  
name:  reviews-route  
spec:  
hosts:  
-  reviews.prod.svc.cluster.local  
http:  
- headers:  
request:  
set:  
x-istio-jwt-group:

'%DYNAMIC_METADATA(["istio_authn", "request.auth.claims", "group"])%'  
route:  <...>

查看这篇文章 - Istio Request Control with Envoy Filters - Request Headers - 有点过时但有很好的解释。在 GitHub 页面上查看上述解决方案的更新代码

另一种解决方法是更改​​您的应用程序以从标头读取转发的 JWT 有效负载并从此处获取值。您必须设置outputPayloadToHeader字段:

此字段指定标头名称以将成功验证的 JWT 有效负载输出到后端。转发的数据是 base64_encoded(jwt_payload_in_JSON)。如果未指定,则不会发出有效负载。

请记住,您也可以使用以下字段将原始令牌转发到您的应用程序forwardOriginalToken: true

如果设置为 true,将为上游请求保留原始令牌。默认为假。

于 2021-12-03T17:07:20.263 回答