四级渐进学习法 · 自研日审引擎 · 综合日志审计系统

从一条日志到一次审计。

四级台阶:L1 受控语言 → L2 结构图 → L3 交互网页 → L4 定制视频。以预发环境(release)完整部署实况为底本——真实组件、副本数、端口、Kafka topic 与解析规则——先用确定性短句建立词汇,再看结构图建立骨架,再亲手推一条日志走完七跳链路,最后看一支解说片把全链路串成故事。

K8s 3 master + 3 worker audit-release / middleware-release 7 类中间件 · 8 类业务组件 材料:研发云「综合日志审计系统」文档空间
THE FRAMEWORK

先看地图,再出发THE FRAMEWORK — 四层渐进,层层加深

自研日审引擎(综合日志审计系统)做一件事:把十万级终端的日志,安全地、不丢地、标准化地收上来,存成分层可查的证据。终端 Agent 采集加密上报 → envoy mTLS 网关接入 → audit-gateway 落 Kafka → Flink ETL 清洗标准化 → StarRocks 毫秒检索。四级台阶对它逐层下钻。

L1

受控语言

五十句确定性短句。每句一概念、一词一义,无形容词、无脑补空间。读完即拥有完整词汇表。

例:「Agent 是终端常驻程序。Daemon 保活。Worker 干活。」
L2

结构图

五张确定性结构图:预发部署总架构(可点击组件)、一条日志的旅程、Agent 双进程内部、规则解析管线、Kafka 三层 topic。

例:架构图中 envoy 旁的「×2」就是真实副本数。
L3

交互网页

亲手「拨动」日审引擎:推一条真实 audit 日志走完七跳链路(含真实正则执行)+ 二十一题自测 + 部署排障实战参考。

例:第 5 步能看到正则捕获组 $2 $3 $4 的真实值。
L4

定制视频

3b1h 风格解说片:画面 + 中文配音 + 字幕。八个镜头、3 分 40 秒,讲完一条日志的一生。成片随本页交付。

例:一支片子讲完一条日志的一生。

系统名片(一分钟版)

名称:综合日志审计系统(自研日审引擎)
一句话:终端日志的「收、洗、存、审、管」一体化引擎。
解决三个老问题:存储无分层、流量不可控、运维成本高。
五件事:采集 · 清洗 · 存储 · 审计 · 远程运维。
规模设定:十万级终端、多机房对等、租户隔离。

一句话数据流(背下来,全页都在展开它)

终端日志 → Agent(采集·限流·缓存)→ envoy(:30015 mTLS ×2)→ audit-gateway(headless ×3 · 落 Kafka)→ Kafka(agent-* 原始 ×3)→ Flink ETL(规则解析·映射)→ std_clasp_agent_* → StarRocks(3FE+3BE 存算分离)

知识点下钻入口 · 九篇四级页

本页讲全链路故事;九个知识点(Agent / mTLS / headless / Kafka / 规则解析 / 存储 / 治理 / 洪峰 / 部署)各有独立四级页,含专属模拟器与自测。进入知识点目录 →

L1 CONTROLLED LANGUAGE

受控语言:五十句讲清日审引擎简短、确定、一词一义——不靠形容词,只靠事实

以下每句话都能在交接材料里找到出处(设计方案 v5、部署手册、Agent 模块梳理、Kafka Topic 列表、规则解析 JSON)。读不懂的句子,去 L2 找对应的结构图。

系统定位

§ 0

终端 Agent

§ 1

接入与安全

§ 2

消息与 ETL

§ 3

存储与查询

§ 4

管控与治理

§ 5
L2 DIAGRAMS

结构图:预发环境的真实骨架副本数、端口、协议——全部照抄部署实况,图 1 可点击组件

五张图从粗到细:先看全貌,再追一条日志,再钻进 Agent 与解析规则,最后看消息分流。每张图都是确定性的:同样的输入永远画出同样的结构。

终端 接入 业务 流处理 中间件(外部提供) K8s 集群(3 master + 3 worker)· ns: audit-release audit-agent ×1 · 30018 data-platform ETL 平台 30012 后端 · 31212 前端 规则下发 终端 Agent ×N Daemon 保活 · Worker 干活 持 client.crt / key envoy-gateway ×2 30015 gRPC+mTLS 入口 30016 调试 · 30017 HTTP TLS 终点 · 双向认证 audit-gateway ×3 headless :8285 上游 per-Pod LB · 健康检查 ClusterIP :80(HTTP) flink-etl(FlinkDeployment) 1 JM + N TM · Dashboard 30004 规则解析 · 字段映射 Operator: helm · watchNamespaces gRPC · mTLS :30015 明文 gRPC produce 原始 topic consume std topic 批量直写 依赖中间件(平台侧统一提供 · 外部集群) MySQL 主+从 业务台账 Redis ×3 缓存 Kafka ×3 三层 topic StarRocks 3FE+3BE 存算分离 · 毫秒检索 MinIO ×4 对象存储 S3 Nacos ×3 注册/配置 8848
图 1 · 预发环境部署总架构(点击任意组件查看职责)
点击图中的组件(Agent / envoy / gateway / Kafka / Flink / StarRocks…),这里显示它的职责与部署参数。
终端产生日志audit / syslog… Agent 采集限流 · 缓存 mTLS 过 envoy:30015 ×2 gateway 落 Kafkaheadless ×3 Flink ETL正则 · 映射 std topicstd_clasp_agent_* StarRocks可检索 数据形态变化:原始文本 → 密文 → 结构化 JSON → 标准字段(name / message / srcProcessId …) L3 的模拟器就是把这条链路一步一步推给你看(含真实正则执行)
图 2 · 一条日志的端到端旅程(七跳)
Daemon 守护进程(父) 保活循环monitorLoop 退出自动拉起 IPC 服务端listenIPC · 就绪文件 重启流程优雅关 → 查杀 → 拉新 兜底查杀pkill -P / powershell startWorker · restartWorkerProc · killChild 回收防僵尸 Worker 业务子进程(混合进程) 采集任务inode+offset 断点续采 gRPC 发送限流 · 磁盘缓存队列 指令队列exists / processing 去重 指令消费单协程 · panic 兜底 grpcConn(TLS) · sysinfo · offset 模块 · 优雅停机 IPC 管道 [4B 长度][JSON] Worker 崩溃 → Daemon 检测 → 自动重启 · 业务触发重启:restartCallback → IPC(restart_worker)
图 3 · Agent 双进程内部:Daemon 管生死,Worker 管业务
① 原始日志(rawMsg) type=LOGIN msg=audit( 1301554080.656:8018): login pid=981 uid=0 old auid=4294967295 new auid=0 ② recognizeStr 识别 type=LOGIN msg=audit\( 前缀命中「用户登录」 规则库 regexStep 10000 ③ patternStr 捕获 $2 audit 时间戳:序列 $3 pid · $4 uid $5 old · $6 new auid $1 头信息 · $7 tty … ④ 字段映射 fields[] subMSG←$2 · srcProcessId←$3 message=用户(uid:$4)登录。 name=用户登录(固定值) → std_clasp_agent_audit_log_linux 规则来自「规则解析参考」:linux-audit 17 条 + windows 4 条 + cron 1 条;映射表见 23 张 xlsx
图 4 · 规则解析管线:识别 → 捕获 → 映射(L3 可亲手执行)
原始层 agent-* agent-audit-log-<来源>-linux secure·auth·messages·syslog kern·cron·yum·dpkg·journal windows: system/application/security agent-{heartbeat,resource,  task-result}-<os> audit-gateway 生产 · 原始保真 标准化层 std_clasp_agent_* std_clasp_agent_audit_log_linux std_clasp_agent_audit_log_windows std_clasp_agent_cron_log_linux std_clasp_agent_{heartbeat,  resource,task_result}_<os> Flink 产出 · 直写 StarRocks 业务信令层 las-* las-agent-command 任务生成 → 消费 → 待下发 las-token-credential-issue/revoke 颁发 / 撤销 token 消费后持久化生效 控制面信令 · 非日志数据 Flink 三层各司其职:原始保真、标准可查、信令可追溯——部署前 40+ 个 topic 需全部提前创建
图 5 · Kafka topic 三层分流
L3 INTERACTIVE

交互探索:亲手「拨动」日审引擎推一条日志走完全链路(真实正则执行)+ 概念自测 + 部署排障参考

样例是规则库里的真实数据:Linux audit「用户登录」事件。每一步右侧显示该环节真实的数据形态;第 5 步的捕获组由浏览器现场执行真实正则得出——日志可以改,改完重新推。玩过之后,下方附部署六步、端口速查与排障坑作实操对照。

3a · 推一条日志走完全链路

真实正则执行

日志流水线模拟器

用「下一步」推进,架构图上会点亮当前环节。

按「开始」,这条日志会出现在这里。
每一步都对应部署实况里的一个真实组件行为。
step 0 / 7
原始日志(可编辑,改完点重置再推):

来自规则库 rule_linux-用户登录.json 的 sample 字段。

这一步发生了什么

开始后这里逐步解释:为什么限流、为什么 mTLS、为什么 headless、正则怎么捕、字段怎么映射。

3b · 概念自测

21 题 · 单选 · 分三组

已答 0 / 21 · 正确 0 · 正确率 0%

基础 · 链路与组件定位Q1–Q9

1. envoy-gateway 的 gRPC 上游应该指向哪个 Service?

headless 的 DNS 直接返回 3 个 Pod IP,envoy 才能逐 Pod 负载均衡并做健康检查。multi 无 selector、只有 1 个失效 endpoint,禁止用作上游。

2. Agent 的正式上报入口是?

30015 是双向认证正式入口;30016 是无需证书的调试口;30017 才是 HTTP over mTLS;30018 是 audit-agent 的 HTTP 对外端口。

3. mTLS 握手验证成功的标志是?

openssl s_client 带 client 证书连 30015,验证 CA 链通过即 0 (ok)。grpcurl -plaintext 30016 只验证明文调试链路。

4. 原始日志 topic 与标准化 topic 的关系是?

原始层保真存证,Flink ETL 做 recognizeStr 识别 + 正则捕获 + 字段映射,产出标准化层,再批量直写 StarRocks。

5. Agent 双进程模型中,Daemon 的职责是?

Daemon 是父进程:monitorLoop 保活、IPC 服务端、重启流程;采集、gRPC 上报、指令消费全在 Worker。

6. 控制指令的两层去重是?

exists 标记已入队等待,processing 标记正在执行。两者都是内存级,Agent 重启丢失;磁盘队列 cmd_queue.store 保留指令本身。

7. helm 安装 Flink Operator 时的关键注意点?

Operator 的 webhook 依赖 cert-manager;watchNamespaces 不一致会导致 FlinkDeployment 无人调谐。

8. IP 归属库 ipip-*.ipdb(141MB)部署时放在哪里?

ETL 平台配置时从 S3 引用 ipdb,用于日志 IP 字段的归属地补全。141MB 打进镜像会让每次发版都变慢。

9. StarRocks 在本系统的角色是?

MySQL 存台账;心跳/资产/监控小数据走 LogStorage;StarRocks 是日志主存,毫秒检索支撑审计报表。
进阶 · 端侧机制与消息Q10–Q17

10. Agent 心跳的上报间隔与内容是?

心跳走管控通道,30 秒一次,报的是终端版本、资源占用、缓存积压与流量状态——它是可用性探针,不是日志通道。

11. Daemon 与 Worker 的 IPC 怎么解决粘包?单包上限多少?

长度头 4 字节、大端;单包上限 1MB,超了要拆包。长度头让接收方能精确切分,粘包问题在协议层就解决了,不必靠超时猜边界。

12. 端侧 EPS 令牌桶触发限流时,谁的优先级最高?

审计与异常日志优先放行;普通日志超限也不丢,落本地磁盘缓存,网络恢复后按时序补发——限流限的是带宽,不是证据。

13. 设计方案里的「五通道」怎么分工?

升级流量与日志流量分离:控制信令走管控通道,安装包分片走静态通道,升级洪峰挤不垮日志链路。

14. 终端 Agent 升级的正确顺序是?

先由灰度策略决定谁升,安装包走静态通道分片断点续传并做 MD5 校验,结果经管控通道回执。十万终端做全量直推就是事故。

15. Kafka 集群采用哪种认证方式?

3 节点集群,SASL SCRAM-SHA-512,按业务拆分独立 topic。mTLS 是 Agent → envoy 那一关;到了 Kafka,认证换成 SASL。

16. las-* 这一层 topic 存的是什么?

三层 topic 各司其职:agent-* 存原始、std_clasp_agent_* 存标准化、las-* 存业务信令。las-agent-command 消费后产生待下发指令;las-token-credential-issue / revoke 消费后持久化生效。

17. 规则解析里 recognizeStr 与 patternStr 的分工是?

一万条规则不能条条硬跑:recognizeStr 先用便宜的前缀识别把范围收窄,patternStr 再跑完整正则取捕获组,$2/$3/$4 映射成 subMSG / srcProcessId / message。
存储 · 治理与运维Q18–Q21

18. 心跳、资产、监控这类小数据存在哪里?

MySQL 存租户/设备/策略/工单台账;StarRocks 存标准化业务日志,主打毫秒检索;心跳、资产、监控这类小数据走 LogStorage,双层配额到期自动清理。

19. 本系统里 Nacos 的角色与 namespace 是?

Nacos 3 节点,做服务注册与配置中心,namespace 是 audit-release——和 Flink Operator 的 watchNamespaces 同一套命名空间约定,装错命名空间就互相看不见。

20. 「两层限流」分别护的是什么?

端侧 EPS 令牌桶防止终端把带宽打满,服务端存储配额防止单个租户把容量吃光——一个护带宽,一个护容量,缺一个都会在极端场景失守。

21. 滚动升级后发现异常,要回到指定版本怎么做?

set image → rollout status 观察 → rollout undo --to-revision=N 回滚。证书轮换走另一条链路:gen-certs.sh → 重建 envoy-tls-certs Secret → rollout restart → 重发 client 证书并重启全部 Agent。

3c · 部署与排障参考

来自部署手册

部署顺序(依赖决定,务必按序)

①

命名空间 + 镜像 Secret

audit-release / middleware-release;Secret 名 ctct-mssp(部分 YAML 里叫 ctyun-registry,遇到要改)

②

依赖中间件就绪

Nacos / MySQL / Redis / Kafka / MinIO(平台侧提供,确认即可)

③

audit-agent + audit-gateway

apply audit-agent.yaml → audit-gateway.yaml → svc.yaml(依赖 Nacos、MySQL、Redis、Kafka)

④

Envoy 网关(含证书)

gen-certs.sh → envoy-secret → envoy-cm → envoy-deployment → envoy-svc(依赖 audit-gateway)

⑤

ETL 平台(后端 → 前端)

etl-cm → data-platform → fe-cm → fe-web;上传 ipdb 到 S3 bucket audit-etl(依赖 MySQL、Redis、S3)

⑥

Flink Operator → 作业

cert-manager → helm install flink(-n 与 watchNamespaces 一致)→ etl-flink_1.19.2.yaml(依赖 cert-manager、S3)

部署验证清单(全过才算成功)

  • 两命名空间全部 Pod Running:kubectl -n audit-release get pods
  • Nacos 服务列表出现 audit-agent / audit-gateway(控制台 :30002)
  • get endpoints audit-gateway-headless 返回 3 个 Pod IP:8285
  • envoy Admin :9901/clusters 3 个上游 healthy
  • mTLS 握手 Verify return code: 0 (ok)
  • 端到端 gRPC:python3 grpc_mtls_test.py PASS
  • 业务入口 curl 可达:30018 / 31212 / 30004

日常运维

set image 滚动升级 → rollout status 观察 → rollout undo [--to-revision=N] 回滚;证书轮换:gen-certs.sh → 重建 envoy-tls-certs Secret → rollout restart → 重新分发 client 证书并重启 Agent。

入口NodePort容器端口 / 协议说明
Nacos 控制台30002— / HTTP服务注册与配置中心
Flink Dashboard300048081 / HTTPETL 作业观测(内部 REST flink-etl-rest:8081)
dbeaver30005— / HTTP数据库管理
MinIO Console30008— / HTTPS3 控制台(bucket audit-etl)
kafka-ui30009— / HTTPKafka 管理
data-platform 后端3001280 / HTTPETL 平台 API
ETL 控制台30013— / HTTPETL 平台入口
envoy(正式入口)300158285 / gRPC+mTLSAgent 上报唯一正式通道
envoy(调试)300168286 / gRPC 明文无需证书,仅调试
envoy(HTTP)300178080 / HTTP+mTLSHTTP 接口
audit-agent3001880 / HTTP采集/接收前端
data-platform-fe3121280 / HTTPETL 前端(Nginx 反代后端)

坑 1 · audit-gateway-multi 不能用

无 selector、仅 1 个失效 endpoint。envoy 上游必须 headless(per-Pod LB + 健康检查),HTTP 上游用 ClusterIP。

坑 2 · imagePullSecrets 名字对不上

部分 YAML 里写的是 ctyun-registry,统一改成 ctct-mssp;拉不到镜像去节点机取现成镜像 docker save/load。

坑 3 · watchNamespaces 不一致

helm install 的 -n audit-release 与 values 里 watchNamespaces: ["audit-release"] 必须一致,否则 FlinkDeployment 无人调谐。

坑 4 · Kafka topic 要提前建

40+ 个 topic(agent-* 全量、std_clasp_agent_*、las-*)部署前必须预先创建,否则链路数据无处可落。

坑 5 · ipdb 别忘了传 S3

141MB 的 ipip 库需上传至 bucket audit-etl,ETL 平台配置引用,漏了则 IP 归属地补全失效。

坑 6 · 证书 SAN 与轮换

envoy 证书 SAN 必须含集群内域名;轮换后要 rollout restart 并重新分发 client 证书、重启全部 Agent,否则 mTLS 握手失败。

L4 VIDEO

定制视频:一条日志的一生八镜头 · 3 分 40 秒 · 1920×1080 · 中文配音 + 字幕

一支片子讲完一条日志的一生。八个镜头围绕「造引擎的十五个决定」展开,画面里的组件名、副本数、端口、正则与捕获组,全部与 L1–L3 同源——不是示意图,是部署实况。用 Remotion 逐帧渲染,画面即代码:同一时间轴永远渲染出同一帧,改一个字重渲即可。

成片 · ri-audit-explainer.mp4

00:00 开场:一条日志的诞生 00:26 Agent:终端上的哨兵 00:56 mTLS:互相验明正身 01:22 网关与削峰 01:50 规则引擎:万中选一 02:20 存储:分层与分离 02:44 管控:全局的手 03:10 收尾:证据链闭环

规格:1920×1080 · 30fps · 3:40 · H.264 + AAC · 中文配音(zh-CN-Yunxi 逐句合成,26 句按字幕时间轴铺轨,句间停顿与镜头切换对齐)+ 画面内嵌字幕。画面底部常驻七跳链路进度条,随镜头推进点亮。

分镜脚本

8 镜头 · 旁白即片中字幕

镜头 1 · 开场:一条日志的诞生

画面:黑场渐亮,终端机上一行 audit 日志逐字打出。
旁白:这是一条 Linux 登录日志。它将跨越七道关卡,变成一条可举证的审计记录。这是它的一生,也是自研日审引擎的一生。

镜头 2 · Agent:终端上的哨兵

画面:双进程动画——Daemon 圆环包裹 Worker 方块;Worker 崩溃,Daemon 三秒拉起。
旁白:终端上是 Agent,双进程结构。Daemon 只管保活,Worker 只管干活。断点续采靠 inode 加偏移,断网靠本地加密缓存——日志一条不丢。

镜头 3 · mTLS:互相验明正身

画面:两本证书翻开对照,握手成功后隧道点亮为绿色。
旁白:上报的第一关是双向认证。Agent 出示客户端证书,网关出示服务端证书,同一个根 CA 签名。伪造者进不来,明文出不去。

镜头 4 · 网关与削峰

画面:洪峰箭头涌入 Kafka 水坝,下游 Flink 匀速抽水。
旁白:十万终端的洪峰不能直接砸进计算层。Kafka 先把它存成三层 topic:原始层保真,标准层可查,信令层可追溯。削峰,是可靠性的来源。

镜头 5 · 规则引擎:万中选一

画面:日志流过规则卡池,recognizeStr 前缀快筛,命中卡片放大,正则捕获组依次点亮 $2 $3 $4。
旁白:一万条规则里找到那一条,先靠便宜的前缀识别,再跑完整正则。捕获组拼进模板,一条原始文本变成了结构化字段。

镜头 6 · 存储:分层与分离

画面:StarRocks 计算层浮在 MinIO 存储层之上,柱状数据落盘。
旁白:标准化数据批量直写 StarRocks,存算分离,底层是对象存储。台账进 MySQL,心跳走 LogStorage——每一类数据,都有它的位置。

镜头 7 · 管控:全局的手

画面:控制面网格俯瞰多个机房,灰度发布波纹逐环扩散,失败环自动回卷。
旁白:管控平台不碰日志流量。它管租户、配额、灰度与回滚——升级走独立通道,失败率超标自动熔断。控制面和数据面,各司其职。

镜头 8 · 收尾:证据链闭环

画面:七跳链路整条点亮,检索框输入「用户登录」,毫秒返回结果卡片。
旁白:回到开头那条登录日志。此刻它是结构化的、可检索的、可举证的。从一条日志到一次审计——这就是自研日审引擎。

解说骨架:造引擎的十五个决定

镜头 2–7 的旁白依据

① 双进程

崩溃隔离:业务易崩放 Worker,保活极简放 Daemon。

② 4B 长度头

管道字节流会粘包;长度前缀是最小分帧,1MB 防大包。

③ 磁盘指令队列

重启断电不丢指令;原子写防 JSON 损坏。

④ 两层去重

exists 防重复入队、processing 防并发;内存便宜,磁盘兜底。

⑤ 边缘终止 TLS

证书集中管理,内网明文换吞吐,轮换只动边缘。

⑥ headless 上游

per-Pod 负载均衡 + 主动健康检查,ClusterIP 做不到。

⑦ 先 Kafka 再 ETL

削峰解耦;Flink 挂了数据还在 topic,可重放回补。

⑧ topic 三层

原始保真、标准可查、信令可追溯——三个消费语义。

⑨ 前置识别

万级规则先便宜前缀筛,再跑完整正则。

⑩ 存算分离

MinIO 担成本与弹性,3FE+3BE 独立扩缩。

⑪ 五通道

大小流量互不抢占,升级洪峰不挤垮日志链路。

⑫ 两层限流

端侧令牌桶护网络,服务端配额护存储。

⑬ inode+offset

路径会变 inode 稳定;不漏采也不重采。

⑭ 机房对等自治

故障不扩散,断网本地策略独立运行。

⑮ 灰度熔断回滚

十万终端没有灰度的全量升级是事故。

三道开放思考题(留给观众)

① 存储冷热分层怎么切:StarRocks 热存多久、什么条件降冷到对象存储?
② 规则引擎 DSL 演进:万级正则之外,要不要引入结构化解析与规则版本管理?
③ 超十万终端后,envoy ×2 与 gateway ×3 的扩容曲线在哪里拐弯?瓶颈先出现在哪一跳?

制作管线(Remotion · 画面即代码)

React 组件写画面 → 逐帧确定性渲染 → 1920×1080 H.264;旁白逐句 TTS(26 句,每句实测时长必须短于自己的字幕窗口)→ 按时间轴 adelay 铺轨、统一响度(loudnorm −16 LUFS)→ 与画面合流。字体本地化落盘(Noto Serif SC / Noto Sans SC 分片 woff2,不联网取字),时间轴与字幕表分离管理:改一句文案,只改 src/timeline.ts 的数据再重渲,画面与配音自动对齐。源码在 video/ 目录,出片与配音各一条命令。