如何为GCP VM本地用户授权上传文件到GCP存储桶
核心规则说明
GCP IAM 权限体系仅识别云侧管理的身份主体(包括Google个人/企业账号、服务账号、Google群组、Workload Identity 联邦身份等),不会感知虚拟机内部通过adduser创建的本地操作系统用户,因此在云控制台IAM页面无法检索到user1属于正常情况,需要通过「云身份代理」的方式为本地用户授予访问权限。
方案1:统一服务账号授权(适合VM内所有可信用户共享存储权限的场景,配置最简单)
该方案直接给VM实例绑定的服务账号授权,VM内所有能调用gcloud/gsutil的本地用户默认继承该服务账号的权限:
- 确认VM绑定的服务账号
进入Compute Engine控制台,打开vm001的详情页,找到「服务账号」字段,记录对应的服务账号邮箱,默认格式一般为<你的项目ID>-compute@developer.gserviceaccount.com。 - 检查VM的API访问范围
同样在VM详情页找到「Cloud API访问范围」配置项,如果Cloud Storage对应的权限是「只读」或者「无访问权限」,需要先停止VM,将存储权限修改为「读写」,或者直接选择「允许对所有Cloud API的完整访问权限」,修改完成后再启动VM。注意:访问范围是VM层面的权限闸门,哪怕IAM给了权限,范围没放开也会报403。 - 给服务账号绑定存储桶权限
进入Cloud Storage控制台,打开bucket1的「权限」页,点击「授予访问权限」,主体填写上一步记录的VM服务账号邮箱,根据需求绑定对应角色:- 仅需要上传文件:选择
Storage Object Creator角色 - 需要上传/下载/删除等完整操作权限:选择
Storage Object Admin角色
- 仅需要上传文件:选择
- 本地用户侧验证
切换到user1账号,执行gsutil cp -r dir_name gs://bucket1即可正常上传,不需要额外做账号登录配置——VM上的gcloud/gsutil默认会通过元数据服务自动获取绑定服务账号的临时凭证。
方案2:独立服务账号授权(适合需要给不同本地用户分配不同云权限的场景,权限隔离性好)
如果需要给user1单独分配权限,禁止其他本地用户获取bucket1的访问权,可采用独立服务账号+密钥的方式配置:
- 创建专用服务账号
进入IAM控制台的「服务账号」页面,新建一个专门给user1使用的服务账号(比如命名为vm-user1-sa),给这个服务账号绑定bucket1的Storage Object Creator(或其他实际需要的)角色。 - 生成并下发服务账号密钥
进入刚创建的服务账号详情页,切换到「密钥」标签,点击「添加密钥」->「创建新密钥」,选择JSON格式下载密钥文件。将密钥文件上传到vm001的/home/user1/目录下,重命名为gcp-sa-key.json,执行以下命令修正权限,避免其他本地用户窃取凭证:chown user1:user1 /home/user1/gcp-sa-key.json chmod 600 /home/user1/gcp-sa-key.json - 配置user1的默认认证身份
切换到user1账号,执行以下命令激活服务账号身份:gcloud auth activate-service-account --key-file=/home/user1/gcp-sa-key.json - 验证上传
执行原gsutil cp命令即可正常上传,该身份仅对user1生效,其他本地用户默认不会获取该服务账号的权限。
生产环境可选优化方案:Workload Identity 免密钥映射
如果不想在VM本地存储服务账号密钥文件,可以开启GCE的Workload Identity功能,直接将VM内的本地OS用户/用户组映射到指定的云服务账号,全程通过元数据服务自动获取临时凭证,无密钥泄露风险,适合生产环境使用,配置逻辑和方案2类似,仅省去本地存储密钥文件的步骤。
常见踩坑点
- 不要给服务账号绑定超出需求的权限,比如只需要上传就不要授予存储桶管理员权限,遵循最小权限原则
- 服务账号密钥文件一旦泄露,任何持有文件的主体都可以访问对应云资源,必须严格控制文件的读取权限
- 配置完成后如果仍报403错误,可先执行
gsutil ls gs://bucket1排查是权限问题还是路径错误,再依次校验IAM角色绑定、VM访问范围、本地认证身份三个配置项是否正确
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

