如何使用开发人员 Google 帐户而不是服务帐户通过 ESP 进行身份验证?

How to authenticate with ESP using a developer Google account instead of a Service Account?

我们在 Google 云中使用 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 帐户而不是服务帐户来访问服务,那就太好了。

我尝试使用 gcloud CLI 通过以下命令创建 JWT 令牌:

$ gcloud auth print-identity-token

这会打印一个有效的 JWT 令牌,其中受众是 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 生成的 JWT 令牌。但问题是,这不会以任何方式限制对我自己帐户的访问,因为 32555940559.apps.googleusercontent.com 是 GCloud SDK 本身的客户端 ID,因此任何拥有 Google 帐户的人都可以访问。

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

Identity Aware proxy (IAP) 后面的 App Engine 标准中做一个小服务。在那里你可以限制谁可以访问它。

并且此服务的目的是将相同的请求复制到具有 header 中正确身份验证令牌的指定端点。

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

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

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

您可以像这样生成一个 id_token 与您想要的观众:

gcloud auth print-identity-token --audiences=<MySpecificAudience>

但是,您无法使用用户帐户生成此文件。您需要一个服务帐户密钥文件,出于安全原因(密钥管理等...)不是很好

解决方案可能是在您向特定受众请求令牌时模拟服务帐户

gcloud auth print-identity-token --audiences=<MySpecificAudience> \
  --impersonate-service-account=<SA-Name>@<ProjectId>.iam.gserviceaccount.com \
  --include-email

--include-email 还添加了模拟服务帐户的电子邮件....。我不知道这是否符合您的要求(安全性、可追溯性……)