实验 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=NoneProject 的 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 路径累加,较窄的子级授权不会撤销父级授权。