使用OAuth2令牌互动使用GCP服务而不是服务帐户(密钥)

时间:2019-06-24 04:58:49

标签: google-cloud-platform

为了限制要管理和处理其密钥的服务帐户的数量,我正在探索从开发人员便携式计算机或台式机访问GCP资源的其他方法,以便我可以运行临时脚本或交互式程序(例如Jupyter笔记本)访问GCP服务。

通过网络浏览器进行身份验证后,使用gcloud auth application-default login生成刷新令牌,该刷新令牌可用于获取和更新可用于与GCP服务进行交互的访问令牌。

我要遵循的工作流程是这样:

  1. 运行gcloud auth application-default login。这会在我的磁盘上生成一个JSON文件,该文件 包含刷新令牌。
  2. 将JSON文件位置导出为GOOGLE_APPLICATION_CREDENTIALS env变量 GOOGLE_APPLICATION_CREDENTIALS=/Users/my.username/.config/gcloud/application_default_credentials.json
  3. 使用该文件通过Google身份验证库进行身份验证,并与其他GCP服务进行交互。

这很方便,因为它减少了在团队成员之间分发,保护和共享服务帐户密钥文件的需求。但是,我注意到提供的刷新令牌没有过期,并且仍然有效。

除非我在此处缺少任何内容,否则这将使application_default_credentials.json文件像服务帐户密钥一样敏感。如果它丢失或受到损害,则可以用于获取访问令牌,而无需重新认证,这是非常不安全的IMO。

我们知道GCP安全最佳做法,建议针对 service-to-service 工作负载使用服务帐户(及其密钥)。我正在描述的场景是临时的,开发/测试代码 开发人员或工程师的笔记本电脑。我们认为,与使用硬盘驱动器中存储的长期服务帐户密钥相比,强制用户每隔几个小时通过Web进行交互身份验证以获取新令牌会更安全,更方便。

我已经阅读了[1],但是找不到确切的答案。

  • 有人知道这些刷新令牌是否到期吗?
  • 是否可以控制和限制其寿命(理想情况下为数小时或数分钟)?
  • 此方案的最佳/常见做法是什么?每个用户使用一个服务帐户(和密钥)?

[1] https://developers.google.com/identity/protocols/OAuth2#expiration

1 个答案:

答案 0 :(得分:1)

注意:用户凭据也具有刷新令牌。

  

有人知道这些刷新令牌是否到期吗?

Google OAuth刷新令牌不会过期。他们可以被撤销。

  

有没有一种方法可以控制和限制其寿命(理想情况下是   小时或几分钟)?

您可以定期撤销刷新令牌,这会使访问和客户端ID令牌无效。这意味着您正在处理刷新令牌,这增加了另一个要管理的安全问题。

  

此方案的最佳/常见做法是什么?使用一个   每个用户的服务帐户(和密钥)?

如果您使用用户凭据(登录Google的方法),则会收到SDK警告,并且如果您进行大量API调用,则会被阻止。 Google不想让您使用用户凭据代替服务帐户凭据。用户凭据的验证过程需要在Google的后端系统上付出更多的努力。假定用户凭据是在不安全的环境(Web浏览器)中创建的,而服务帐户凭据则假定是在安全的环境中创建的。

最佳实践是将服务帐户JSON密钥文件发布到仅具有该应用程序运行所需权限的单个应用程序。例如,如果您创建仅需要读取Cloud Storage对象的工具,则创建仅具有读取权限的服务帐户。定期应旋转服务帐户密钥,并下载新密钥和删除旧密钥。每个应用程序应具有其自己的服务帐户JSON密钥文件。我写了一篇有关如何在Cloud Storage上安全存储JSON密钥文件的文章。这有助于旋转密钥,因为您的应用程序仅在需要时下载最新密钥。 (link)。我的文章讨论了Google Cloud Run,但是同样的原理也适用。