google-cloud-platform - 如何使用开发人员 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 帐户而不是服务帐户来访问服务,那将是非常好的。
我尝试使用gcloud
CLI 和以下命令创建 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.com
GCloud SDK 本身的客户端 ID 是,因此任何拥有 Google 帐户的人都可以访问。
是否可以在安全定义中指定该email
字段应限制为某个值?
还是我完全走错了路,但是还有其他方法可以让开发人员 Google 帐户访问 ESP 吗?
解决方案
在身份感知代理 (IAP)后面以应用引擎标准创建一个小型服务。在那里你可以限制谁可以访问它。
并且此服务的目的是将相同的请求复制到指定的端点,并在标头中使用正确的身份验证令牌。
GET /home?next=https://your-kubernetes-endpoint/resource
如果您向团队添加新成员,您可以通过 IAP 授予访问权限。
如果添加新端点,则更改查询参数的值next
。
推荐阅读
- python-3.x - 使用 int(input()) 时,python 上的代码无法正常工作
- kotlin-multiplatform - 在 KMP 中的 iOS/android 之间共享 env 文件
- node.js - 由于依赖冲突,npm chakra-ui 安装失败
- python - 编译 python 代码时出现 IndexError
- list - SwiftUI(List & ForEach):设备的旋转导致List中的当前位置丢失
- html - td:nth-child td 的更改顺序
- java - 会话中的 Optaplanner 持久数据
- java - Big Sur 11.0.1 和 PC/SC 库的问题
- c++ - 终端将被任务重用,按任意键关闭它
- php - 无需用户注册的安全 API - php/Laravel