如何使用Google KMS创建服务帐户以访问GCP项目之间的秘密?

时间:2018-12-19 18:39:05

标签: google-app-engine go google-cloud-platform

我已遵循本教程:https://cloud.google.com/kms/docs/store-secrets

下一步是让我的应用程序从存储桶中读取我的机密文件,并在运行时安全地解密。这些应用程序可在各种项目(阶段,开发,生产等)中运行。

我已经一遍又一遍地阅读了服务帐户文档,但是我不太了解正确的前进方式。

我发现有效的方法是将本教程中的服务帐户简单地添加到MY_KMS_PROJECT和MY_STORAGE_PROJECT。我将它们设置为可以读取存储桶和解密KMS密钥。只需创建这些服务帐户,其他项目中的应用程序突然就可以读取和解密。那是应该如何工作的?

我认为我必须为每个想要从教程访问KMS项目的项目创建一个服务帐户?还是以某种方式使用IAM授予访问权限?例如,如何授予某些项目中的某些应用程序的访问权限,而不授予其他人的访问权限?

我现在正在尝试授予在本地开发环境中运行的应用访问权限,这通常需要下载服务帐户并将GOOGLE_APPLICATION_CREDENTIALS指向该文件。但是,从MY_KMS_PROJECT或MY_STORAGE_PROJECT下载服务帐户对我来说似乎很奇怪,尤其是因为我已经具有用于访问Firebase的服务帐户。服务帐户是否对所有项目都是全球性的?可以合并吗? GOOGLE_APPLICATION_CREDENTIALS似乎只适合指向一个服务帐户。

注意:我的大多数应用程序都在标准或灵活的Google App Engine上运行。

这是我的项目中应用程序中的代码,它们如上所述可以“正常工作”:

client, err := google.DefaultClient(ctx, cloudkms.CloudPlatformScope)
if err != nil {
    log.Fatal(err)
}

// Create the KMS client.
kmsService, err := cloudkms.New(client)
if err != nil {
    log.Fatal(err)
}
....

并用于访问存储桶:

// Create the storage clientstorage
Client, err := storage.NewClient(ctx)
if err != nil {
    log.Fatal(err)
}
....

2 个答案:

答案 0 :(得分:2)

第一个问题: 由于这些应用程序使用与您为各个项目创建的服务帐户相同的事实,因此可能发生这种情况。在这种情况下,您需要确保这些应用程序不使用上述服务帐户。

第二个问题: 您可以尝试在组织级别使用一个服务帐户。这些服务帐户将被组织中的所有项目继承。您可以授予服务帐户那些符合您要求的角色或权限

第三个问题: 如果您使用组织级别的服务帐户,它们对于所有项目都是“全局”的:您可以查看此文档,在其中可以找到有关服务帐户和组织的有价值的信息[1] [2]

请让我知道您的想法及其进展。


链接:

[1] https://cloud.google.com/resource-manager/docs/creating-managing-organization

[2] https://cloud.google.com/iam/docs/service-accounts

答案 1 :(得分:1)

这是我发现的作品。直到我听说这是不正确或不理想的,这才是我前进的方式:

  1. 遵循“存储秘密”教程(https://cloud.google.com/kms/docs/store-secrets)。

请注意,在本教程中创建两个帐户时,由于默认情况下没有计算或应用引擎实例,因此不会自动创建服务帐户。

  1. 转到IAM以获取kms存储项目,并添加具有您想要访问权的应用程序的其他任何项目,以下载加密的机密。通过他们的服务帐户电子邮件将其添加,并具有查看存储桶的作用。

  2. 转到IAM进行kms管理项目,然后对要通过其服务帐户电子邮件解密共享机密的应用程序的任何项目执行相同的操作。

对于Localhost开发,请在启动服务之前使用“ gcloud auth应用程序默认登录名”。