【发布时间】:2019-11-05 21:01:54
【问题描述】:
为了限制要管理的服务帐户的数量以及处理它们的密钥,我正在探索从开发人员笔记本电脑或台式机访问 GCP 资源的其他方法,以便我可以运行临时脚本或交互式程序(例如访问 GCP 服务的 Jupyter notebook)。
使用gcloud auth application-default login 在通过网络浏览器进行身份验证后生成一个刷新令牌,该令牌可用于获取和更新可用于与 GCP 服务交互的访问令牌。
我遵循的工作流程是这样的:
- 运行
gcloud auth application-default login。这会在我的磁盘上生成一个 JSON 文件 包含刷新令牌。 - 将 JSON 文件位置导出为
GOOGLE_APPLICATION_CREDENTIALS环境变量GOOGLE_APPLICATION_CREDENTIALS=/Users/my.username/.config/gcloud/application_default_credentials.json - 使用该文件通过 Google 身份验证库进行身份验证并与不同的 GCP 服务进行交互。
这很方便,因为它减少了在团队成员之间传播、保护以及在需要时共享服务帐户密钥文件的需要。但是,我注意到提供的刷新令牌不会过期并且仍然有效。
除非我在这里遗漏了什么,否则这会使application_default_credentials.json 文件与服务帐户密钥一样敏感。如果它丢失或受到损害,它可以用于获取访问令牌而无需重新验证,这是相当不安全的,IMO。
我们知道 GCP 安全最佳做法建议将服务帐号(及其密钥)用于服务到服务工作负载。我正在描述的这个场景是针对临时代码的开发/测试 开发人员或工程师的笔记本电脑。我们认为,与使用存储在硬盘中的长期服务帐户密钥相比,强制用户每隔几个小时通过网络进行交互式身份验证以获取新令牌会更加安全和方便。
我已通读 [1],但找不到明确的答案。
- 有谁知道这些刷新令牌是否过期?
- 有没有办法控制和限制它们的生命周期(最好是几小时或几分钟)?
- 此方案的最佳/常见做法是什么?每个用户使用一个服务帐号(和密钥)?
[1]https://developers.google.com/identity/protocols/OAuth2#expiration
【问题讨论】: