kubernetes 使用Istio在GKE上强制执行JWT身份验证

rm5edbpk  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(112)

我们正在开发Web应用程序,该应用程序由部署在GKE上的一系列BFF服务支持,Istio配置为作为Sidecar注入BFF服务中的每个Pod。
这里的要求是

  • 对所有工作负载实施基于JWT的身份验证,除了spring执行器端点。
  • 从JWT声明中提取member_id,并将其作为头传递给服务。
  • 我想绕过这个“内部”端点(从网络内),当BFF的内部交谈**(这是我卡住了)**

这是我目前为止的工作。

  • 设置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-RenderId,outputClaimToHeaders似乎覆盖了头,因此服务失败。

我应该如何去满足这个或任何其他一般性建议的任何建议?

ldioqlga

ldioqlga1#

我相信这可能是一个可能的bug,如果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),提取声明并将它们作为头传递给实际的服务。
让我知道,如果有人需要更多的细节过滤器,我会很乐意提供。

相关问题