OCI IAM 基础回顾:用户、组、动态组、策略与权限语句
在深入制品目录权限边界评审之前,必须牢固掌握 OCI IAM(身份与访问管理)的核心构造。IAM 是 OCI 所有授权决策的基石,理解其基本元素——用户、组、动态组、策略(Policy)和权限语句(Statement)——是后续进行权限边界分析与优化的前提。
核心概念与职责
OCI IAM 采用基于策略的访问控制模型,其核心组件及其职责如下表所示:
| 组件 | 定义 | 典型用途 |
|---|---|---|
| 用户(User) | 代表一个独立的人或系统,通过用户名/密码或 进行身份认证。 | 管理员、开发者、运维人员、自动化脚本。 |
| 组(Group) | 一组用户的集合,是策略授权的主要目标主体。 | 将具有相同职责的用户归类,如“网络管理员组”、“审计员组”。 |
| 动态组(Dynamic Group) | 根据匹配规则自动包含 OCI 资源的虚拟组,资源无需显式加入。 | 授权计算实例、函数、容器等资源访问其他 OCI 服务。 |
| 策略(Policy) | 定义“谁(主体)在哪个位置(资源)能做什么(操作)”的规则文档。 | 授予或拒绝访问权限,是权限控制的唯一载体。 |
| 权限语句(Statement) | 策略中的最小授权单元,由动词、主体、资源、条件等构成。 | 精确描述一条具体的授权规则。 |
关键区分: 组用于管理人(用户),动态组用于管理机器(资源)。在制品目录权限边界评审中,动态组常用于授权构建服务器或部署管道访问制品仓库。
策略与权限语句的结构
OCI 策略使用一种声明式语法。一条完整的权限语句遵循以下基本结构:
Allow | Deny <主体> <动词> <资源类型> <位置> [where <条件>]
各部分的详细说明:
- Allow / Deny: 指定是授予还是拒绝权限。Deny 语句优先级高于 Allow。
- 主体: 可以是组(
group <组名>)或动态组(dynamic-group <动态组名>)。 - 动词: 定义访问级别,常见动词包括:
inspect:查看列表和元数据。read:读取资源详细信息。use:使用现有资源(如挂载存储卷、启动实例)。manage:完全控制(创建、更新、删除)。
- 资源类型: 指定 OCI 服务资源,如
artifacts-repository、compute-instances、object-buckets。 - 位置: 使用
compartment <名称>或tenancy限定资源范围。 - 条件(可选): 使用
where关键字添加更细粒度的控制,如资源标签、请求来源 IP 等。
权限语句示例
以下示例展示了如何为不同主体授予制品仓库的访问权限:
// 示例 1:允许制品管理员组管理所有制品仓库
Allow group ArtifactAdmins to manage artifacts-repository in compartment Production
// 示例 2:允许开发者组读取制品仓库中的制品
Allow group Developers to read artifacts-repository in compartment Production
// 示例 3:允许构建动态组(构建服务器)将制品推送到指定仓库
Allow dynamic-group BuildServers to use artifacts-repository in compartment Production
where target.resource.id = 'ocid1.artifactrepository.oc1..aaaa...'
权限边界评审要点: 在评审中,需特别关注
manage 动词的使用。授予 manage artifacts-repository 权限意味着主体可以删除仓库、修改配置或覆盖制品,这通常应限制在最小必要范围内。
IAM 授权流程与策略评估
下图展示了 OCI IAM 在请求访问制品仓库时的授权决策流程:
组与动态组的对比
在制品目录权限边界评审中,正确区分组和动态组的使用场景至关重要:
| 特性 | 组(Group) | 动态组(Dynamic Group) |
|---|---|---|
| 成员类型 | 用户(IAM User) | OCI 资源(实例、函数、容器等) |
| 成员加入方式 | 手动添加/移除 | 自动匹配规则(基于标签、实例类型等) |
| 典型场景 | 授予管理员、开发者等人员权限 | 授予 CI/CD 构建服务器、自动缩放组权限 |
| 策略主体语法 | group <组名> |
dynamic-group <动态组名> |
| 评审关注点 | 用户是否仍属于该组?权限是否过大? | 匹配规则是否过于宽泛?是否意外包含了非预期资源? |
权限语句中的动词与资源类型映射
在制品目录场景中,理解动词与资源类型的对应关系是编写最小权限策略的基础:
| 动词 | 对制品仓库的影响 | 典型权限语句示例 |
|---|---|---|
inspect |
列出仓库列表,查看仓库元数据 | Allow group Auditors to inspect artifacts-repository in tenancy |
read |
查看制品详情,下载制品 | Allow group Developers to read artifacts-repository in compartment Dev |
use |
推送制品、拉取制品(读写操作) | Allow dynamic-group BuildServers to use artifacts-repository in compartment Prod |
manage |
创建/删除仓库、修改配置、覆盖制品 | Allow group ArtifactAdmins to manage artifacts-repository in compartment Prod |
最佳实践: 在权限边界评审中,应优先使用
use 而非 manage 来授予 CI/CD 系统对制品仓库的访问权限。仅在确实需要管理仓库配置时,才授予 manage 权限,并配合 where 条件限制到特定仓库。
策略继承与评估逻辑
OCI 策略遵循层级继承和 Deny 优先的评估逻辑,理解这一点对于权限边界评审至关重要:
- 层级继承: 在根区间(Tenancy)级别定义的策略适用于所有子区间。在子区间定义的策略仅适用于该区间及其子区间。
- Deny 优先: 如果存在任何一条 Deny 语句匹配请求,无论有多少条 Allow 语句,请求都会被拒绝。
- 累加性: 所有匹配的 Allow 语句的权限会累加。主体最终拥有的权限是所有 Allow 语句的并集,减去所有 Deny 语句覆盖的部分。
下图展示了策略继承与评估的层级关系:
权限边界评审关键: 在评审制品目录权限时,必须检查所有层级(Tenancy、父区间、当前区间)的策略。一个在根区间定义的宽泛 Allow 策略,可能意外授予了子区间中本不应拥有的权限。同时,要确认是否存在必要的 Deny 策略来限制高风险操作(如删除制品仓库)。