为了限制要管理和处理其密钥的服务帐户的数量,我正在探索从开发人员便携式计算机或台式机访问GCP资源的其他方法,以便我可以运行临时脚本或交互式程序(例如Jupyter笔记本)访问GCP服务。
通过网络浏览器进行身份验证后,使用gcloud auth application-default login
生成刷新令牌,该刷新令牌可用于获取和更新可用于与GCP服务进行交互的访问令牌。
我要遵循的工作流程是这样:
gcloud auth application-default login
。这会在我的磁盘上生成一个JSON文件,该文件
包含刷新令牌。GOOGLE_APPLICATION_CREDENTIALS
env变量
GOOGLE_APPLICATION_CREDENTIALS=/Users/my.username/.config/gcloud/application_default_credentials.json
这很方便,因为它减少了在团队成员之间分发,保护和共享服务帐户密钥文件的需求。但是,我注意到提供的刷新令牌没有过期,并且仍然有效。
除非我在此处缺少任何内容,否则这将使application_default_credentials.json
文件像服务帐户密钥一样敏感。如果它丢失或受到损害,则可以用于获取访问令牌,而无需重新认证,这是非常不安全的IMO。
我们知道GCP安全最佳做法,建议针对 service-to-service 工作负载使用服务帐户(及其密钥)。我正在描述的场景是临时的,开发/测试代码 开发人员或工程师的笔记本电脑。我们认为,与使用硬盘驱动器中存储的长期服务帐户密钥相比,强制用户每隔几个小时通过Web进行交互身份验证以获取新令牌会更安全,更方便。
我已经阅读了[1],但是找不到确切的答案。
[1] https://developers.google.com/identity/protocols/OAuth2#expiration
答案 0 :(得分:1)
注意:用户凭据也具有刷新令牌。
有人知道这些刷新令牌是否到期吗?
Google OAuth刷新令牌不会过期。他们可以被撤销。
有没有一种方法可以控制和限制其寿命(理想情况下是 小时或几分钟)?
您可以定期撤销刷新令牌,这会使访问和客户端ID令牌无效。这意味着您正在处理刷新令牌,这增加了另一个要管理的安全问题。
此方案的最佳/常见做法是什么?使用一个 每个用户的服务帐户(和密钥)?
如果您使用用户凭据(登录Google的方法),则会收到SDK警告,并且如果您进行大量API调用,则会被阻止。 Google不想让您使用用户凭据代替服务帐户凭据。用户凭据的验证过程需要在Google的后端系统上付出更多的努力。假定用户凭据是在不安全的环境(Web浏览器)中创建的,而服务帐户凭据则假定是在安全的环境中创建的。
最佳实践是将服务帐户JSON密钥文件发布到仅具有该应用程序运行所需权限的单个应用程序。例如,如果您创建仅需要读取Cloud Storage对象的工具,则创建仅具有读取权限的服务帐户。定期应旋转服务帐户密钥,并下载新密钥和删除旧密钥。每个应用程序应具有其自己的服务帐户JSON密钥文件。我写了一篇有关如何在Cloud Storage上安全存储JSON密钥文件的文章。这有助于旋转密钥,因为您的应用程序仅在需要时下载最新密钥。 (link)。我的文章讨论了Google Cloud Run,但是同样的原理也适用。