实验 02 团队授权与继承#

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

目标与操作者#

管理员配置授权;Bob 验证读取行为。先用 Cloud Run Viewer 展示角色绑定;下一章再用真实对象操作检验权限。管理员需要项目策略修改权;文件夹实验另外需要该文件夹的策略修改权。

直接授权与组授权#

管理员执行:

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
  --member="user:$DEV_EMAIL" --role=roles/run.viewer --condition=None

gcloud projects get-iam-policy "$PROJECT_ID" --format=json > records/project-allow.json

在 Bob 的独立会话中执行:

gcloud run services list --project="$PROJECT_ID" --region="$REGION"

预期成功,尚无服务时返回空列表。它不代表 Bob 能部署服务。若服务 API 要求额外的消费配额权限,记录具体缺失权限,由管理员在所需项目授予 Service Usage Consumer 后重试,不能忽略另一层失败。

管理员改为通过组授予同一角色,再移除直接绑定:

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
  --member="group:$DEV_GROUP" --role=roles/run.viewer --condition=None

gcloud projects remove-iam-policy-binding "$PROJECT_ID" \
  --member="user:$DEV_EMAIL" --role=roles/run.viewer --condition=None

等待传播后,Bob 仍能列出服务,因为他属于开发组。只有从组中移除 Bob 且没有其他授权路径时,这条路径才会消失。实验后把 Bob 加回组。

继承实验#

管理员给 Tenant-A 下的实验 Non-production 文件夹授予租户 A 开发组同一角色,然后移除项目级组绑定:

gcloud resource-manager folders add-iam-policy-binding "$NONPROD_FOLDER_ID" \
  --member="group:$DEV_GROUP" --role=roles/run.viewer --condition=None

gcloud projects remove-iam-policy-binding "$PROJECT_ID" \
  --member="group:$DEV_GROUP" --role=roles/run.viewer --condition=None

Project 的 get-iam-policy 只展示本级策略,不包含完整有效权限。 Bob 仍可通过 Folder 继承读取;到 Console IAM 查看继承来源并对照父级 policy。

该授权也可能让 Bob 读取 test 的服务;这说明“放在父级方便管理”会扩大范围。租户 A 的生产文件夹和租户 B 的项目不因这条绑定自动获得访问。

若已准备租户 B 的测试项目,可用 Bob 的同一身份对其执行相同的服务列表查询:在 API 已启用且没有其他授权路径的前提下,预期权限拒绝。若成功,检查 Organization 继承、直接绑定和其他组;不能把空列表当作访问被拒绝。若尚未创建租户 B,只记录该项为未执行,不宣称已验证跨租户隔离。

回滚与验收#

gcloud resource-manager folders remove-iam-policy-binding "$NONPROD_FOLDER_ID" \
  --member="group:$DEV_GROUP" --role=roles/run.viewer --condition=None

清理本章全部实验绑定。记录 Bob 当前还剩哪些权限。解释:Group 是身份集合,Folder 是资源容器;多个 Allow 路径累加,较窄的子级授权不会撤销父级授权。

参考:资源继承、传播延迟。


上一章 · 教程目录 · 下一章

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭