【问题标题】:Custom service account for App Engine serviceApp Engine 服务的自定义服务帐号
【发布时间】:2020-02-15 14:25:53
【问题描述】:

我有多个微服务在我们项目的 GCP(谷歌云平台)App Engine 上运行。在我们的例子中,最好在每个服务的基础上最小化权限。目前,我们将所有凭证文件保存在 Keybase 中,并按团队成员划分秘密。因此,如果我正在开发一个 App Engine 服务,我无法看到另一个团队的 App Engine 服务的秘密。 我们一直在为其他秘密做些什么,例如使用密码和秘密令牌配置文件,我们授予应用引擎服务帐户 kms 解密权限,并简单地从 firestore 拉取配置文件的加密副本并解密。但是我们不想到处使用默认的应用引擎服务帐户,因为使用相同服务帐户的不同团队可以访问每个人的秘密。因此,我们希望为每个正在开发的应用引擎服务在每个服务的基础上转移到一个服务帐户。

根据我在 Google 文档中的信息,他们希望您在我们部署应用程序时上传凭证文件,这有效,但是,从云控制台,似乎很难锁定谁可以查看部署到服务的文件,任何有权访问的人都可以简单地复制/粘贴所有凭据。

如果你在字典中有配置,你可以这样做:


from google.oauth2 import service_account
from google.cloud import kms_v1
d = {'type': 'service_account',
     'project_id': 'my-awesome-project',
     'private_key_id': '074139282fe9834ac23401',
     'private_key': '-----BEGIN PRIVATE KEY----\n supersecretkeythatnobodyknows==\n-----END PRIVATE KEY-----\n',
     'client_email': 'my-cool-address@my-awesome-project.iam.gserviceaccount.com',
     'client_id': '1234567890',
     'auth_uri': 'https://accounts.google.com/o/oauth2/auth',
     'token_uri': 'https://oauth2.googleapis.com/token',
     'auth_provider_x509_cert_url': 
     'https://www.googleapis.com/oauth2/v1/certs',
     'client_x509_cert_url': 'https://www.googleapis.com/robot/v1/metadata/x509/my-cool-addres%40my-awesome-project.iam.gserviceaccount.com'}

credentials = service_account.Credentials.from_service_account_info(d)
kms_client = kms_v1.KeyManagementServiceClient(credentials=credentials)

这行得通,但是我们如何将字典“d”放入程序中,而不会出现在代码中并被广泛的人访问?

【问题讨论】:

    标签: python google-app-engine google-cloud-platform gcloud


    【解决方案1】:

    guillaume blaquiere 在他的回答中所说的是正确的,我也同意他关于每个团队都有一个项目的想法。您不能为 App Engine 的每项服务创建不同的服务帐户。

    尽管您想要实现的目标可能在 App Engine 中以某种方式实现。好的,所以您无法找到一种方法,只允许某个团队提供某些服务,而其他团队提供另一个服务。您可以做的(但我认为您不希望这样做,我也不推荐)是阻止某些 IP,controlling your access with Firewalls。您可以创建自己的防火墙规则并允许来自一个地方的请求,而不是来自另一个地方的请求。

    这只是一个技巧,可能对你有用,也可能对你没用。真正的建议是,如果你真的想用更多的服务帐户来实现你所描述的干净和正确的系统,你应该考虑迁移到Cloud Run

    【讨论】:

      【解决方案2】:

      如果您的 AppEngine 环境中的每个服务都必须有自己的身份,那么 AppEngine 就不可能。 Cloud Function 或 Cloud run 等较新的服务可以做到这一点,但非常老的服务(云时代)AppEngine(已有 10 多年的历史)不能。

      您拥有所有 AppEngine 服务的服务帐号。您可以使用它来解密其他服务帐户密钥文件,每个服务并在适当的服务中使用它们,但根授权保留默认的 App Engine 服务帐户,因此所有服务/所有团队都可以访问它(以及所有加密的服务帐户密钥文件)。

      也许解决方案是重新设计应用程序并让每个团队都有一个项目?

      【讨论】:

        猜你喜欢
        • 2019-08-29
        • 2018-09-03
        • 2018-07-31
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2020-09-14
        • 2018-04-20
        相关资源
        最近更新 更多