必须先启用 auditlog,否则所有后续监控都无效;需在启动时显式配置 destination=file、format=json、path 且目录有写权限,通过 conf 或参数二选一设置;关键 atype 包括 createuser、updateuser、grantrolestouser、revokerolesfromuser、dropallusersfromdatabase;filebeat 须启用 json.keys_under_root: true 并用 processors 过滤,es 中 atype 映射为 keyword;告警需处理 roles 数组、日志轮转丢失及跨连接操作关联分析。

必须先启用 auditLog,否则所有后续监控都无效——MongoDB 默认完全关闭审计,不靠 db.setLogLevel() 或日志级别开关控制,只认启动时的显式配置。
如何正确启用 MongoDB 审计日志(auditLog)
审计日志不是“打开日志”就行,它需要在服务启动阶段就绑定路径、格式和目标,漏掉任一环节都会导致 mongod 启动失败。
-
auditLog.destination必须设为file(不支持syslog在某些版本中会静默失效) -
auditLog.format强烈建议用JSON,便于后续用filebeat或jq过滤解析 -
auditLog.path对应目录需由mongod进程用户(如mongod用户)拥有写权限,否则报错:Failed to open audit log file - 配置方式二选一:要么改
/etc/mongod.conf,要么启动时加参数--auditDestination file --auditFormat JSON --auditPath /var/log/mongodb/audit.log,混用会冲突
哪些 atype 值真正代表特权操作
审计日志里事件类型极多,但只有几个 atype 值直接对应权限变更。过滤其余字段只会增加误报和延迟。
-
"atype": "createUser":尤其关注非运维时段、非常规 IP、或角色含root/userAdminAnyDatabase的新建行为 -
"atype": "updateUser":重点看roles字段是否被追加高危角色(如从read改成dbOwner) -
"atype": "grantRolesToUser"和"atype": "revokeRolesFromUser":这是最干净的权限增减信号,告警可直接命中 -
"atype": "dropAllUsersFromDatabase":极易被忽略,但属于清空级操作,应单独设高优先级告警 - 别依赖
"atype": "authenticate"单独判断——它只说明登录成功,需结合user.roles和后续操作才具意义
用 filebeat 实时采集并过滤 atype 的实操要点
filebeat 是目前最轻量且稳定处理 MongoDB 审计日志的方案,但默认配置会丢事件或解析失败。
- 必须在
filebeat.yml中启用json.keys_under_root: true,否则atype会被嵌套在json.*下无法匹配 - 用
processors直接丢弃非权限类事件,减少 pipeline 压力:processors: - drop_event.when.not: or: - equals.atype: "createUser" - equals.atype: "updateUser" - equals.atype: "grantRolesToUser" - equals.atype: "revokeRolesFromUser" - equals.atype: "dropAllUsersFromDatabase" - 输出到 Elasticsearch 时,确保
atype字段被映射为keyword类型,否则聚合告警会失效 - 避免用 Logstash 做二次解析——审计日志是高频小体积 JSON 流,Logstash JVM 开销大且易堆积
告警规则里最容易被绕过的细节
很多团队配完 filebeat → ES → 告警 就以为闭环了,但实际生产中,以下三点常导致关键操作漏告:
- 审计日志不记录命令具体内容,只记动作类型——比如
"atype": "updateUser"不告诉你改了哪个角色,得靠roles字段提取,而该字段在部分 MongoDB 版本中是数组,ES 需要scripted_field才能判断是否含root -
filebeat若未设close_inactive: 5m,当日志轮转(如audit.log.2026-05-12)时可能跳过旧文件,丢失历史操作 - 权限操作可能跨多个连接完成(如先
authenticate再grantRolesToUser),单条日志无法还原上下文,需在告警逻辑中做 30 秒窗口内关联分析











