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

21 KiB
Raw Blame History

审计中心设计

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 事件基础结构

{
  "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播放器 自有格式播放器 回放流畅度+存储效率对比