【问题标题】:Istio jwt parse and populate in request headerIstio jwt 解析并填充到请求标头中
【发布时间】:2022-01-05 06:34:40
【问题描述】:

我有几个微服务并使用 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

【问题讨论】:

  • 如果您的应用程序使用 JWT 发送请求标头,它们将被填充。您能否澄清一下您的问题到底是什么,尤其是“如何在请求标头中填充声明(最终用户角色)(jwt)”和“如何配置以填充请求标头中的 jwt 有效负载元素”部分。你能补充一些例子吗?还请提供有关您正在使用的 Istio 和 Kubernetes 版本的信息。还要检查这些主题:this onethis one
  • "jwksUri" 此元素可用于验证 jwt 令牌(承载),并且 outputPayloadToHeader 有助于填充/或仅在请求者标头中转发 jwt。但我想要的是,一旦 jwt 令牌验证(jwksUri 这样做),我想在请求者标头中获取所有声明(角色)详细信息。
  • 目前还不是很清楚你想要实现什么。你能补充一些例子吗?还请提供有关您正在使用的 Istio 和 Kubernetes 版本的信息。你检查过我发送的主题吗?他们有帮助吗?
  • @MikolajS。我附上了屏幕截图并在原始问题中给出了示例

标签: microservices istio istio-sidecar istio-gateway


【解决方案1】:

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


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

还有一个很好的文档 - Copy JWT claims to headers 总结了这个问题,其中包含来自不同网站的建议和可能的解决方案/解决方法:

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

  • 解决方案 1:WASM 过滤器 - 开发了一个专用的 WASM 过滤器,用于将声明复制到标头,作为 ASM 客户的解决方法。 - 该解决方案需要部署和配置专用的 WASM 过滤器,采用过程有点繁重,由于使用 EnvoyFIlter API,可能不适合所有 ASM 客户。 - 在Existing WASM based solution 附录中查看更多详细信息。
  • 解决方案 2:Lua 过滤器 - OSS 社区开发了一些示例 lua 过滤器配置,用于将声明复制到标头。 - 这个解决方案非常轻量级,因为它只使用上游 Envoy 中的原生内置 Lua 过滤器。配置很简单,并且具有很大的灵活性,因为它只是一些 lua 代码。这个解决方案仍然需要使用 EnvoyFilter API,并且 ASM 也不支持 Lua 过滤器。 - 在discuss,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 - 有点过时但有很好的解释。还要检查updated code of the above solution on the GitHub page

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2021-01-16
    • 2011-02-17
    • 2017-01-24
    • 1970-01-01
    相关资源
    最近更新 更多