【问题标题】:How to manage Google Cloud credentials for local development如何管理用于本地开发的 Google Cloud 凭据
【发布时间】:2021-11-23 12:06:28
【问题描述】:

我搜索了很多如何验证/授权谷歌的客户端库,似乎没有人同意如何去做。

有些人说我应该创建一个服务帐户,从中创建一个密钥,然后将该密钥提供给每个想要充当该服务帐户的开发人员。我讨厌这种解决方案,因为它会将服务帐户的身份泄露给多人。

其他人提到您只需执行以下操作即可使用 Cloud SDK 和 ADC(应用程序默认凭据)登录:

$ gcloud auth application-default login

然后,google-cloud-storage 之类的库将从 ADC 加载与我的用户绑定的凭据。 这更好,但对我来说仍然不好,因为这需要转到IAM 并为每个开发人员(或一组)授予应用程序运行所需的权限。此外,如果开发人员出于测试目的在本地运行许多应用程序(例如微服务),则所需的权限列表可能会很长。一段时间后我们也很难理解为什么我们会授予这样的权限。

我遇到的最后一种方法是服务帐户模拟。这解决了将私钥暴露给开发人员的事实,让我们定义应用程序所需的权限,比如说 A 一次,将它们关联到服务帐户并说:

嘿,让 Julien 充当服务帐户,用于应用程序 A

下面是如何冒充委托人的 sn-p:

from google.auth import impersonated_credentials
from google.auth import default

from google.cloud import storage

target_scopes = ['https://www.googleapis.com/auth/devstorage.read_only']

credentials, project = default(scopes=target_scopes)

final_credentials = impersonated_credentials.Credentials(
    source_credentials=credentials,
    target_principal="foo@bar-271618.iam.gserviceaccount.com",
    target_scopes=target_scopes
)

client = storage.Client(credentials=final_credentials)

print(next(client.list_buckets()))

如果您想自己尝试此操作,您需要创建要模拟的服务帐户(此处为 foo@bar-271618.iam.gserviceaccount.com)并授予您的用户角色 @ 987654332@ 来自服务帐户权限选项卡。

我唯一担心的是,它需要我包装我想要使用的所有 Google Cloud 客户端库,以检查我是否在本地运行我的应用程序:

from google.auth import impersonated_credentials
from google.auth import default

from google.cloud import storage

target_scopes = ['https://www.googleapis.com/auth/devstorage.read_only']

credentials, project = default(scopes=target_scopes)
if env := os.getenv("RUNNING_ENVIRONMENT") == "local":
    credentials = impersonated_credentials.Credentials(
        source_credentials=credentials,
        target_principal=os.environ["TARGET_PRINCIPAL"],
        target_scopes=target_scopes
    )

client = storage.Client(credentials=credentials)
print(next(client.list_buckets()))

另外,我必须定义我正在使用的范围(我认为是 oauth2 访问范围?),这很烦人。

我的问题是:我的方向正确吗?我想太多了吗?有没有更简单的方法来实现所有这些?

这是我使用的一些来源:

更新 1

这个话题在here讨论。

我提出了第一个建议here 来支持这项改进。

【问题讨论】:

  • 我想我听到您说您需要开发人员的凭据。我认为有助于理解您的故事的是描述最终应用程序将如何使用?您是在构建最终用户需要凭据的应用程序,还是在构建最终将作为一个身份运行的应用程序?
  • 我明白了。想象一个 Cloud Run 应用使用服务帐号 A 从存储桶中读取文件。我怎样才能在本地开发和测试我的应用程序而不会遇到上述问题?
  • 我会假设,当您部署 Cloud Run 应用程序时,您会将其配置为在部署时“作为”所需的服务帐户运行。这意味着您的实际代码无需为显式服务帐户命名或检索密钥。如果是这种情况,那么您的开发人员确实应该使用应用程序默认凭据进行测试。您的开发人员应使用足够的权限进行 gcloud 身份验证,以写入“A”存储桶。它必须是您的生产桶吗?我会说不...将存储桶名称作为变量传递并使用开发存储桶。
  • 这是我直到现在都在做的事情,但是......权限维护非常困难。假设您要在 Cloud Run 中部署 10 个不同的应用程序,并且每个应用程序都具有完全不同的权限。在这些应用程序上进行开发意味着您必须授予委托人(用户或组)所需的所有权限。查看 IAM,您会看到人员或组附加了一堆角色,您将无法知道为什么需要它们,以及如果应用程序的要求发生变化,您是否可以删除其中一些角色。如果您模拟服务帐户不会出现问题?
  • @Kolban 我假设最终的应用程序将是一个名为“Fake Spacestation”的产品。见:space.com/russian-film-crew-soyuz-docks-at-space-station

标签: authentication google-cloud-platform google-authentication impersonation service-accounts


【解决方案1】:

您可以使用新的 gcloud 功能并像这样模拟您的本地凭据:

gcloud auth application-default login --impersonate-service-account=<SA email>

这是一项新功能。作为一名 Java 和 Golang 开发人员,我检查并测试了 Java 客户端库,它已经支持这种身份验证模式。但是,在 Go 中还不是这样。我提交了一个pull request 以将其添加到 go 客户端库中。

我很快检查了 Python,它是 seems implemented。试用最新版本之一(2021 年 8 月 3 日之后发布)并告诉我!!

注意:少数人知道您的用例。我很高兴在这种情况下不再孤单 :)

【讨论】:

  • 完美!我试过了,但似乎还没有完全支持:google.auth.exceptions.DefaultCredentialsError: The file C:\Users\klaer\AppData\Roaming\gcloud\application_default_credentials.json does not have a valid type. Type is impersonated_service_account, expected one of ('authorized_user', 'service_account', 'external_account'). 至少在这种情况下我并不孤单!
  • @MadJlzz 随意在 GitHub 中打开一个主题,因为我们可以看到还有许多其他人可以从这个功能中受益。 [github.com/googleapis/google-auth-library-python/issues]
  • @BryanL 我想相关问题在这里:github.com/googleapis/google-auth-library-python/issues/762 我将通过提供详细信息进行评论。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多