21 KiB
21 KiB
审计中心设计
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, timestampoperator_id, target_user_idresource_type(app/asset), resource_idold_role, new_role, change_type(grant/revoke/expire)approver_id, approval_commenteffective_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 事件基础结构
{
"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索引模型
// 索引模板: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 规则示例
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 报表引擎设计
报表引擎:
调度器:
- 定时任务 (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播放器 | 自有格式播放器 | 回放流畅度+存储效率对比 |