首页 > 解决方案 > 如何使用开发人员 Google 帐户而不是服务帐户向 ESP 进行身份验证?

问题描述

我们使用 Google Cloud 中的 Cloud Endpoints 在部署到 Google Kubernetes Engine 的应用程序中进行服务到服务身份验证。
我们在所有应用程序前面都有一个可扩展服务代理边车,带有一个 Swagger (OpenApi) 2.0 YAML 描述符,用于指定哪些端点可以被哪些其他服务访问。
每个服务都有自己的服务帐户,创建必要的安全定义很简单:

securityDefinitions:
  service-foo:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "service-foo@my-gcloud-project.iam.gserviceaccount.com"
    x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-foo-my-gcloud-project.iam.gserviceaccount.com"

这适用于 GKE 中的服务到服务通信。

但是在开发过程中,有时我们想从我们的开发机器向这些服务发送请求。使用这种设置,我们需要访问原始服务帐户密钥来生成 JWT 令牌,这很不方便,而且还会引发安全问题。

如果我们可以创建一个安全定义,开发人员可以使用他们自己的 Google 帐户而不是服务帐户来访问服务,那将是非常好的。

我尝试使用gcloudCLI 和以下命令创建 JWT 令牌:

$ gcloud auth print-identity-token

这会打印一个有效的 JWT 令牌,其中 Audience 是32555940559.apps.googleusercontent.com,并且该令牌有一个email字段,其中包含我自己的 Google 帐户电子邮件地址。
我尝试为此创建一个安全定义,我尝试了以下操作。

  my-dev-account:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://accounts.google.com"
    x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
    x-google-audiences: "32555940559.apps.googleusercontent.com"

这在技术上是可行的,ESP 允许请求使用由gcloud auth print-identity-token. 但问题是这不会以任何方式限制对我自己帐户的访问,因为32555940559.apps.googleusercontent.comGCloud SDK 本身的客户端 ID 是,因此任何拥有 Google 帐户的人都可以访问。

是否可以在安全定义中指定该email字段应限制为某个值?
还是我完全走错了路,但是还有其他方法可以让开发人员 Google 帐户访问 ESP 吗?

标签: google-cloud-platformgoogle-kubernetes-enginegcloudopenapi

解决方案


在身份感知代理 (IAP)后面以应用引擎标准创建一个小型服务。在那里你可以限制谁可以访问它。

并且此服务的目的是将相同的请求复制到指定的端点,并在标头中使用正确的身份验证令牌。

GET /home?next=https://your-kubernetes-endpoint/resource

如果您向团队添加新成员,您可以通过 IAP 授予访问权限。

如果添加新端点,则更改查询参数的值next


推荐阅读