外观
MongoDB 审计日志
开启审计日志
配置文件方式
编辑 MongoDB 配置文件:
yamlsystemLog: 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" ] } }'重启 MongoDB:
bashsystemctl 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 分析
配置 Filebeat:
yamlfilebeat.inputs: - type: log paths: - /var/log/mongodb/audit.json json.keys_under_root: true json.overwrite_keys: true output.elasticsearch: hosts: ["localhost:9200"]配置 Kibana 可视化:
- 创建索引模式
mongodb-audit-* - 配置仪表板,包括:
- 审计事件类型分布
- 认证失败统计
- 操作类型分布
- 客户端 IP 分布
- 创建索引模式
使用 Splunk 分析
- 安装 MongoDB 审计日志应用
- 配置数据源:
- 添加文件监控
/var/log/mongodb/audit.json - 设置 sourcetype 为
mongodb:audit:json
- 添加文件监控
- 创建仪表盘:
- 审计事件概览
- 安全事件监控
- 操作趋势分析
审计日志管理
日志轮转
使用 logrotate:
txt/var/log/mongodb/audit.json { daily rotate 30 compress delaycompress missingok notifempty create 0640 mongodb mongodb postrotate systemctl reload mongod endscript }配置文件位置:
- CentOS/RHEL:
/etc/logrotate.d/mongodb - Ubuntu/Debian:
/etc/logrotate.d/mongodb
- CentOS/RHEL:
日志清理
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 中,可以通过以下步骤开启审计日志:
- 登录 Atlas 控制台
- 选择集群
- 点击 "Security" > "Auditing"
- 开启审计日志
- 配置审计过滤器
Q5: 审计日志可以记录哪些操作?
A5: 审计日志可以记录:
- 数据库连接和认证事件
- CRUD 操作
- 数据库和集合管理操作
- 用户和角色管理操作
- 权限变更
- 系统事件
Q6: 如何分析审计日志中的认证失败事件?
A6: 可以使用以下方法分析认证失败事件:
- 使用 MongoDB Shell 过滤审计日志
- 使用 ELK Stack 或 Splunk 创建可视化仪表盘
- 配置告警规则,当认证失败次数超过阈值时发送告警
Q7: 审计日志的默认保留期限是多少?
A7: MongoDB 没有默认的审计日志保留期限,需要手动配置日志轮转和清理策略。建议根据合规要求设置保留期限,通常为 30-90 天。
Q8: 如何备份审计日志?
A8: 可以通过以下方式备份审计日志:
- 使用文件系统备份工具备份审计日志文件
- 配置日志管理系统(如 ELK Stack)将审计日志发送到远程存储
- 使用云服务(如 S3)存储审计日志
