Skip to content

MongoDB 审计日志

开启审计日志

配置文件方式

  1. 编辑 MongoDB 配置文件

    yaml
    systemLog:
      destination: file
      path: /var/log/mongodb/mongod.log
      logAppend: true
    
    auditLog:
      destination: file
      format: JSON
      path: /var/log/mongodb/audit.json
      filter: '{ "atype": { "$in": [ "authCheck", "createUser", "dropUser", "createRole", "dropRole" ] } }'
  2. 重启 MongoDB

    bash
    systemctl restart mongod

命令行方式

bash
mongod --auditDestination file --auditFormat JSON --auditPath /var/log/mongodb/audit.json

副本集配置

在副本集配置中,需要在每个节点上启用审计日志:

yaml
# 副本集节点配置
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.json
  filter: '{ "atype": { "$in": [ "authCheck", "createUser", "dropUser" ] } }'

审计日志配置选项

审计目标(auditDestination)

  • file:将审计日志写入文件
  • syslog:将审计日志发送到 syslog
  • console:将审计日志输出到控制台
  • pipe:将审计日志发送到管道

审计格式(auditFormat)

  • JSON:JSON 格式,易于解析和分析
  • BSON:二进制格式,占用空间小

审计过滤器(filter)

使用 MongoDB 查询语法过滤审计事件,例如:

json
{ "atype": { "$in": [ "authCheck", "createUser", "dropUser" ] } }

审计字段(fields)

可以配置审计日志包含的字段:

  • allActions:记录所有操作
  • readActions:只记录读操作
  • writeActions:只记录写操作
  • adminActions:只记录管理操作

审计日志格式

JSON 格式示例

json
{
  "atype": "authCheck",
  "ts": { "$date": "2023-01-01T00:00:00.000Z" },
  "local": { "ip": "127.0.0.1", "port": 27017 },
  "remote": { "ip": "192.168.1.100", "port": 54321 },
  "users": [{ "user": "admin", "db": "admin" }],
  "roles": [{ "role": "root", "db": "admin" }],
  "param": {
    "command": "find",
    "ns": "mydb.mycollection",
    "filter": { "name": "test" }
  },
  "result": 0
}

字段说明

  • atype:审计事件类型
  • ts:事件时间戳
  • local:本地 MongoDB 服务器地址和端口
  • remote:客户端地址和端口
  • users:执行操作的用户
  • roles:用户拥有的角色
  • param:操作参数
  • result:操作结果,0 表示成功

审计日志分析

使用 MongoDB Shell 分析

javascript
// 连接到 MongoDB
mongo

// 加载审计日志
var auditLogs = cat("/var/log/mongodb/audit.json").split("\n").filter(function(line) { return line.trim() !== ""; }).map(JSON.parse);

// 统计认证失败事件
var authFailures = auditLogs.filter(function(log) { 
  return log.atype === "authCheck" && log.result !== 0; 
});
print("认证失败次数:" + authFailures.length);

// 统计用户创建事件
var userCreations = auditLogs.filter(function(log) { 
  return log.atype === "createUser"; 
});
print("用户创建次数:" + userCreations.length);

使用 ELK Stack 分析

  1. 配置 Filebeat

    yaml
    filebeat.inputs:
    - type: log
      paths:
        - /var/log/mongodb/audit.json
      json.keys_under_root: true
      json.overwrite_keys: true
    
    output.elasticsearch:
      hosts: ["localhost:9200"]
  2. 配置 Kibana 可视化

    • 创建索引模式 mongodb-audit-*
    • 配置仪表板,包括:
      • 审计事件类型分布
      • 认证失败统计
      • 操作类型分布
      • 客户端 IP 分布

使用 Splunk 分析

  1. 安装 MongoDB 审计日志应用
  2. 配置数据源
    • 添加文件监控 /var/log/mongodb/audit.json
    • 设置 sourcetype 为 mongodb:audit:json
  3. 创建仪表盘
    • 审计事件概览
    • 安全事件监控
    • 操作趋势分析

审计日志管理

日志轮转

  1. 使用 logrotate

    txt
    /var/log/mongodb/audit.json {
      daily
      rotate 30
      compress
      delaycompress
      missingok
      notifempty
      create 0640 mongodb mongodb
      postrotate
        systemctl reload mongod
      endscript
    }
  2. 配置文件位置

    • CentOS/RHEL:/etc/logrotate.d/mongodb
    • Ubuntu/Debian:/etc/logrotate.d/mongodb

日志清理

bash
# 删除 30 天前的审计日志
find /var/log/mongodb -name "audit*.json*" -mtime +30 -delete

性能优化

  • 使用过滤器减少日志量:只记录必要的审计事件
  • 使用 JSON 格式:便于解析和分析
  • 定期轮转日志:避免单个日志文件过大
  • 使用 SSD 存储:提高日志写入性能

常见审计场景

认证失败监控

json
// 审计过滤器
{ 
  "atype": "authCheck", 
  "result": { "$ne": 0 } 
}

用户和角色管理

json
// 审计过滤器
{ 
  "atype": { 
    "$in": [ 
      "createUser", "dropUser", "updateUser", 
      "createRole", "dropRole", "updateRole", 
      "grantRolesToUser", "revokeRolesFromUser",
      "grantPrivilegesToRole", "revokePrivilegesFromRole"
    ] 
  } 
}

数据操作监控

json
// 审计过滤器
{ 
  "atype": "authCheck", 
  "param.command": { 
    "$in": [ "insert", "update", "delete", "find" ] 
  } 
}

审计日志最佳实践

安全存储

  • 加密存储:对审计日志文件进行加密
  • 访问控制:限制审计日志文件的访问权限
  • 异地备份:将审计日志备份到异地存储

合规性

  • 根据法规配置:根据 GDPR、HIPAA 等法规要求配置审计日志
  • 定期审计:定期分析审计日志,发现安全问题
  • 保留期限:根据法规要求设置审计日志保留期限

性能考虑

  • 合理配置过滤器:只记录必要的审计事件
  • 避免过度审计:过多的审计事件会影响性能
  • 监控审计日志性能:定期检查审计日志对性能的影响

常见问题(FAQ)

Q1: 审计日志会影响 MongoDB 性能吗?

A1: 开启审计日志会对 MongoDB 性能产生一定影响,影响程度取决于审计事件的数量和类型。建议:

  • 只记录必要的审计事件
  • 在低峰时段开启全面审计
  • 监控审计日志对性能的影响

Q2: 如何配置审计日志过滤器?

A2: 可以使用 MongoDB 查询语法配置审计日志过滤器,例如:

json
{ "atype": { "$in": [ "authCheck", "createUser", "dropUser" ] } }

Q3: 审计日志支持哪些格式?

A3: MongoDB 审计日志支持两种格式:

  • JSON:易于解析和分析,适合日志管理系统
  • BSON:二进制格式,占用空间小,适合大量日志场景

Q4: 如何在 Atlas 中开启审计日志?

A4: 在 MongoDB Atlas 中,可以通过以下步骤开启审计日志:

  1. 登录 Atlas 控制台
  2. 选择集群
  3. 点击 "Security" > "Auditing"
  4. 开启审计日志
  5. 配置审计过滤器

Q5: 审计日志可以记录哪些操作?

A5: 审计日志可以记录:

  • 数据库连接和认证事件
  • CRUD 操作
  • 数据库和集合管理操作
  • 用户和角色管理操作
  • 权限变更
  • 系统事件

Q6: 如何分析审计日志中的认证失败事件?

A6: 可以使用以下方法分析认证失败事件:

  • 使用 MongoDB Shell 过滤审计日志
  • 使用 ELK Stack 或 Splunk 创建可视化仪表盘
  • 配置告警规则,当认证失败次数超过阈值时发送告警

Q7: 审计日志的默认保留期限是多少?

A7: MongoDB 没有默认的审计日志保留期限,需要手动配置日志轮转和清理策略。建议根据合规要求设置保留期限,通常为 30-90 天。

Q8: 如何备份审计日志?

A8: 可以通过以下方式备份审计日志:

  • 使用文件系统备份工具备份审计日志文件
  • 配置日志管理系统(如 ELK Stack)将审计日志发送到远程存储
  • 使用云服务(如 S3)存储审计日志