478 lines
21 KiB
Markdown
478 lines
21 KiB
Markdown
# 审计中心设计
|
||
|
||
## 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播放器 | 自有格式播放器 | 回放流畅度+存储效率对比 |
|