为了提高容器的安全性,我正在努力了解将服务帐户分配给云运行服务的实际作用。我有多个进程在云运行服务中运行,并不是所有进程都需要访问项目资源。
我想问的一个更具体的问题是:我是否可以创建多个用户并作为一个没有访问服务帐户权限的用户运行某些进程,或者每个用户都有访问服务帐户的权限
我在一个虚拟机实例上运行了一个小实验(我想这与Cloud run的情况类似(,在那里我创建了一个新用户,创建后,它没有被授权使用该实例的服务帐户。然而,我不确定是否有一种方法可以授权它,这会使我的方法不安全。
谢谢。
编辑
为了执行测试,我创建了一个新的操作系统用户,并使用了新用户帐户中的"gcloud auth-list"。然而,我本应该提出curl请求,并且我本可以检索下面的答案所指出的凭据。
我不太清楚您的问题,但我会尽力为您提供一些意见。
当你在Cloud run上运行服务时,你有两个选择来定义其身份
- 要么是使用的计算引擎服务帐户(默认情况下,您不指定任何内容(
- 或者是您在部署时指定的服务帐户
此服务帐户对云运行服务有效(每个项目最多可以有1000个不同的服务(。
现在,当您运行容器时,服务帐户并没有真正加载到容器中(这与计算引擎相同(,但有一个API可用于请求此服务帐户的身份验证数据。它的名称元数据服务器
它并不局限于用户(我不知道你是如何在计算引擎上执行测试的!(,一个简单的curl就足够获取数据了。
例如,当您使用库时会使用此元数据服务器,并且您使用";默认凭证";。gcloud SDK也使用它。
我希望你现在有更好的视野。如果没有,请在问题或评论中添加详细信息
具体来说,如果您没有分配服务帐户,Cloud Run将使用计算引擎默认服务帐户。
此默认帐户在您的项目中具有Editor
角色(换句话说,它几乎可以对GCP项目执行任何操作,除了创建新的服务帐户并授予他们访问权限,以及删除GCP项目(。如果您使用默认的服务帐户,而您的容器被破坏,您可能会遇到麻烦。⚠️
但是,如果指定新的--service-account
,默认情况下它没有权限。您必须绑定应用程序所需的角色或权限(例如GCS Object Reader、PubSub Publisher…(。
添加前面的答案,如果您正在使用类似Cloud Build的东西,下面是如何实现它的
steps:
- name: gcr.io/cloud-builders/gcloud
args:
- '-c'
- "gcloud secrets versions access latest --secret=[SECRET_NAME] t --format='get(payload.data)' | tr '_-' '/+' | base64 -d > Dockerfile"
entrypoint: bash
- name: gcr.io/cloud-builders/gcloud
args:
- '-c'
- gcloud run deploy [SERVICE_NAME] --source . --region=[REGION_NAME] --service-account=[SERVICE_ACCOUNT]@[PROJECT_ID].iam.gserviceaccount.com --max-instances=[SPECIFY_REQUIRED_VALUE]
entrypoint: /bin/bash
options:
logging: CLOUD_LOGGING_ONLY
我在一个个人项目中使用了这个,但我会解释一下这里发生了什么。第一个是从我的Secret Manager中提取数据,在那里我存储了一个带有Secret环境变量的Dockerfile。这是可选的,如果你没有存储任何API密钥和秘密,你可以跳过它。但如果你有一个不同的文件夹结构(即不是平面的(
第二个从源代码部署Cloud Run。相关文档可在此处找到。https://cloud.google.com/run/docs/deploying-source-code