在Istio中将JWT声明作为上游请求的头部

44次阅读
没有评论

问题描述

在Istio中配置了JWT安全性,通过添加身份验证和授权策略,成功验证了令牌与JWKS URI,并根据授权规则限制了端点访问。用户现在希望在身份验证/授权后解析JWT声明,并将其附加为上游请求的头部。用户已经尝试过自定义CRD(Rule),但因为该自定义资源不存在而无法使用。
以下是用户的配置信息:

身份验证配置(Authentication)

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: "jwt-auth"
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  jwtRules:
    - issuer: "example.com"
      jwksUri: "http://my-service-endpoint/.well-known/jwks.json"
      outputPayloadToHeader: "token-data"

授权策略配置(Authorization Policy)

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "jwt-auth"
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  rules:
    - from:
      - source:
          requestPrincipals: ["*"]
    to:
      - operation:
          paths: ["/login", "/.well-known/jwks.json"]

用户也尝试了global.disablePolicyChecks属性,但发现该属性在Istio中并不存在。

解决方案

请注意以下操作可能涉及版本差异,建议在进行操作前做好备份。

方案1

通过Istio中的Rule CRD来实现headerOperations的操作,将JWT声明的某一字段(例如username)添加为上游请求的头部。然而,用户在Istio中没有找到这个自定义资源。

方案2

在没有Rule CRD的情况下,我们可以考虑使用一些其他方式来实现该功能。以下是一种可能的方法,通过自定义脚本来实现:
1. 创建一个bash脚本,例如add-jwt-claims-as-header.sh
2. 在脚本中使用curl或类似工具来解析JWT令牌的声明。
3. 从JWT令牌中获取想要的字段,例如username
4. 使用Istio的VirtualServiceGateway中的headers配置,将JWT声明字段作为上游请求的头部添加。
下面是一个简单的示例bash脚本,可以在容器中运行,将JWT令牌的username字段作为上游请求的X-username头部:

#!/bin/bash
# 解析JWT令牌并将username字段作为头部添加到上游请求
JWT_TOKEN="your_jwt_token_here"
USERNAME=$(echo "$JWT_TOKEN" | cut -d'.' -f2 | base64 -d | jq -r '.username')

# 使用curl或类似工具发起上游请求并添加X-username头部
curl -X GET http://your_upstream_service_endpoint -H "X-username: $USERNAME"

在上述脚本中,我们首先解析JWT令牌并提取username字段的值。然后,我们使用curl命令发起上游请求,并将提取的username值作为X-username头部添加到请求中。
请注意,这只是一种简单的示例。根据实际需求,你可能需要根据JWT令牌的具体格式和字段来修改脚本。

结论

通过自定义脚本来实现将JWT声明作为上游请求头部的操作。首先,你可以解析JWT令牌,提取所需字段,然后使用curl或类似工具发起上游请求并添加头部。如果以后Istio引入了支持此功能的新特性,你可以考虑升级并使用官方的解决方案。

正文完