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



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

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

其他人提到,您只需通过以下操作登录云SDK和ADC(应用程序默认凭据):

$ gcloud auth application-default login
然后,像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()))

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

我唯一担心的是,它将要求我进行换行我想使用的所有谷歌云客户端库,检查我是否在本地运行我的应用程序:

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访问范围?)我正在使用,这很烦人。

我的问题是:我走的方向对吗?我深思的吗?有没有更简单的方法来实现这一切?

以下是我使用的一些来源:

  • https://readthedocs.org/projects/google-auth/downloads/pdf/latest/
  • https://cloud.google.com/iam/docs/creating-short-lived-service-account-credentials
  • https://cloud.google.com/docs/authentication/production
  • https://youtu.be/IYGkbDXDR9I?t = 822

更新1

这个话题在这里讨论。

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

<标题>更新2 h1> 能已经实现!

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

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

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

我很快在Python中检查了一下,它似乎实现了。尝试一下最新版本(2021年8月3日之后发布),让我知道!!

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

最新更新