3. 资源模型基础:定义、类型、属性与关系图

资源模型是 OPA 与日志平台组件拓扑权限设计的核心抽象层。它将物理或逻辑的组件(如 Pod、Service、Namespace)统一建模为可被策略引擎理解的结构化实体。理解资源模型的定义、类型、属性及关系图,是构建细粒度、可扩展权限策略的前提。

3.1 资源模型的定义

资源模型(Resource Model)是对系统中所有可被授权或审计的实体进行形式化描述的一套规范。在云原生环境中,资源模型通常遵循以下原则:

  • 统一性:所有组件(计算、网络、存储、策略)均以相同结构表达。
  • 可嵌套性:资源可以包含子资源(如 Namespace 包含 Pod)。
  • 可标识性:每个资源实例拥有全局唯一的标识符(UID)。
  • 可查询性:资源属性支持按路径或标签进行检索。
设计要点:资源模型不应与具体实现耦合。例如,日志平台中的“日志流”资源,既可以对应 Kafka Topic,也可以对应 Elasticsearch Index,但模型层统一抽象为 logstream 类型。

3.2 资源类型

资源类型(Resource Type)定义了资源的类别。在日志平台拓扑中,常见的资源类型如下表所示:

资源类型 标识符 示例实例 层级
集群 cluster prod-cluster-01 顶层
命名空间 namespace logging-system 集群下
工作负载 workload fluentbit-daemonset 命名空间下
日志流 logstream app-audit-log 工作负载下
存储后端 storage es-data-hot 日志流下
策略绑定 policybinding audit-readonly-binding 跨层级
类型扩展性:资源类型应支持自定义扩展。例如,当引入新的日志采集器(如 Vector)时,只需注册 vector-agent 类型,无需修改核心模型。

3.3 资源属性

每个资源实例都包含一组属性(Attributes),用于描述其状态、标签、元数据和访问控制信息。属性分为三类:

  • 标识属性:id(全局唯一)、name(可读名称)、type(资源类型)。
  • 拓扑属性:parent_id(父资源 ID)、path(从根到当前节点的路径,如 /cluster/ns/workload)。
  • 策略属性:labels(键值对标签)、annotations(非结构化元数据)、owner(所属团队)。

以下是一个资源实例的 JSON 表示示例:

{
  "id": "logstream:prod-cluster-01/logging-system/fluentbit-daemonset/app-audit-log",
  "name": "app-audit-log",
  "type": "logstream",
  "parent_id": "workload:prod-cluster-01/logging-system/fluentbit-daemonset",
  "path": "/cluster/prod-cluster-01/namespace/logging-system/workload/fluentbit-daemonset/logstream/app-audit-log",
  "labels": {
    "environment": "production",
    "data_classification": "audit",
    "retention_days": "90"
  },
  "annotations": {
    "description": "Application audit log stream",
    "source": "fluentbit-tail"
  },
  "owner": "security-team"
}

3.4 资源关系图

资源关系图(Resource Relationship Graph)描述了资源之间的父子、依赖和引用关系。它是 OPA 策略评估时进行路径遍历和上下文推导的基础。

下图展示了日志平台组件拓扑中的核心资源关系:

日志平台资源关系图 集群 (cluster) 命名空间 (namespace) logging-system 工作负载 (workload) fluentbit-daemonset 工作负载 (workload) vector-aggregator 日志流 (logstream) app-audit-log 日志流 (logstream) infra-metrics 存储后端 (storage) es-data-hot 存储后端 (storage) s3-archive 策略绑定 (policybinding) 说明:实线箭头表示父子关系,虚线箭头表示策略绑定可跨层级引用任意资源

关系图的关键特征:

  • 树形结构:从集群到存储后端形成严格的父子层级,每个子资源只有一个父资源。
  • 跨层级引用:策略绑定(policybinding)可以引用任意层级的资源,实现灵活的权限控制。
  • 路径唯一性:每个资源实例的 path 属性在图中唯一确定其位置。

3.5 资源模型在 OPA 策略中的应用

OPA 策略通过 input.resource 获取当前请求的资源实例,然后利用资源模型进行路径匹配和属性检查。以下是一个基于资源路径的授权策略示例:

package platform.authz

# 允许安全团队访问所有 audit 分类的日志流
default allow = false

allow {
    input.resource.type == "logstream"
    input.resource.labels.data_classification == "audit"
    input.user.team == "security-team"
}

# 允许运维团队访问其所属命名空间下的所有资源
allow {
    input.resource.path =~ sprintf("/cluster/%s/namespace/%s/*", [input.user.cluster, input.user.namespace])
    input.user.role == "ops"
}
注意:资源模型的路径匹配应使用前缀匹配或正则表达式,避免硬编码完整路径。OPA 的 glob.match 或 re_match 函数可用于高效路径模式匹配。

3.6 资源模型设计检查清单

在定义资源模型时,建议对照以下清单进行验证:

检查项 说明 通过标准
类型完备性 所有需要授权的组件是否都有对应资源类型 无遗漏
属性可扩展性 是否支持通过 labels/annotations 添加自定义属性 支持
路径唯一性 每个资源实例的 path 是否全局唯一 是
关系图无环 父子关系是否构成有向无环图(DAG) 是
策略可表达性 是否能用资源模型表达所有预期的权限规则 覆盖 90%+ 场景

通过以上定义、类型、属性和关系图的系统设计,资源模型为 OPA 策略引擎提供了结构化的数据基础,使得日志平台组件拓扑的权限控制既精确又灵活。