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