审计日志(Audit Log)
审计日志(Audit Log)的概念
审计日志是记录系统操作行为的核心机制,用于追踪数据变更、用户活动和系统事件。在MongoDB中,审计日志通过捕获数据库操作(如CRUD)、身份验证事件和管理命令,为安全合规和故障排查提供关键依据。与普通日志不同,审计日志强调不可篡改性和完整性,通常需要单独存储且保留特定周期。
MongoDB审计日志的配置方法
启用审计功能需在mongod.conf
配置文件中添加以下参数:
auditLog:
destination: file
format: JSON
path: /var/log/mongodb/audit.json
filter: '{ atype: { $in: ["authenticate", "createCollection"] } }'
支持三种输出目标:
- 文件:直接写入磁盘文件(支持JSON/BSON格式)
- Syslog:发送到系统日志服务
- 控制台:输出到标准输出流
过滤器示例仅记录认证和集合创建事件,实际生产环境可能需要更复杂的过滤条件:
// 动态设置审计过滤器
db.adminCommand({
setParameter: 1,
auditAuthorizationSuccess: true,
auditFilter: {
$or: [
{ "param.command": { $in: ["dropDatabase", "shutdown"] } },
{ "param.ns": /^protectedDB\./ }
]
}
})
审计事件的分类与结构
MongoDB将审计事件分为6大类:
-
身份验证事件:
authenticate
:成功登录authCheck
:权限验证
{ "atype": "authenticate", "ts": { "$date": "2023-08-20T03:45:12.483Z" }, "local": { "ip": "192.168.1.15", "port": 27017 }, "remote": { "ip": "10.2.3.4", "port": 54132 }, "users": [{ "user": "admin", "db": "admin" }], "result": 0 }
-
CRUD操作:
insert
/update
/delete
操作详情
{ "atype": "delete", "ts": { "$date": "2023-08-20T03:47:22.156Z" }, "param": { "ns": "medical.records", "query": { "patientId": "P10023" } } }
-
管理操作:
createCollection
/dropDatabase
等DDL操作- 用户角色变更记录
审计日志的存储优化策略
大规模部署时需要特别注意:
分片集群配置:
# 每个分片单独配置审计路径
sharding:
clusterRole: "shardsvr"
auditLog:
destination: file
path: "/data/shard01/audit.log"
日志轮转方案:
# 使用logrotate工具配置
/var/log/mongodb/audit.json {
daily
rotate 30
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
killall -SIGUSR1 mongod
endscript
}
存储分离示例:
// 将审计日志写入专用集合
use admin
db.createCollection("system.audit", {
capped: true,
size: 1024 * 1024 * 1024, // 1GB容量
storageEngine: { wiredTiger: { configString: "block_compressor=zstd" } }
})
审计日志的分析实践
使用Aggregation Pipeline进行日志分析:
db.system.audit.aggregate([
{
$match: {
"atype": "update",
"ts": { "$gt": ISODate("2023-08-01") }
}
},
{
$group: {
_id: "$param.ns",
count: { $sum: 1 },
users: { $addToSet: "$users.user" }
}
},
{ $sort: { count: -1 } }
])
安全告警规则示例:
// 检测异常删除操作
const alerts = db.system.audit.find({
"atype": "delete",
"param.ns": /^finance\./,
"ts": { "$gt": new Date(Date.now() - 3600000) },
"$expr": { "$gt": [{ "$size": "$param.query" }, 5] }
})
合规性要求实现
满足GDPR的配置示例:
auditLog:
destination: file
path: /var/log/mongodb/gdpr_audit.log
filter: '{
$or: [
{ "param.ns": /\.personal_data$/ },
{ "atype": { $in: ["createUser", "dropUser"] } }
]
}'
HIPAA医疗数据审计方案:
// 使用change streams实时监控
const pipeline = [
{ $match: {
operationType: { $in: ["insert", "update", "delete"] },
"ns.db": "medical",
"fullDocument.ssn": { $exists: true }
}}
];
db.watch(pipeline).on("change", change => {
db.hipaa_audit.insertOne({
timestamp: new Date(),
operator: change.operationType,
documentKey: change.documentKey,
clientInfo: change.clientInfo
});
});
性能影响与调优
审计日志对性能的影响主要来自:
- I/O压力测试数据:
- 无审计:平均吞吐量 12,000 ops/sec
- 文件审计:9,200 ops/sec (23%下降)
- Syslog审计:7,800 ops/sec (35%下降)
优化方案:
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
# 为审计日志单独配置缓存
auditLogCacheSizeGB: 2
异步写入配置:
db.adminCommand({
setParameter: 1,
auditLogFlushIntervalMillis: 1000 // 1秒批量写入
})
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:数据加密(字段级加密、存储加密)
下一篇:网络安全与防火墙配置