【发布时间】: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