IMS系统审计日志设计完全指南

审计日志是企业安全合规的重要组成部分,记录所有敏感操作以便追溯和审计。本文详细介绍 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 实现无侵入的日志采集
  • 合理设计日志存储分层策略
  • 实现多维度查询和危险操作告警
  • 满足合规要求的日志保护机制
  • 定期生成审计报表供合规检查