如何在没有密钥文件的情况下向 Cloud Run 服务授予对服务帐户凭据的访问权限?



我正在开发一个云运行服务,该服务使用服务帐户的机密文件访问不同的Google API,其中包含以下python 3代码:

from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(SECRETS_FILE_PATH, scopes=SCOPES)

为了部署它,我在构建/部署过程中上传机密文件(通过gcloud builds submitgcloud run deploy命令(。

如何避免像这样上传机密文件?

编辑1:

我认为需要注意的是,我需要模拟GSuite/Workspace中的用户帐户(具有域范围的委派(。我处理这个问题的方法是使用上面的凭据,然后是:

delegated_credentials = credentials.with_subject(USER_EMAIL)

我找到了一种解决问题的方法。

首先,正如guillaume blaquiere的回答所建议的,我使用了google.authADC机制:

import google.auth
credentials, project_id = google.auth.default(scopes=SCOPES)

但是,由于我需要模拟GSuite(现在的Workspace(帐户,因此该方法是不够的,因为从该方法生成的credentials对象没有with_subject属性。这让我找到了这个类似的帖子和具体的答案,它可以将google.auth.credentials转换为service_account.Credentials.from_service_account_file返回的Credential对象。他的解决方案有一个问题,因为似乎缺少身份验证范围。

我所要做的就是将https://www.googleapis.com/auth/cloud-platform作用域添加到以下位置:

  1. 代码中的SCOPES变量
  2. 谷歌管理员>安全性>API控制>为我正在部署的服务帐户设置客户端ID和作用域
  3. 在我项目的OAuth同意屏幕上

之后,我的Cloud Run可以访问凭据,这些凭据可以在不使用密钥文件的情况下模拟用户的帐户。

使用密钥管理器可能会对您有所帮助,因为您可以管理您拥有的多个密钥,而不必像现在这样将它们存储为文件。我建议你在这里看一看这篇文章,这样你就可以获得更多关于如何在Cloud Run中使用它的信息,以改进你管理秘密的方式。

除此之外,正如在这里的类似案例中所阐明的,您有两个选项:使用附带的默认服务帐户,或者部署另一个具有Service Admin角色的帐户。这样,你就不需要用变量指定键了——正如谷歌开发人员在这个特定的答案中所阐明的那样。

为了提高安全性,最好的方法是永远不要在本地或GCP上使用服务帐户密钥文件(我写了一篇关于这方面的文章(。为了实现这一点,谷歌云服务有一个自动加载的服务帐户,可以是默认的,也可以是自定义的。

在Cloud Run上,默认服务帐户是计算引擎默认服务帐户(我建议你永远不要使用它,它在项目中有编辑角色,太宽了!(,或者你可以指定要使用的服务帐户(--service-account=参数(

然后,在您的代码中,只需使用ADC机制(应用程序默认凭据(来获取凭据,就像Python 中的这样

import google.auth
credentials, project_id = google.auth.default(scopes=SCOPES)

最新更新