【问题标题】:How to authenticate with ESP using a developer Google account instead of a Service Account?如何使用开发人员 Google 帐户而不是服务帐户向 ESP 进行身份验证?
【发布时间】:2021-03-18 17:18:10
【问题描述】:

我们使用 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 帐户而不是服务帐户访问服务,那将是非常好的。

我尝试使用 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?

【问题讨论】:

  • 难道您不能编写一个简单的 (OAuth) 客户端(而不是使用 gcloud),分发它,让您的开发人员使用它进行身份验证并生成适当范围的 JWT?还有oauth2l,但我认为这不会给你你想要的ootb。
  • 或者...更好的是,发布一个仅限您的开发人员执行此操作的简单服务。

标签: google-cloud-platform google-kubernetes-engine gcloud openapi


【解决方案1】:

Identity Aware proxy (IAP) 后面的应用引擎标准中创建一个小型服务。在那里你可以限制谁可以访问它。

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以像这样为您想要的受众生成一个 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 还添加了模拟服务帐户的电子邮件....。我不知道这是否符合您的要求(安全性、可追溯性......)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2017-05-07
      • 2018-11-25
      • 2020-05-21
      • 2017-11-03
      • 1970-01-01
      • 2016-01-31
      • 2015-03-13
      相关资源
      最近更新 更多