如何管理本地开发的 Google Cloud 凭据

Mad*_*lzz 5 authentication impersonation google-authentication service-accounts google-cloud-platform

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

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

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

$ gcloud auth application-default login
Run Code Online (Sandbox Code Playgroud)

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

我遇到的最后一种方法是服务帐户模拟。这解决了向开发人员公开私钥的问题,让我们定义应用程序所需的权限,假设A一次,将它们关联到服务帐户并说:

嘿,让 Julien充当应用程序A所使用的服务帐户。

以下是如何模拟主体的片段:

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()))
Run Code Online (Sandbox Code Playgroud)

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

我唯一担心的是,它需要我将我想要使用的所有 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()))
Run Code Online (Sandbox Code Playgroud)

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

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

这是我使用的一些来源:

更新1

这个话题就在这里讨论。

在这里提出了第一个建议来支持这一增强功能。

更新2

该功能已实现!详细信息请参见此处

gui*_*ere 5

您可以使用新的 gcloud 功能并模拟您的本地凭据,如下所示:

gcloud auth application-default login --impersonate-service-account=<SA email>
Run Code Online (Sandbox Code Playgroud)

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

我很快检查了Python,它似乎已经实现了。尝试一下最新版本(2021 年 8 月 3 日后发布)并告诉我!

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