IAM:授权范围与 Service Account

授权公式:Principal + resource + role + condition;权限沿 Organization / Folder / Project 继承。

完整 Hands-on 教程#

Startup IAM Hands-on:从公司账号、组和组织结构开始,依次练习团队授权、Service Account、最小权限、条件授权、Deny、组织策略、审计与离职撤权。包含 8 个实验章节及应用源码。

推荐做法#

  • 团队给 Google Group 授权;工作负载各用独立 SA,权限收敛到资源。
  • 本地优先用户 ADC 或 impersonation;CI 用 federation,云上用绑定身份。
  • actAs 允许附加 SA,Token Creator 允许签发 SA 凭据,资源 role 决定 SA 能做什么。

常用操作#

替换为实际资源;本段不依赖 lab.env。

PROJECT_ID='REPLACE_PROJECT_ID'
SERVICE_ACCOUNT='REPLACE_SA_EMAIL'

gcloud projects get-iam-policy "$PROJECT_ID"
gcloud iam service-accounts get-iam-policy "$SERVICE_ACCOUNT" --project="$PROJECT_ID"
常用变更:只允许 SA 读取一个镜像仓库

沿用上方 PROJECT_ID、SERVICE_ACCOUNT,Project 是仓库所属项目。操作者需能修改该 Repository 的 policy。

REGION='REPLACE_REGION'
REPOSITORY='REPLACE_REPOSITORY'
gcloud artifacts repositories add-iam-policy-binding "$REPOSITORY" \
  --project="$PROJECT_ID" --location="$REGION" \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role=roles/artifactregistry.reader

只有确实需要读取项目全部仓库时才在 Project 授同一 role。收窄授权还需撤销多余的上层 binding。

容易踩的坑#

  • SA 上的 policy 回答谁能使用该 SA,不列出它在所有资源上的访问权。

子资源的窄权限不会覆盖父级宽权限;删除本地 binding 也不会撤销继承授权。 查 Project / Folder / Organization 和 Group 的其他路径。使用 impersonation 时,请求按目标 SA 权限判断,不叠加操作者原权限。

Project / Repository 授权 · CLI / ADC · GKE Pod 身份 · 撤权排障 · 无长期 key

配置说明与完整示例(按需展开)

本页说明 IAM 的授权模型:身份、 role、资源,以及 Service Account impersonation。实验步骤和凭据参考按任务分到子页。

你想做什么 阅读位置
公司从零建立身份目录、管理员、员工及组织 公司身份与组织初始化
理解人员账号、团队管理及 Workload / Workforce 区别 人员账号与 Identity Federation
实测 SA 读取、写入拒绝、撤权、限时授权和 403 排障 Bucket 授权与撤权实验
配置用户登录、ADC、Terraform 认证 CLI、ADC 与 Terraform
像 AWS profile 一样管理多个账号 多账号与配置隔离
查 JSON 内容、生成方式、长期密钥限制与吊销 凭据 JSON 与密钥管理
实测 GitHub OIDC token 文件与凭据配置 外部凭据文件实验

首次学习:本页 → Bucket 实验 → 本地认证;使用 GitHub Actions 时再做外部凭据文件实验。已有问题可直接按表进入对应子页。

1. 先区分身份、权限和边界#

IAM 授权描述:哪个 Principal,在什么资源上,获得哪个 role,附带什么条件。

Principal 是接受授权的身份或集合,例如 Google 用户、Service Account、Google Group、federated identity。Google Group 成员可获得授予组的权限。Principal

例如“reader SA 可读取 Bucket”:Principal 是 reader,资源是 Bucket,role 是 Storage Object Viewer。

Organization(通常关联 Cloud Identity / Google Workspace)
└── Folder:团队、环境
    └── Project:API、配额、资源与费用归属
        └── Bucket / Cloud Run / Secret / ...

个人账号可使用无 Organization 的项目。Billing Account 负责结算,不是 IAM 资源树中的项目父节点。Google Workspace 管理员也不等于自动拥有所有云资源权限。

概念 用途 AWS 对照与区别
Google Account / Cloud Identity 用户 人的登录身份 不在每个 Project 中创建一个 IAM User
Google Group 团队批量授权 成员资格来自身份目录;优先给组授权
Service Account(SA) 应用、作业的身份 部分类似 Role 的用途,但自身也是可授权的资源
Role 一组 permissions 类似权限策略的权限集合;不能“登录一个 Role”
Principal 接受授权的身份或身份集合,回答“谁获得权限” 例如用户账号、 Service Account、 Google Group 或外部 federated identity
Allow policy 保存在资源上的授权规则集合,包含一个或多个 binding 记录谁在该资源上获得什么 role
Role binding 在一条规则中,将一个 role 授予一个或多个 Principal,可附加生效条件 例如在某个 Bucket 上把 Object Viewer 授予 reader Service Account
Service agent Google 管理的服务身份 服务运行所需,不是自建应用 SA
Workforce federation 外部员工身份进入云 面向人
Workload federation GitHub、外部云、Kubernetes 工作负载进入云 面向程序,使用短期凭据

基本 role Owner/Editor/Viewer 范围大;优先服务预定义 role,确有需求再定义 custom role。IAM 官方模型

2. 授权如何生效#

Allow 权限沿 Organization → Folder → Project → 具体资源 继承并累加。资源本地 policy 不列出全部 inherited permissions;撤权时须逐层检查。

以下假设 Bucket 与 SA 已存在;替换示例名称,操作者需有该 Bucket 的 IAM policy 修改权限。完整创建和验证见 Bucket 实验。

gcloud storage buckets add-iam-policy-binding "gs://example-project-iam-lab" \
  --member="serviceAccount:lab-reader@example-project.iam.gserviceaccount.com" \
  --role="roles/storage.objectViewer"

add-iam-policy-binding 向目标资源的 Allow policy 添加一条 role binding:

命令中的部分 表达什么 本文实验示例
--member 接受授权的 Principal;前缀说明身份类型 serviceAccount:lab-reader@example-project.iam.gserviceaccount.com,表示 lab-reader Service Account
--role 授予哪组权限 roles/storage.objectViewer,允许读取和列出对象
资源参数 将授权记录在哪里、限定哪个范围 gs://example-project-iam-lab,表示目标 Bucket

用户与 Google Group 的 member 前缀分别为 user:、group:。

同一 SA 可在不同资源获得不同 role。Allow policy 与 binding

  • 子资源删除 binding 不会撤销上层授予的权限;Conditions 可限制授权时间或支持的资源属性。
  • Deny 可阻止受支持的权限;Principal Access Boundary 可限制可访问资源范围。
  • Organization Policy 约束资源配置,例如禁止创建 SA key,不授予访问权限。
  • 网络、VPC Service Controls、API 状态、配额与数据库授权仍单独检查。策略类型

授权范围:Project 级与 Repository 级#

以 roles/artifactregistry.reader 为例。PROJECT_ID 是仓库项目,NODE_SA 是已存在的 SA 邮箱(可来自另一项目),REGION 是仓库位置;操作者需有相应资源的 IAM policy 修改权限。

授权位置 生效范围 什么时候选择
Project 项目下所有区域的仓库,包括以后创建的仓库,继承此 role 的适用权限 该身份确实需要读取整个项目的仓库
Repository 只针对指定区域中的 lab-images 仓库授予 role 只需拉取这个仓库的镜像

按实际范围选择下面一种即可,无需两条都执行。

Project 级:修改项目的 Allow policy,向下继承到仓库。

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
  --member="serviceAccount:$NODE_SA" \
  --role=roles/artifactregistry.reader

Repository 级:修改 lab-images 的 Allow policy,只在该仓库上添加授权。

gcloud artifacts repositories add-iam-policy-binding lab-images \
  --project="$PROJECT_ID" \
  --location="$REGION" \
  --member="serviceAccount:$NODE_SA" \
  --role=roles/artifactregistry.reader

两条命令都编辑 IAM policy,区别是附着资源。也可 get-iam-policy 导出、编辑后 set-iam-policy 写回,须保留其他授权及 etag。

收窄到单仓库时,先保留 Repository binding,再撤销多余 Project binding,并检查 Folder / Organization 等其他授权来源;只删 Repository binding 无法消除 Project 继承权限。仓库访问控制

3. 最容易混淆的三种授权#

操作 role 与授权位置
部署者将某个 SA 挂到 Cloud Run/VM 在该 SA 上授予 roles/iam.serviceAccountUser,提供 actAs
人使用 --impersonate-service-account 签发该 SA 的短期凭据 在该 SA 上授予 roles/iam.serviceAccountTokenCreator
外部 federated identity 通过 SA 调用 API 在该 SA 上授予限定 Principal 的 roles/iam.workloadIdentityUser

这些都不会自动赋予 SA 读取 Bucket 的权限;必须另外在 Bucket 或所属的 Project / Folder / Organization 上给 SA 授予适用的读取权限。actAs 也不等于可以直接生成 token。Service Account 认证 role

人/CI --可部署服务 + actAs--> Cloud Run
Cloud Run --运行时 SA + Bucket 授权--> Cloud Storage

部署权与高权限 SA 的 actAs 组合可能导致权限扩大,所以不能随意授予。

与 AWS AssumeRole 对照#

Service Account impersonation 类似 AWS AssumeRole:先取得目标身份的短期凭据,再以它访问资源。AWS IAM Role 是身份;GCP IAM role 是权限集合,与前者类比的是 Service Account。 官方说明

环节 AWS GCP
谁可以切换到目标身份 目标 Role 的 Trust policy(信任策略)决定信任谁;调用者还需满足相应的 sts:AssumeRole 授权与条件 在目标 SA 上给调用者授予 roles/iam.serviceAccountTokenCreator
切换后能做什么 目标 Role 的权限策略及适用的资源策略等决定 给目标 SA 授予的资源 role 及其他适用策略决定
获取短期凭据 调用 AWS STS(Security Token Service,安全令牌服务)的 AssumeRole gcloud 根据 impersonation 参数申请目标 SA 的短期凭据

AWS 的显式调用示例(替换账号 ID 和 Role 名):

aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/BucketReader \
  --role-session-name bucket-read-lab

该命令返回临时 key、session token 和过期时间,后续请求须使用这些凭据。也可在 AWS CLI profile 配置 role_arn / source_profile,通过 --profile 自动管理。AWS Role profile

GCP 则可以在访问命令上直接指定目标 SA(变量及授权步骤见 Bucket 实验):

gcloud storage cat "gs://$IAM_BUCKET/example.txt" \
  --impersonate-service-account="$READER"

gcloud 自动申请 SA 短期凭据完成本次请求,仅按目标 SA 的资源权限检查,不叠加操作者权限。未指定或配置 impersonation 时使用当前 gcloud 身份。impersonation

搜索文档

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

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