使用 Istio 在 GKE 上实施 JWT 身份验证

问题描述 投票:0回答:1

我们正在开发 Web 应用程序,该应用程序由部署在 GKE 上的一组 BFF 服务支持,并将 Istio 配置为作为 sidecar 注入 BFF 服务中的每个 pod 上。

这里的要求是

  • 对除弹簧执行器端点之外的所有工作负载强制执行基于 JWT 的身份验证。
  • 从 JWT 声明中提取 member_id 并将其作为标头传递给服务。
  • 我想绕过这个“内部”端点(来自网络内部)以及当最好的朋友在内部交谈时(这就是我陷入困境的地方)

这是我迄今为止所做的工作。

  • 如下设置RequestAuthentication
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: req-auth-jwt-required
  namespace: istio-testing-ns
spec:
  selector:
    matchLabels:
      app: istio-testing-service
  jwtRules:
    - issuer: "https://abc.us.com/"
      jwksUri: https://abc.us.com/.well-known/jwks.json
      outputClaimToHeaders:
        - header: X-MemberId
          claim: x-member-id
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: req-auth-policy-authenticated-only
  namespace: istio-testing-ns
spec:
  selector:
    matchLabels:
      app: istio-testing-service
  action: DENY
  rules:
    - from:
        - source:
            notRequestPrincipals: ["*"]
      to:
        - operation:
            notPaths: ["/istio-test/service/v1/actuator*"]
            notHosts: ["internal-*"]
            methods:
              - "GET"
    - to:
        - operation:
            paths:
              - "/istio-test/service/v1/categories*"
            notHosts: ["internal-*"]
            methods:
              - "GET"
              - "POST"
      when:
        - key: request.auth.claims[x-permissions]
          notValues:
            - "categories-lookup"

所以,使用这两个清单,我试图满足上述要求,到目前为止,它是有效的,但是,我遇到的问题如下

  • 当使用“内部”主机调用服务时,没有 JWT 和标头 X-MemberId,
    outputClaimToHeaders 
    似乎覆盖了标头,因此服务失败。

关于我应该如何满足这个要求或任何其他一般性建议有什么建议吗?

kubernetes istio
1个回答
0
投票

我相信这可能是一个可能的错误,如果 JWT 未通过,标头会被擦除。

因此,我使用以下方法来解决我的问题。

在 Istio 中,我使用

outputPayloadToHeader
将经过验证的 JWT 有效负载作为标头传递给服务。

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: req-auth-jwt-required
  namespace: istio-testing-ns
spec:
  selector:
    matchLabels:
      app: istio-testing-service
  jwtRules:
    - issuer: "https://abc.us.com/"
      jwksUri: https://abc.us.com/.well-known/jwks.json
      outputPayloadToHeader: "X-JWT-Payload"

完成上述操作后,我在

ClaimExtractingFilter
中编写了一个过滤器,基本上,提取传入的标头(X-JWT-Payload)并提取声明并将它们作为标头传递给实际服务。

如果有人需要有关过滤器的更多详细信息,请告诉我,我很乐意提供。

© www.soinside.com 2019 - 2024. All rights reserved.