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 在请求访问制品仓库时的授权决策流程:

OCI IAM 授权决策流程(制品仓库访问) 主体 用户 / 动态组 发起请求 策略评估引擎 匹配所有策略 授权决策 Allow / Deny 策略存储 读取策略 条件评估 检查 where 条件 Deny 优先原则 任何 Deny 语句立即生效

组与动态组的对比

在制品目录权限边界评审中,正确区分组和动态组的使用场景至关重要:

特性 组(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 语句覆盖的部分。

下图展示了策略继承与评估的层级关系:

OCI 策略层级继承与评估模型 根区间 (Tenancy) 策略 A: Allow group Admins to manage all-resources 继承 父区间 (Parent Compartment) 策略 B: Allow group Developers to read artifacts-repository 继承 子区间 (Child Compartment) 策略 C: Deny group Developers to delete artifacts-repository 评估结果 策略 A + B 的并集 减去策略 C 的 Deny
权限边界评审关键: 在评审制品目录权限时,必须检查所有层级(Tenancy、父区间、当前区间)的策略。一个在根区间定义的宽泛 Allow 策略,可能意外授予了子区间中本不应拥有的权限。同时,要确认是否存在必要的 Deny 策略来限制高风险操作(如删除制品仓库)。