审计日志是企业安全合规的重要组成部分,记录所有敏感操作以便追溯和审计。本文详细介绍 IMS 系统审计日志的设计方案。
审计日志内容
需要记录的关键操作包括:
- 用户登录:登录成功、失败、登出事件
- 数据访问:敏感数据查看、导出、下载
- 数据修改:创建、更新、删除操作
- 权限变更:角色分配、权限变更
- 系统操作:配置修改、系统操作
/* 审计日志数据结构 */
interface AuditLog {
id: string; // 日志唯一标识
timestamp: Date; // 操作时间
userId: string; // 用户 ID
userName: string; // 用户名称
action: string; // 操作类型
resource: string; // 资源类型
resourceId: string; // 资源 ID
ip: string; // 客户端 IP
userAgent: string; // 浏览器信息
requestMethod: string; // 请求方法
requestUrl: string; // 请求地址
requestParams: object; // 请求参数
responseStatus: number; // 响应状态
errorMessage?: string; // 错误信息
}
审计日志采集
使用 AOP 面向切面编程实现无侵入日志采集:
/* 审计日志切面 */
@Aspect
@Component
class AuditAspect {
@Around("@annotation(audit)")
around(joinPoint: ProceedingJoinPoint, audit: Audit) {
const log = new AuditLog();
log.userId = getCurrentUser().id;
log.action = audit.action();
log.resource = audit.resource();
log.ip = getClientIp();
const startTime = Date.now();
let result;
let error;
try {
result = joinPoint.proceed();
log.responseStatus = 200;
} catch (e) {
error = e;
log.responseStatus = 500;
log.errorMessage = e.message;
throw e;
} finally {
log.executionTime = Date.now() - startTime;
await saveAuditLog(log);
}
return result;
}
}
/* 使用示例 */
@Audit(action = "CREATE_ORDER", resource = "ORDER")
async createOrder(order: Order) {
// 业务逻辑...
}
日志存储策略
审计日志需要长期保存并支持快速查询:
/* 日志存储策略 */
const AUDIT_STORAGE = {
// 近期数据存 Elasticsearch
hot: {
index: "audit-logs-*",
retention: "30d",
storage: "ssd"
},
// 历史数据归档到对象存储
cold: {
format: "parquet",
retention: "7years",
location: "oss://ims-audit-archive/"
}
};
/* 按日期自动归档 */
async archiveOldLogs() {
const cutoffDate = subDays(now(), 30);
const logs = await query({
index: "audit-logs-*",
filter: { range: { timestamp: { lt: cutoffDate } } },
size: 10000
});
// 导出为 Parquet 格式
const parquetBuffer = toParquet(logs);
await upload(`oss://ims-audit-archive/${formatDate(cutoffDate)}.parquet`, parquetBuffer);
// 删除旧索引
await deleteOldIndex(cutoffDate);
}
合规要求
审计日志需要满足等保和行业合规要求,包括:日志完整性保护、不可篡改、保留期限至少 1 年等。
审计查询与报表
提供多维度的审计日志查询能力:
/* 审计日志查询接口 */
interface AuditQueryParams {
userId?: string;
action?: string;
resource?: string;
startTime?: Date;
endTime?: Date;
ip?: string;
keyword?: string;
page?: number;
pageSize?: number;
}
/* 危险操作告警规则 */
const ALERT_RULES = [
{
name: "多次登录失败",
condition: "action=LOGIN_FAILED",
threshold: 5,
window: "10m",
severity: "warning"
},
{
name: "敏感数据批量导出",
condition: "action=DATA_EXPORT",
threshold: 100,
window: "1h",
severity: "high"
},
{
name: "权限提升",
condition: "action=GRANT_PERMISSION",
threshold: 1,
window: "1m",
severity: "critical"
}
];
日志安全保护
- 完整性校验:使用数字签名防止篡改
- 访问控制:审计日志仅管理员可查询
- 加密存储:敏感操作记录加密存储
- 异地备份:日志同步到异地存储
总结
审计日志系统设计要点:
- 使用 AOP 实现无侵入的日志采集
- 合理设计日志存储分层策略
- 实现多维度查询和危险操作告警
- 满足合规要求的日志保护机制
- 定期生成审计报表供合规检查