Files
Hugo/4a-system-design/audit-center.md
T

478 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 审计中心设计
## 1. 总体定位
审计中心是4A系统的**可观测性和合规性基座**,负责收集、存储、分析全平台的操作行为数据。核心职责:
- 从认证身份中心、应用资源管理中心、系统资源管理中心采集全量操作事件
- 基于现有审计报表逆推审计数据模型
- 提供合规规则引擎,实时/准实时检测异常行为
- 生成分级审计报表,支撑部门级和公司级审计需求
- 利用招标空窗期(几个月)充分梳理数据模型
---
## 2. 设计原则
### 2.1 从报表反推模型——逆推方法论
泰岳版现网已有成熟审计报表。我们的策略:**不猜测泰岳的存储结构,而是从"报表要什么"反推"数据该存什么"**。
```
┌──────────────────────────────────────────────┐
│ 逆推路径:报表需求 → 数据模型 │
│ │
│ Step 1: 收集所有现网审计报表 │
│ - 固定报表(日/周/月报) │
│ - 自定义报表(管理员手动查询) │
│ - 触发式报表(异常告警详情) │
│ │
│ Step 2: 提取报表中的字段 │
│ - 每个报表的列、筛选条件、汇总维度 │
│ - 示例:登录报表需要{用户、时间、IP、结果、 │
│ 认证方式、地理位置、设备指纹} │
│ │
│ Step 3: 构建事件模型 │
│ - 将字段归类到事件模型中 │
│ - 识别共性字段(audit_id, timestamp, user, │
│ action, resource, result, client_info) │
│ │
│ Step 4: 设计存储结构 │
│ - 根据查询模式选择存储引擎 │
│ - 高频查询字段建索引 │
│ - 根据报表筛选条件确定分区策略 │
└──────────────────────────────────────────────┘
```
### 2.2 逆推示例
**现网报表-A:账号登录统计日报**
```
字段: 日期 | 登录名 | 姓名 | 部门 | 登录次数 | 成功次数 | 失败次数 |
最后登录时间 | 最后登录IP | 最后认证方式
```
**逆推结论 → 登录事件字段集**:
- 基础:`event_id, event_type, timestamp`
- 主体:`account_id, login_name, display_name, org_path`
- 行为:`action=login, auth_method, result, fail_reason`
- 环境:`source_ip, user_agent, device_id, geo_location`
- 关联:`session_id, mfa_level`
**现网报表-B:权限变更审计报表**
```
字段: 变更时间 | 操作人 | 被授权人 | 应用/资产 |
授权角色 | 操作类型(授予/回收) | 审批人 | 生效时间
```
**逆推结论 → 授权事件字段集**:
- `event_id, event_type=auth_change, timestamp`
- `operator_id, target_user_id`
- `resource_type(app/asset), resource_id`
- `old_role, new_role, change_type(grant/revoke/expire)`
- `approver_id, approval_comment`
- `effective_period`
---
## 3. 三中心数据来源定义
### 3.1 事件分类与来源
| 事件类型 | 来源中心 | 采集方式 | 实时性 |
|---------|---------|---------|--------|
| 登录事件 | 认证身份中心 | API回调 / MQ | 实时 |
| 登出事件 | 认证身份中心 | API回调 | 实时 |
| 令牌刷新 | 认证身份中心 | 中间件Hook | 实时 |
| 认证失败 | 认证身份中心 | 业务日志 | 实时 |
| 密码修改 | 认证身份中心 | 业务日志 | 近实时 |
| 账号创建/修改/删除 | 认证身份中心 | CQRS事件 | 近实时 |
| SSO跳转 | 应用资源管理中心 | 网关日志 | 实时 |
| 权限分配/回收 | 应用资源管理中心 | 业务日志 | 实时 |
| 权限校验结果 | 应用资源管理中心 | 授权引擎日志 | 准实时 |
| 应用注册/配置变动 | 应用资源管理中心 | 业务日志 | 近实时 |
| 资产访问(SSH/RDP) | 系统资源管理中心 | 堡垒节点代理 | 实时 |
| 命令执行记录 | 系统资源管理中心 | 堡垒节点代理 | 实时 |
| 文件传输记录 | 系统资源管理中心 | 堡垒节点代理 | 实时 |
| 密码轮换操作 | 系统资源管理中心 | 业务日志 | 近实时 |
| 资产授权变动 | 系统资源管理中心 | 业务日志 | 近实时 |
### 3.2 数据采集架构
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 认证身份中心 │ │ 应用资源中心 │ │ 系统资源中心 │
│ (业务事件) │ │ (业务事件) │ │ (业务事件) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ 异步MQ │ 异步MQ │ 异步MQ
│ (RocketMQ) │ (RocketMQ) │ (RocketMQ)
├────────────────┼────────────────┘
│ │
▼ ▼
┌────────────────────────────────────────────────┐
│ 审计事件消费处理器 │
│ │
│ 1. 事件解析器(JSON → 统一事件格式) │
│ 2. 事件增强器(补充IP地理信息、资产元数据等) │
│ 3. 事件路由器(分类型写入不同索引) │
│ 4. 合规规则引擎(实时检测异常规则) │
└──────┬─────────────────────────────────┬────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ Elasticsearch │ │ 告警通道 │
│ (事件存储) │ │ (企业微信/短信等) │
│ 按时间分索引 │ │ │
│ 按月建索引别名 │ │ 合规告警 → 通知 │
└──────────────┘ └──────────────────┘
│
▼
┌──────────────┐
│ 报表引擎 │
│ (定时+按需) │
└──────────────┘
```
---
## 4. 统一审计事件模型
### 4.1 事件基础结构
```json
{
"audit_id": "aud-20260517-abc123def456",
"event_type": "login", // 事件类型
"event_version": "1.0", // 事件格式版本
"timestamp": 1700000000000, // 事件发生时间(毫秒级)
"received_at": 1700000001000, // 审计中心接收时间
"actor": { // 行为主体
"uid": "uid_00123",
"login_name": "zhangsan",
"display_name": "张三",
"org_code": "BJ_SALES",
"org_path": "省公司/北京分公司/销售部",
"identity_type": "internal"
},
"action": { // 行为描述
"category": "auth", // 大类: auth/access/perm/admin/system
"operation": "login", // 具体操作
"detail": "密码认证登录", // 人工可读描述
"result": "success", // success/failure/blocked
"reason": "" // 失败/阻断原因
},
"resource": { // 操作对象
"type": "system", // system/app/asset/data
"id": "auth-service", // 资源标识
"name": "认证服务" // 资源名称
},
"context": { // 操作上下文
"source_ip": "10.0.1.100",
"source_ip_country": "中国",
"source_ip_city": "北京",
"user_agent": "Mozilla/5.0 ...",
"device_id": "dev_fingerprint_xxx",
"session_id": "sess_xyz789",
"mfa_level": 2,
"auth_methods": ["password", "sms"]
},
"metadata": { // 元数据
"source_center": "auth-identity",
"source_service": "auth-api",
"trace_id": "trace-uuid-xxx"
}
}
```
### 4.2 ES索引模型
```json
// 索引模板:audit-events-{year}-{month}
{
"mappings": {
"dynamic": "strict",
"properties": {
"audit_id": { "type": "keyword" },
"event_type": { "type": "keyword" },
"event_version":{ "type": "keyword", "index": false },
"timestamp": { "type": "date", "format": "epoch_millis" },
"received_at": { "type": "date", "format": "epoch_millis" },
// actor字段
"actor.uid": { "type": "keyword" },
"actor.login_name": { "type": "keyword" },
"actor.display_name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } },
"actor.org_code": { "type": "keyword" },
"actor.org_path": { "type": "keyword" },
"actor.identity_type": { "type": "keyword" },
// action字段
"action.category": { "type": "keyword" },
"action.operation": { "type": "keyword" },
"action.detail": { "type": "text" },
"action.result": { "type": "keyword" },
"action.reason": { "type": "text" },
// resource字段
"resource.type": { "type": "keyword" },
"resource.id": { "type": "keyword" },
"resource.name": { "type": "text" },
// context字段
"context.source_ip": { "type": "ip" },
"context.source_ip_country": { "type": "keyword" },
"context.source_ip_city": { "type": "keyword" },
"context.user_agent": { "type": "text", "index": false },
"context.device_id": { "type": "keyword" },
"context.session_id": { "type": "keyword" },
"context.mfa_level": { "type": "integer" },
"context.auth_methods": { "type": "keyword" }
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "5s"
}
}
```
### 4.3 索引与生命周期管理
```
索引命名: audit-events-2026-05 (按月)
别名策略:
write: audit-events-active (当前写入索引)
read: audit-events-all (查询所有)
生命周期(ILM):
热阶段(7天): SSD存储, 副本数2, 刷新间隔1s
温阶段(30天): HDD存储, 副本数1, 刷新间隔30s
冷阶段(180天): HDD存储, 副本数1, forcemerge 1段
删除: 180天后删除索引
容量估算:
假设日均50万事件 × 1KB/事件 ≈ 500MB/天
30天 ≈ 15GB, 180天 ≈ 90GB (含副本)
上硬件资源绰绰有余
```
---
## 5. 合规规则引擎
### 5.1 规则示例
```yaml
rules:
- id: "RULE-001"
name: "非工作时间登录告警"
severity: "medium"
condition:
event_type: "login"
time_range:
- "22:00-08:00" # 非工作时间
- "周六,周日"
action: "notify_manager"
- id: "RULE-002"
name: "连续登陆失败锁定"
severity: "high"
condition:
event_type: "login"
action.result: "failure"
count: 5
window: "5m" # 5分钟内
per: "actor.uid"
action: "lock_account"
- id: "RULE-003"
name: "异地登录检测"
severity: "high"
condition:
event_type: "login"
action.result: "success"
geo_change: true # 与前一次登录IP不同城市
window: "1h" # 1小时内跨越城市
action: "notify_user_sms"
- id: "RULE-004"
name: "高危命令执行"
severity: "critical"
condition:
event_type: "command"
command_match: "(rm -rf|shutdown|reboot|mkfs|dd if=)"
action: "block_and_notify"
- id: "RULE-005"
name: "权限批量回收异常"
severity: "medium"
condition:
event_type: "perm_change"
change_type: "revoke"
count: 10
window: "10m"
per: "actor.uid"
action: "notify_security_admin"
- id: "RULE-006"
name: "非授权资产访问尝试"
severity: "high"
condition:
event_type: "access"
action.result: "denied"
count: 3
window: "5m"
action: "notify_security_admin"
```
### 5.2 规则执行架构
```
┌─────────────┐
│ 审计事件流 │
│ (MQ消费) │
└──────┬──────┘
│
▼
┌──────────────────────┐
│ 规则引擎核心 │
│ │
│ ┌──────────────────┐ │
│ │ 规则编译模块 │ │
│ │ (YAML → 执行计划) │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ 规则执行器 │ │
│ │ (有状态: 使用 │ │
│ │ Redis计数窗口) │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ 告警聚合器 │ │
│ │ (去重+降噪) │ │
│ └──────────────────┘ │
└──────┬──────┬───────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ 告警存储 │ │ 通知通道 │
│ (ES告警索引)│ │ 企业微信 │
│ │ │ 短信/电话 │
│ │ │ 4A管理台 │
└──────────┘ └──────────┘
```
### 5.3 规则治理
- **规则热加载**:规则从DB/配置中心动态读取,变更无需重启
- **规则测试沙箱**:支持在沙箱中测试规则效果再发布
- **规则级联**:支持规则之间的依赖和触发关系
- **误报反馈**:告警可标注"误报",自动调整规则阈值
---
## 6. 审计报表输出模型
### 6.1 报表分类
| 报表类型 | 周期 | 受众 | 内容 |
|---------|------|------|------|
| **部门操作日报** | 日 | 部门安全员 | 本部门人员登录、权限变更、资产访问汇总 |
| **公司安全周报** | 周 | 安全管理员 | 全公司异常行为统计、高危操作汇总 |
| **合规月报** | 月 | 合规部门/领导 | 合规指标完成情况、不合规事件明细 |
| **账号健康检查报告** | 月 | 系统管理员 | 僵尸账号、过期权限、密码过期情况 |
| **资产访问趋势分析** | 月 | 运维负责人 | 各资产访问频次、高峰时段、异常访问 |
| **权限审计专报** | 季 | 审计部门 | 权限合规性专项检查、最小权限原则遵从度 |
| **自定义报表** | 按需 | 指定人员 | 按事件类型/时间/用户/资产组合查询 |
### 6.2 报表模板示例
**报表:部门操作日报**
```
┌────────────────────────────────────────────────────────────────┐
│ 4A操作日报 - 日期:2026-05-17 │
│ 部门:北京分公司/销售部 │
├────────────────────────────────────────────────────────────────┤
│ 一、登录统计 │
│ ┌─────────────────────┬────────┬────────┬────────┐ │
│ │ 项目 │ 总量 │ 成功 │ 失败 │ │
│ ├─────────────────────┼────────┼────────┼────────┤ │
│ │ 密码登录 │ 156 │ 148 │ 8 │ │
│ │ 人脸登录 │ 23 │ 22 │ 1 │ │
│ │ SIM卡登录 │ 12 │ 12 │ 0 │ │
│ │ 短信验证码登录 │ 45 │ 44 │ 1 │ │
│ └─────────────────────┴────────┴────────┴────────┘ │
│ │
│ 二、权限变更 │
│ ┌─────────────────────┬────────┬────────┬────────┐ │
│ │ 操作类型 │ 次数 │ 涉及用户 │ 涉及应用 │ │
│ ├─────────────────────┼────────┼────────┼────────┤ │
│ │ 角色授予 │ 3 │ 3 │ 2 │ │
│ │ 角色回收 │ 1 │ 1 │ 1 │ │
│ │ 临时授权 │ 2 │ 2 │ 1 │ │
│ └─────────────────────┴────────┴────────┴────────┘ │
│ │
│ 三、资产访问 │
│ ┌─────────────────────┬────────┬────────┐ │
│ │ 资产 │ 访问次数 │ 操作人员数 │ │
│ ├─────────────────────┼────────┼────────┤ │
│ │ 10.0.1.10 (DB-MAST)│ 12 │ 3 │ │
│ │ 10.0.2.20 (APP-01) │ 8 │ 2 │ │
│ └─────────────────────┴────────┴────────┘ │
│ │
│ 四、异常告警 │
│ ┌────────────────────────────┬────────┬──────────┐ │
│ │ 告警内容 │ 等级 │ 处理状态 │ │
│ ├────────────────────────────┼────────┼──────────┤ │
│ │ 用户张三 22:35 登录(异地) │ 中 │ 待处理 │ │
│ └────────────────────────────┴────────┴──────────┘ │
└────────────────────────────────────────────────────────────────┘
```
### 6.3 报表引擎设计
```yaml
报表引擎:
调度器:
- 定时任务 (cron表达式)
- 按需触发 (API)
- 事件触发 (达到某告警阈值时自动生成详细报告)
数据源:
ES查询: 按事件类型/时间范围/用户/资产等组合查询
聚合: 使用ES的聚合API (terms/date_histogram/filters/cardinality)
补充: 需要时从MySQL读取用户/资产元数据
输出格式:
- HTML (内联样式, 可邮件发送)
- PDF (wkhtmltopdf / puppeteer)
- Excel (报表导出)
分发通道:
- 企业微信/钉钉机器人
- 邮件 (IMAP-SMTP技能)
- 4A管理台消息中心
- 短信通知(仅紧急告警)
报表存储:
- 生成的报表文件 → MinIO对象存储
- 元数据 → MySQL
- 保留周期: 日报30天, 周报6个月, 月报2年
```
---
## 7. 与泰岳版比对关注点
| 项 | 自研方案 | 泰岳方案(推测) | 验证方法 |
|----|---------|-----------------|---------|
| 事件模型 | 统一JSON事件模型,ES存储 | 可能关系型数据库分表存储 | 事件查询效率对比(涉及跨类型查询场景) |
| 合规规则 | 可编程规则引擎,热加载 | 可能硬编码或有限规则 | 新增规则的上线周期对比 |
| 审计报表 | 模板引擎+ES聚合 | 可能定时SQL查询生成 | 复杂报表生成时间对比 |
| 存储方案 | ES按时间分区+ILM | 可能MySQL分表+归档 | 180天数据查询性能对比 |
| 实时告警 | 流式规则引擎 | 可能定时任务扫描 | 告警延迟对比 |
| 会话回放 | asciinema播放器 | 自有格式播放器 | 回放流畅度+存储效率对比 |