3. 日志平台组件拓扑模型

在构建 OPA 策略集成测试环境之前,必须首先明确日志平台的核心组件、服务间依赖关系以及数据流路径。本章定义的标准拓扑模型将作为后续权限规则注入与验证的基准环境。

3.1 核心组件定义

日志平台采用经典的 ELK 技术栈,并引入消息队列与边车采集器以增强可观测性与策略执行点。下表列出各组件的功能角色与 OPA 策略集成点:

组件名称 版本/类型 核心功能 OPA 策略集成点
Fluentd v1.16+ 日志采集、解析、转发;支持多输入源与输出插件 输出过滤阶段:通过 OPA 插件对日志标签/字段执行脱敏或阻断策略
Kafka 3.5+ 高吞吐消息队列,解耦采集与消费,提供数据缓冲 生产/消费端:OPA 对 topic 写入权限与消息 schema 进行校验
Logstash 8.11+ 日志聚合、过滤、转换;支持复杂管道编排 filter 阶段:OPA 对事件字段进行合规检查,拒绝不合规日志进入下游
Elasticsearch 8.11+ 分布式存储与检索引擎,管理日志索引与分片 索引写入/查询:OPA 对索引级别权限、字段级脱敏、查询 DSL 进行策略控制
Kibana 8.11+ 可视化与仪表板,提供日志搜索、告警、机器学习界面 空间/角色/操作:OPA 对仪表板访问、Saved Objects 操作、API 路由进行授权
Filebeat 8.11+ 轻量级日志采集器,部署于业务节点作为边车 采集阶段:OPA 对文件路径、多行合并规则进行策略校验
策略集成要点: 每个组件都暴露了可插入的策略执行点。在测试拓扑中,我们将在 Fluentd 输出端、Logstash filter 段、Elasticsearch 索引写入前以及 Kibana API 网关层分别注入 OPA Sidecar 或内置插件,以验证权限规则的全链路覆盖。

3.2 服务间依赖关系

组件之间的依赖关系决定了数据流转的先后顺序与策略执行时机。下图以有向图形式展示核心依赖:

日志平台组件依赖关系图 日志平台组件依赖关系图 Filebeat Fluentd Kafka Logstash Elasticsearch Kibana 说明: 箭头方向表示日志数据的流动方向。OPA 策略可插入在 Fluentd→Kafka、Logstash→Elasticsearch、Elasticsearch→Kibana 三条链路上。
依赖关系要点:
  • Filebeat → Fluentd: 边车采集器将原始日志推送给 Fluentd 进行结构化解析。
  • Fluentd → Kafka: 解析后的日志以 topic 形式写入 Kafka,实现削峰填谷。
  • Kafka → Logstash: Logstash 从 Kafka 消费日志,执行字段过滤与富化。
  • Logstash → Elasticsearch: 处理后的日志批量写入 Elasticsearch 索引。
  • Elasticsearch → Kibana: Kibana 通过 REST API 查询 Elasticsearch 进行可视化展示。

3.3 数据流路径

一条典型的日志记录从产生到展示,会经过以下 6 个阶段。每个阶段都可能触发 OPA 策略检查:

  1. 采集阶段: Filebeat 监听日志文件变化,读取新行并添加元数据(host、timestamp)。
  2. 解析阶段: Fluentd 根据配置的 parser 插件(如 regexp、json、ltsv)将原始文本转为结构化事件。
  3. 缓冲阶段: 结构化事件被序列化后发送到 Kafka 指定 topic,等待下游消费。
  4. 过滤阶段: Logstash 从 Kafka 拉取事件,执行 filter 插件链(grok、mutate、geoip),并在此处调用 OPA 进行合规判定。
  5. 存储阶段: 合规事件通过 bulk API 写入 Elasticsearch 索引;OPA 在此处校验索引名称、字段映射与写入权限。
  6. 展示阶段: Kibana 发起查询请求,Elasticsearch 返回结果;OPA 对查询 DSL 进行安全审计,防止数据泄露。

以下 SVG 展示了完整的数据流路径,并标注了 OPA 策略执行点:

日志数据流路径与 OPA 策略执行点 日志数据流路径与 OPA 策略执行点 ① 采集 Filebeat ② 解析 Fluentd ③ 缓冲 Kafka ④ 过滤 Logstash + OPA 合规 ⑤ 存储 Elasticsearch + OPA 索引权限 ⑥ 展示 Kibana + OPA 查询审计 OPA 策略执行点: 阶段④(Logstash filter)、阶段⑤(Elasticsearch 写入)、阶段⑥(Kibana 查询)是权限规则测试的核心注入点。

3.4 拓扑配置清单

在测试环境中,各组件的连接配置需保持一致。以下为 Fluentd 到 Kafka 的典型输出配置示例:

# fluentd.conf - 输出到 Kafka
<match logstash.**>
  @type kafka2
  brokers kafka-1:9092,kafka-2:9092,kafka-3:9092
  topic_key topic
  default_topic opa-logs
  required_acks -1
  <format>
    @type json
  </format>
  <buffer>
    @type file
    path /var/log/fluentd/buffer/kafka
    flush_interval 5s
  </buffer>
</match>

Logstash 从 Kafka 消费并调用 OPA 的 pipeline 配置:

# logstash.conf - 从 Kafka 消费并调用 OPA
input {
  kafka {
    bootstrap_servers => "kafka-1:9092,kafka-2:9092"
    topics => ["opa-logs"]
    codec => json
  }
}
filter {
  # 调用 OPA 进行合规检查
  http {
    url => "http://opa-sidecar:8181/v1/data/logs/compliance"
    verb => "POST"
    body => '{"input": {"event": "%{message}", "source": "%{host}"}}'
    target_body => "opa_result"
  }
  if [opa_result][allow] == false {
    drop { }
  }
}
output {
  elasticsearch {
    hosts => ["https://es-1:9200", "https://es-2:9200"]
    index => "opa-logs-%{+YYYY.MM.dd}"
    user => "logstash_writer"
    password => "${ES_PWD}"
    ssl => true
  }
}
配置注意事项: 在测试拓扑中,务必确保 OPA Sidecar 的 endpoint 对所有组件网络可达。建议使用 Kubernetes Service 名称(如 opa-sidecar.opa-system.svc.cluster.local)而非硬编码 IP,以便于策略热更新与扩缩容。