企业审计日志
版本: v0.34.0+ | 8种事件类型 | 4级风险评估 | 敏感字段自动脱敏
概述
企业审计日志模块为 ChainlessChain 提供全域操作审计能力,覆盖浏览器、权限、文件、数据库、API、协作、认证和系统八大事件类型。系统支持四级风险自动评估与实时告警、22 类敏感字段递归脱敏、Hook 事件自动映射以及多维统计分析与 JSON/CSV 导出。
核心特性
- 📋 8 种事件类型: browser / permission / file / db / api / cowork / auth / system 全域覆盖
- ⚠️ 4 级风险评估: low / medium / high / critical 自动判定与实时告警
- 🔒 敏感字段脱敏: 22 类字段自动识别与递归脱敏处理
- 🪝 Hook 系统集成: 自动捕获 21 种 Hook 事件映射为审计记录
- 📊 统计分析: 按事件类型/风险等级/操作者/时间趋势多维分析
- 📤 灵活导出: 支持 JSON / CSV 格式导出与数据保留策略
系统架构
┌─────────────────────────────────────────────────┐
│ EnterpriseAuditLogger │
├─────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Risk │ │ Sanitizer│ │ Hook System │ │
│ │ Assessor │ │ (脱敏) │ │ Integration │ │
│ └────┬─────┘ └────┬─────┘ └──────┬────────┘ │
│ │ │ │ │
│ ┌────▼──────────────▼───────────────▼────────┐ │
│ │ Unified Event Bus │ │
│ │ (highRiskEvent / cleared / logged) │ │
│ └────────┬──────────────────┬───────────────┘ │
│ │ │ │
│ ┌────────▼──────┐ ┌───────▼──────────────┐ │
│ │ Memory Buffer │ │ SQLite Persistence │ │
│ │ (max 2000) │ │ (enterprise_audit_log)│ │
│ └───────────────┘ └──────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ 18 IPC Handlers (audit-ipc.js) │ │
│ │ 审计(4) + 合规(6) + DSR(6) + 保留(2) │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘系统概述
EnterpriseAuditLogger 是 ChainlessChain 桌面端的企业级统一审计日志模块,继承自 EventEmitter,负责聚合所有子系统(浏览器自动化、权限管理、文件操作、数据库、API 调用、多智能体协作、认证、系统运维)的审计事件,提供统一的日志记录、风险评估、敏感字段脱敏、查询导出与统计分析能力。
源码路径:desktop-app-vue/src/main/audit/enterprise-audit-logger.js
核心特性:
- 8 种事件类型覆盖全业务域
- 4 级风险自动评估(low / medium / high / critical)
- 敏感字段自动脱敏(密码、令牌、密钥等 22 类字段)
- 高风险操作实时告警(通过 EventEmitter 事件)
- Hook 系统集成,自动捕获 21 种 Hook 事件
- 内存缓冲 + SQLite 持久化双写
- 支持 JSON / CSV 导出
- 数据保留策略(自动清理过期日志)
核心功能
统一事件记录
所有子系统的审计事件通过 log(eventType, operation, details) 方法统一写入。每条日志包含:
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | UUID v4 唯一标识 |
timestamp | string | ISO 8601 时间戳 |
eventType | string | 事件类型(8 种之一) |
operation | string | 操作名称 |
actor | string | 操作者标识,默认 system |
riskLevel | string | 自动评估的风险等级 |
success | boolean | 操作是否成功 |
details | object | 脱敏后的操作详情 |
context | object | 附加上下文信息 |
errorMessage | string | 错误消息(失败时) |
duration | number | 操作耗时(毫秒) |
ipAddress | string | 来源 IP 地址 |
sessionId | string | 会话标识 |
createdAt | number | 创建时间戳(Unix 毫秒) |
日志同时写入 SQLite 数据库和内存缓冲区。当内存缓冲超过 maxMemoryEntries(默认 2000)时,自动淘汰最旧记录。
风险评估
assessRisk(eventType, operation, details) 方法按以下优先级自动判定风险等级:
- Critical:操作名命中关键操作列表(如
delete_database、bypass_security) - High:操作名命中对应事件类型的高风险操作列表
- Medium:操作名或详情匹配敏感关键词模式(password、admin、delete、export 等 12 种),或事件类型为
auth/permission - Low:以上均未命中时的默认等级
敏感字段脱敏
sanitizeData(data) 方法在写入前对所有日志详情递归脱敏:
- 字段名匹配:22 类敏感字段名(不区分大小写)自动替换为
***REDACTED*** - 大二进制数据:字段名含
image、screenshot、base64且值超过 5000 字符时,替换为[BINARY_DATA: N bytes] - 超长字符串:超过 1000 字符的字符串截断并追加
...[TRUNCATED] - 递归深度:最大递归 10 层,超出后替换为
[MAX_DEPTH_EXCEEDED]
高风险告警
当 alertOnHighRisk 开启(默认 true)且日志风险权重 >= 3(即 high 或 critical)时:
- 发出
highRiskEvent事件,携带完整日志条目 - 输出警告日志(包含事件类型、操作名、风险等级)
外部模块可监听此事件以触发通知、邮件或其他告警机制:
auditLogger.on("highRiskEvent", (entry) => {
// 发送告警通知
notifyAdmin(entry);
});Hook 系统集成
当传入 hookSystem 实例时,审计日志自动监听 Hook 系统的 hookExecuted 事件,将 21 种 Hook 事件映射为对应的审计事件类型:
| Hook 事件 | 审计事件类型 |
|---|---|
PreIPCCall / PostIPCCall / IPCError | api |
PreToolUse / PostToolUse / ToolError | system |
SessionStart / SessionEnd | auth |
PreCompact / PostCompact | system |
PreFileAccess / PostFileAccess / FileModified | file |
AgentStart / AgentStop / TaskAssigned / TaskCompleted | cowork |
MemorySave / MemoryLoad | db |
事件类型
系统定义了 8 种事件类型,覆盖全业务域:
| 事件类型 | 常量值 | 说明 |
|---|---|---|
browser | EventType.BROWSER | 浏览器自动化操作(点击、输入、脚本执行) |
permission | EventType.PERMISSION | 权限变更(授权、撤销、角色管理) |
file | EventType.FILE | 文件操作(读写、删除、移动) |
db | EventType.DB | 数据库操作(建表、删除、Schema 变更) |
api | EventType.API | API 调用(IPC 请求、批量操作) |
cowork | EventType.COWORK | 多智能体协作(Agent 生命周期、任务分配) |
auth | EventType.AUTH | 认证事件(登录、登出、密码重置) |
system | EventType.SYSTEM | 系统运维(关机、配置变更、插件安装) |
风险等级
| 等级 | 权重 | 说明 |
|---|---|---|
low | 1 | 常规操作,无安全风险 |
medium | 2 | 涉及敏感数据或权限的操作,需关注 |
high | 3 | 高风险操作,触发实时告警 |
critical | 4 | 关键操作,可能造成不可逆影响,立即告警 |
高风险操作
以下操作被自动标记为 high 风险:
permission(权限类)
| 操作 | 说明 |
|---|---|
grant_admin | 授予管理员权限 |
revoke_all | 撤销所有权限 |
delete_role | 删除角色 |
elevate_privilege | 提升权限 |
auth(认证类)
| 操作 | 说明 |
|---|---|
login_failed | 登录失败 |
password_reset | 密码重置 |
mfa_disabled | 多因素认证禁用 |
account_locked | 账户锁定 |
db(数据库类)
| 操作 | 说明 |
|---|---|
drop_table | 删除表 |
truncate | 清空表数据 |
delete_all | 删除所有记录 |
schema_change | Schema 变更 |
file(文件类)
| 操作 | 说明 |
|---|---|
delete_recursive | 递归删除 |
chmod_777 | 设置完全开放权限 |
move_system_file | 移动系统文件 |
system(系统类)
| 操作 | 说明 |
|---|---|
shutdown | 系统关闭 |
config_change | 配置变更 |
plugin_install | 插件安装 |
update_apply | 更新应用 |
browser(浏览器类)
| 操作 | 说明 |
|---|---|
desktop_click | 桌面级点击操作 |
desktop_type | 桌面级输入操作 |
execute_script | 执行脚本 |
api(接口类)
| 操作 | 说明 |
|---|---|
bulk_delete | 批量删除 |
export_all | 全量导出 |
key_rotation | 密钥轮转 |
cowork(协作类)
| 操作 | 说明 |
|---|---|
agent_spawn | 生成 Agent |
sandbox_escape | 沙箱逃逸 |
tool_override | 工具覆盖 |
关键操作(Critical)
以下操作被自动标记为 critical 风险(最高级别),不论事件类型:
| 操作 | 说明 |
|---|---|
delete_database | 删除数据库 |
factory_reset | 恢复出厂设置 |
bypass_security | 绕过安全机制 |
export_private_keys | 导出私钥 |
disable_audit | 禁用审计日志 |
root_access | 获取 root 权限 |
sandbox_escape | 沙箱逃逸 |
inject_code | 代码注入 |
判定方式:操作名(转小写后)包含上述任一关键词即命中。
配置参考
构造函数选项
const { EnterpriseAuditLogger } = require("./audit/enterprise-audit-logger");
const auditLogger = new EnterpriseAuditLogger({
database, // SQLite 数据库实例(可选,无则仅内存缓冲)
hookSystem, // Hook 系统实例(可选,传入后自动监听 Hook 事件)
enabled: true, // 是否启用审计(默认 true)
maxMemoryEntries: 2000, // 内存缓冲区最大条目数(默认 2000)
alertOnHighRisk: true, // 是否对 high/critical 操作发出告警事件(默认 true)
});单例管理
const {
getEnterpriseAuditLogger,
resetEnterpriseAuditLogger,
} = require("./audit/enterprise-audit-logger");
// 获取或创建单例
const logger = getEnterpriseAuditLogger({ database, hookSystem });
// 销毁单例(释放资源)
resetEnterpriseAuditLogger();API 参考
log(eventType, operation, details)
记录一条审计日志。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
eventType | string | 是 | 事件类型(8 种之一) |
operation | string | 是 | 操作名称 |
details | object | 否 | 操作详情(自动脱敏),可包含 actor、success、context、error、duration、ipAddress、sessionId |
返回值:{ success: boolean, data?: { id, riskLevel }, error?: string }
query(filters)
分页查询审计日志。
过滤器:
| 字段 | 类型 | 说明 |
|---|---|---|
eventType | string | 按事件类型筛选 |
operation | string | 按操作名模糊匹配 |
actor | string | 按操作者精确匹配 |
riskLevel | string | 按风险等级筛选 |
startTime | string | 起始时间(ISO 8601) |
endTime | string | 结束时间(ISO 8601) |
successOnly | boolean | 仅返回成功记录 |
sessionId | string | 按会话 ID 筛选 |
page | number | 页码(默认 1) |
pageSize | number | 每页大小(默认 50,最大 500) |
返回值:{ success, data: { logs, pagination: { page, pageSize, total, totalPages } } }
getLogDetail(id)
获取单条日志详情。
参数:id - 日志条目 UUID
返回值:{ success, data: logEntry } 或 { success: false, error }
getStatistics(timeRange)
获取指定时间范围内的统计分析数据。
参数:
| 字段 | 类型 | 说明 |
|---|---|---|
startTime | string | 起始时间,默认 7 天前 |
endTime | string | 结束时间,默认当前时间 |
period | string | 趋势粒度:hour / day / week / month |
返回值:
{
success: true,
data: {
timeRange: { startTime, endTime },
summary: { total, successCount, failureCount, highRiskCount },
byEventType: { browser: 10, auth: 5, ... },
byRiskLevel: { low: 50, medium: 10, high: 3, critical: 1 },
topActors: [{ actor: 'admin', count: 20 }, ...],
trend: [{ period: '2026-02-25', count: 15 }, ...]
}
}exportLogs(format, filters)
导出审计日志。
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
format | string | 导出格式:json(默认)或 csv |
filters | object | 同 query() 的过滤器(不含分页参数) |
返回值:{ success, data: string, meta: { format, count, exportedAt } }
CSV 格式包含以下列:id, timestamp, event_type, operation, actor, risk_level, success, error_message, duration, session_id
applyRetentionPolicy(policy)
应用数据保留策略,清理过期日志。
参数:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
retentionDays | number | 90 | 普通日志保留天数 |
maxRecords | number | 100000 | 最大记录数(超出则删除最旧记录) |
keepHighRisk | boolean | true | 是否保留高风险日志更长时间 |
highRiskRetentionDays | number | 365 | 高风险日志保留天数 |
返回值:{ success, data: { deletedCount, remainingCount?, source } }
便捷方法
每种事件类型均有对应的便捷方法,省略 eventType 参数:
await auditLogger.logBrowser("navigate", { url: "https://example.com" });
await auditLogger.logPermission("grant_admin", {
actor: "admin",
target: "user1",
});
await auditLogger.logFile("read", { path: "/data/config.json" });
await auditLogger.logDb("insert", { table: "notes", count: 1 });
await auditLogger.logApi("request", { method: "GET", url: "/api/users" });
await auditLogger.logCowork("agent_spawn", { agentId: "coder-01" });
await auditLogger.logAuth("login", {
actor: "user@example.com",
success: true,
});
await auditLogger.logSystem("config_change", { key: "theme", value: "dark" });wrap(eventType, operation, fn)
包装函数,自动记录其执行结果和耗时:
const safeFn = auditLogger.wrap("api", "fetch_users", async (params) => {
return await fetchUsers(params);
});
// 调用时自动记录审计日志
await safeFn({ page: 1 });getQuickStats()
获取内存中的快速统计(无数据库查询):
const { data } = auditLogger.getQuickStats();
// { totalLogs, byEventType, byRiskLevel, memoryBufferSize, tableInitialized }clearMemoryBuffer()
清空内存缓冲区和统计缓存,发出 cleared 事件。
destroy()
销毁审计日志实例,释放所有资源和事件监听器。
IPC 接口
审计系统通过 audit-ipc.js 注册了 18 个 IPC 处理器,分为 4 组:
审计日志(4 个)
| IPC 频道 | 说明 | 参数 |
|---|---|---|
audit:query-logs | 分页查询审计日志 | filters 对象 |
audit:get-log-detail | 获取单条日志详情 | id 字符串 |
audit:export-logs | 导出日志 | format, filters |
audit:get-statistics | 获取统计分析 | timeRange 对象 |
合规管理(6 个)
| IPC 频道 | 说明 |
|---|---|
compliance:get-policies | 获取合规策略列表 |
compliance:create-policy | 创建合规策略 |
compliance:update-policy | 更新合规策略 |
compliance:delete-policy | 删除合规策略 |
compliance:check-compliance | 执行合规检查 |
compliance:generate-report | 生成合规报告 |
数据主体请求 DSR(6 个)
| IPC 频道 | 说明 |
|---|---|
dsr:create-request | 创建数据主体请求 |
dsr:list-requests | 列出 DSR 请求 |
dsr:get-request-detail | 获取 DSR 详情 |
dsr:process-request | 处理待处理的 DSR |
dsr:approve-request | 审批通过 DSR |
dsr:export-subject-data | 导出数据主体的全部数据 |
数据保留(2 个)
| IPC 频道 | 说明 |
|---|---|
retention:apply-policy | 应用数据保留策略 |
retention:preview-deletion | 预览将被删除的数据 |
数据库 Schema
enterprise_audit_log 表
CREATE TABLE IF NOT EXISTS enterprise_audit_log (
id TEXT PRIMARY KEY,
timestamp TEXT NOT NULL,
event_type TEXT NOT NULL,
operation TEXT NOT NULL,
actor TEXT DEFAULT 'system',
risk_level TEXT NOT NULL DEFAULT 'low',
success INTEGER NOT NULL DEFAULT 1,
details TEXT, -- JSON 字符串
context TEXT, -- JSON 字符串
error_message TEXT,
duration INTEGER, -- 毫秒
ip_address TEXT,
session_id TEXT,
created_at INTEGER NOT NULL -- Unix 毫秒时间戳
);索引
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON enterprise_audit_log(timestamp);
CREATE INDEX IF NOT EXISTS idx_audit_event_type ON enterprise_audit_log(event_type);
CREATE INDEX IF NOT EXISTS idx_audit_risk_level ON enterprise_audit_log(risk_level);
CREATE INDEX IF NOT EXISTS idx_audit_actor ON enterprise_audit_log(actor);
CREATE INDEX IF NOT EXISTS idx_audit_created_at ON enterprise_audit_log(created_at);使用示例
基本初始化
const { EnterpriseAuditLogger } = require("./audit/enterprise-audit-logger");
const { getDatabase } = require("./database");
const { getHookSystem } = require("./hooks");
const auditLogger = new EnterpriseAuditLogger({
database: getDatabase(),
hookSystem: getHookSystem(),
enabled: true,
maxMemoryEntries: 2000,
alertOnHighRisk: true,
});记录认证事件
// 登录成功
await auditLogger.logAuth("login", {
actor: "did:key:z6Mk...",
success: true,
ipAddress: "192.168.1.100",
sessionId: "sess-abc-123",
duration: 320,
});
// 登录失败(自动标记为 high 风险)
await auditLogger.logAuth("login_failed", {
actor: "unknown",
success: false,
error: "Invalid credentials",
ipAddress: "10.0.0.55",
});记录权限变更
await auditLogger.logPermission("grant_admin", {
actor: "admin@company.com",
targetUser: "user@company.com",
role: "admin",
context: { reason: "Promoted to team lead" },
});监听高风险事件
auditLogger.on("highRiskEvent", (entry) => {
console.warn(
`[ALERT] ${entry.riskLevel}: ${entry.eventType}/${entry.operation}`,
);
// 触发告警通知逻辑
});查询与分页
const result = await auditLogger.query({
eventType: "auth",
riskLevel: "high",
startTime: "2026-02-01T00:00:00Z",
endTime: "2026-02-28T23:59:59Z",
page: 1,
pageSize: 20,
});
if (result.success) {
console.log(`共 ${result.data.pagination.total} 条记录`);
result.data.logs.forEach((log) => {
console.log(`${log.timestamp} [${log.riskLevel}] ${log.operation}`);
});
}使用 wrap 自动审计
const { EventType } = require("./audit/enterprise-audit-logger");
const auditedDelete = auditLogger.wrap(
EventType.DB,
"delete_user_data",
async (userId) => {
return await database.run("DELETE FROM user_data WHERE user_id = ?", [
userId,
]);
},
);
// 执行时自动记录审计日志(含耗时和结果)
await auditedDelete("user-123");查询与导出
渲染进程调用示例
// 查询日志
const logs = await window.electronAPI.invoke("audit:query-logs", {
eventType: "auth",
riskLevel: "high",
page: 1,
pageSize: 50,
});
// 获取统计信息
const stats = await window.electronAPI.invoke("audit:get-statistics", {
startTime: "2026-02-01T00:00:00Z",
endTime: "2026-02-28T23:59:59Z",
period: "day",
});
// 导出为 CSV
const csvData = await window.electronAPI.invoke("audit:export-logs", "csv", {
eventType: "permission",
startTime: "2026-01-01T00:00:00Z",
});
// 应用保留策略
const retention = await window.electronAPI.invoke("retention:apply-policy", {
retentionDays: 90,
maxRecords: 100000,
keepHighRisk: true,
highRiskRetentionDays: 365,
});导出格式说明
JSON 格式:标准 JSON 数组,每个元素为完整日志对象,包含所有字段。
CSV 格式:首行为表头,包含 10 个字段:
id,timestamp,event_type,operation,actor,risk_level,success,error_message,duration,session_idCSV 自动处理逗号、双引号和换行符的转义。
故障排除
审计日志未写入数据库
现象:日志仅存在内存缓冲,查询结果为空。
排查:
- 确认构造函数传入了有效的
database实例 - 检查
_tableInitialized是否为true(通过getQuickStats()查看) - 查看日志中是否有
[EnterpriseAuditLogger] Failed to initialize table错误
审计日志已禁用
现象:log() 返回 { success: false, error: 'Audit logger is disabled' }。
解决:检查构造函数 enabled 参数是否被设为 false。
高风险告警未触发
排查:
- 确认
alertOnHighRisk为true - 确认操作名正确包含在高风险操作列表中
- 确认已注册
highRiskEvent事件监听器
Hook 事件未被捕获
排查:
- 确认构造函数传入了
hookSystem实例 - 确认 Hook 系统正常运行并发出
hookExecuted事件 - 查看日志中是否有
HookSystem listeners registered确认信息
内存缓冲溢出
现象:历史日志丢失,仅保留最近的条目。
说明:内存缓冲遵循 FIFO 策略,超过 maxMemoryEntries 后自动淘汰最旧记录。如需保留全部日志,确保数据库实例已正确传入。
敏感字段未脱敏
排查:确认字段名是否在 22 种敏感字段列表中(不区分大小写匹配)。支持的字段名包括:
password, passwd, pwd, token, accessToken, refreshToken,
access_token, refresh_token, secret, clientSecret, client_secret,
apiKey, api_key, apikey, credential, credentials,
privateKey, private_key, authorization, cookie, pin, cvv, ssn日志查询响应缓慢
现象: audit:query-logs 接口响应时间超过数秒。
排查步骤:
- 检查
enterprise_audit_log表记录总数,超过 10 万条时建议执行retention:apply-policy清理 - 确认查询条件是否命中索引(
timestamp、event_type、risk_level、actor、created_at) - 减小
pageSize参数(默认 50,最大 500),避免单次查询返回过多数据 - 定期执行 SQLite
VACUUM优化数据库文件碎片
审计日志存储空间耗尽
现象: 数据库文件持续增长,磁盘空间不足。
排查步骤:
- 配置并执行
retention:apply-policy,设置合理的retentionDays(默认 90 天) - 调高
logLevel从info到warning,减少低风险事件的记录量 - 使用
retention:preview-deletion预览将被清理的数据量 - 对于高风险日志,
highRiskRetentionDays默认 365 天,可视情况调整
日志格式异常(JSON 解析失败)
现象: 导出或查询日志时 details 字段 JSON 解析失败。
排查步骤:
- 检查写入日志时
details参数是否包含不可序列化的对象(如循环引用) - 确认脱敏处理后的字段值未被截断为不完整的 JSON 字符串
- 对于 CSV 导出,检查
details中的逗号和引号是否正确转义
关键文件
| 文件 | 职责 |
|---|---|
desktop-app-vue/src/main/audit/enterprise-audit-logger.js | 企业审计日志核心模块 |
desktop-app-vue/src/main/audit/audit-ipc.js | 审计 IPC 处理器 (18 handlers) |
desktop-app-vue/src/main/audit/compliance-manager.js | 合规策略管理 |
desktop-app-vue/src/main/audit/dsr-handler.js | 数据主体请求处理 |
desktop-app-vue/src/main/hooks/index.js | Hook 系统 (21 种事件) |
故障排查
常见问题
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| 日志查询超时 | 数据量过大未建立索引或查询时间范围过宽 | 缩小查询时间范围,执行 audit index-rebuild |
| 存储空间满导致写入失败 | 日志轮转策略未配置或保留周期过长 | 配置 retentionDays,启用自动清理 |
| 导出格式错误或文件损坏 | 导出过程中断或编码不匹配 | 指定编码 --encoding utf-8,检查磁盘空间 |
| 审计事件丢失 | 高并发下写入队列溢出 | 增大 bufferSize 配置,启用异步批量写入 |
| 合规报告生成失败 | 模板文件缺失或数据源连接异常 | 检查模板路径,确认数据库连接正常 |
常见错误修复
错误: QUERY_TIMEOUT 日志查询超时
# 重建审计日志索引
chainlesschain audit index-rebuild
# 使用分页查询减少单次数据量
chainlesschain audit log --limit 100 --offset 0错误: STORAGE_FULL 存储空间不足
# 查看审计日志占用空间
chainlesschain audit stats --storage
# 清理过期日志(保留最近 90 天)
chainlesschain audit gc --retention-days 90错误: EXPORT_FAILED 导出异常
# 指定格式和编码重新导出
chainlesschain audit export --format csv --encoding utf-8 --output ./audit-export.csv
# 验证导出文件完整性
chainlesschain audit export-verify --file ./audit-export.csv性能指标
核心操作基准
| 操作 | 目标 | 实际 | 状态 |
|---|---|---|---|
| 单条日志写入(内存缓冲) | < 1ms | ~0.3ms | ✅ |
| 单条日志写入(SQLite 持久化) | < 10ms | ~4ms | ✅ |
风险评估(assessRisk) | < 1ms | ~0.2ms | ✅ |
敏感字段脱敏(sanitizeData,10 层递归) | < 2ms | ~0.8ms | ✅ |
| 分页查询(pageSize=50,有索引) | < 50ms | ~18ms | ✅ |
统计分析(7 天 / day 粒度) | < 200ms | ~85ms | ✅ |
| 全量导出 JSON(1 万条) | < 2s | ~1.1s | ✅ |
| 全量导出 CSV(1 万条) | < 2s | ~1.3s | ✅ |
| 数据保留策略执行(清理 5 万条) | < 5s | ~2.8s | ✅ |
| Hook 事件映射并写入审计记录 | < 5ms | ~1.5ms | ✅ |
资源使用
| 指标 | 说明 | 典型值 |
|---|---|---|
| 内存缓冲占用 | 2000 条上限,FIFO 淘汰 | ~2MB |
| SQLite 单条记录大小 | 含 details/context JSON,已脱敏截断 | ~500B |
| 10 万条日志数据库体积 | 含全部索引 | ~60MB |
| 启动时初始化耗时 | 建表 + 5 个索引 | < 20ms |
| 高并发写入(100 req/s) | WAL 模式,busy_timeout=30s | 无阻塞 |
测试覆盖率
| 测试文件 | 覆盖范围 |
|---|---|
✅ desktop-app-vue/tests/unit/audit/enterprise-audit-logger.test.js | 核心日志写入、风险评估、脱敏、高风险告警、Hook 集成、内存缓冲 FIFO |
✅ desktop-app-vue/tests/unit/audit/enterprise-audit-logger-query.test.js | 分页查询、多条件过滤、统计分析、时间趋势、topActors |
✅ desktop-app-vue/tests/unit/audit/enterprise-audit-logger-export.test.js | JSON/CSV 导出、字段转义、导出元信息、过滤器组合 |
✅ desktop-app-vue/tests/unit/audit/enterprise-audit-logger-retention.test.js | 保留策略执行、高风险日志豁免、maxRecords 截断、preview 模式 |
✅ desktop-app-vue/tests/unit/audit/audit-ipc.test.js | 18 个 IPC 处理器注册与调用、参数校验、权限拦截 |
✅ desktop-app-vue/tests/unit/audit/compliance-manager.test.js | 合规策略 CRUD、合规检查逻辑、报告生成 |
✅ desktop-app-vue/tests/unit/audit/dsr-handler.test.js | DSR 请求创建/列表/详情/处理/审批/数据导出 |
✅ desktop-app-vue/tests/unit/audit/sanitize-data.test.js | 22 类敏感字段脱敏、递归深度限制、二进制替换、超长字符串截断 |
✅ desktop-app-vue/tests/unit/audit/risk-assessor.test.js | 4 级风险判定、critical 关键词匹配、medium 模式覆盖、事件类型默认规则 |
✅ desktop-app-vue/tests/unit/audit/hook-integration.test.js | 21 种 Hook 事件映射为审计记录、hookSystem 缺失时的降级行为 |
安全考虑
日志完整性
- 审计日志写入后不可修改、不可删除,保证事后追溯的可靠性
- 禁用审计日志(
disable_audit)被标记为 critical 风险操作,触发最高级别告警 - 日志同时写入 SQLite 数据库和内存缓冲区,双写机制防止单点故障丢失记录
敏感数据保护
- 22 类敏感字段(密码、令牌、密钥、凭证等)在写入前 自动递归脱敏
- 大二进制数据(截图、Base64 等)超过 5000 字符自动替换为占位符
- 超长字符串(>1000 字符)自动截断,防止日志存储膨胀
访问控制
- 审计日志查询和导出接口受 RBAC 权限保护,仅管理员角色可访问
- 合规报告生成和数据主体请求(DSR)需要经过审批工作流
- 数据保留策略的应用需要管理员权限,防止恶意清除日志
合规保障
- 支持 GDPR 数据主体请求(DSR):访问、导出、删除个人数据
- 高风险日志默认保留 365 天(普通日志 90 天),满足法规要求
- JSON/CSV 导出格式支持与第三方合规审计工具集成
