我在我们项目的GCP(Google云平台)App Engine上运行了多个微服务。在我们的情况下,最好在每个服务的基础上最小化权限。目前,我们将所有凭据文件保存在Keybase中,并根据团队成员身份划分秘密。因此,如果我正在开发一项App Engine服务,则看不到另一支团队的App Engine服务的秘密。 我们为其他秘密所做的事情,例如带有密码和秘密令牌的配置文件,我们为App Engine服务帐户提供kms解密权限,只需从firestore中提取配置文件的加密副本并对其进行解密。但是我们不想在所有地方都使用默认的App Engine服务帐户,因为使用相同服务帐户的不同团队可以访问每个人的秘密。因此,我们希望为开发中的每个App Engine服务按服务转移到服务帐户。
据我在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”放入程序中而又不出现在代码中并被广泛的人使用呢?
答案 0 :(得分:0)
如果AppEngine环境中的每个服务都必须具有自己的身份,则AppEngine无法实现。诸如Cloud Function或Cloud run之类的较新服务可以做到这一点,但是过时的服务(对于云时代而言)AppEngine(已有10多年的历史了)不能。
您拥有所有AppEngine服务的服务帐户。您可以使用它解密每个服务的其他服务帐户密钥文件,并在适当的服务中使用它们,但是根授权保留默认的App Engine服务帐户,因此所有服务/所有团队都可以访问它(以及所有加密的服务帐户密钥文件)。
也许解决方案是重新设计应用程序并每个团队都有一个项目?
答案 1 :(得分:0)
guillaume blaquiere在回答中说的是正确的,我也同意他每个团队都有一个项目的想法。您不能为每个App Engine服务创建不同的服务帐户。
尽管您想要实现的目标可能会在App Engine flexible中实现。好的,因此您无法找到只允许某个团队提供某种服务而允许其他团队提供另一种服务的方法。您可以做的(但我也不认为您想要这样做,也不推荐),通过controlling your access with Firewalls阻止了某些IP。您可以创建自己的防火墙规则,并允许来自一个地方的请求,而不是来自另一个地方的请求。
这只是一个技巧,可能对您不起作用。真正的建议是,如果您确实想使用更多的服务帐户来完整,正确地描述已描述的系统,则应考虑迁移到Cloud Run。