直接导出system.users不能生成权限审计报告,因其仅存静态用户角色绑定信息,无法反映权限变更、访问日志及执行上下文;真正审计需融合操作日志、角色定义与权限映射三者交叉分析。

直接导出 system.users 集合本身不能生成“权限审计报告”,因为该集合只存用户凭证和角色绑定关系,不记录权限变更行为、访问日志或执行上下文。真正的审计必须结合操作日志、角色定义和权限映射三者交叉分析。
为什么不能只 dump system.users
system.users 是静态快照:它只保存当前用户+角色+数据库绑定信息,比如 { "user": "queue-worker", "db": "admin", "roles": [{ "role": "readWrite", "db": "app" }] }。但它无法回答这些问题:
- 这个用户上次登录是什么时候?
- 谁在什么时候给它加了
root角色? - 有没有人删过这个用户?操作 IP 是多少?
- 该角色实际允许哪些操作?
readWrite在不同 MongoDB 版本中隐含动作可能不同
所以单纯导出 system.users 只能算“用户清单备份”,不是审计报告。
真正可用的权限审计数据源在哪
MongoDB 本身不默认记录用户权限变更日志,必须主动启用并配合外部机制:
-
mongod启动时开启auditLog:需配置auditLog.destination: file+auditLog.format: JSON,否则所有createUser、grantRolesToUser等操作都不会落盘 -
db.runCommand({ serverStatus: 1 })中的connections和security字段可查当前认证状态,但非历史记录 - 应用层埋点:Laravel 的
src/Queue/MongoQueue.php这类自定义队列处理器,应在调用前记录created_by、ip_address、last_modified到独立审计集合(如audit.user_actions) - 角色定义需反查:
db.getRole("readWrite", { showPrivileges: true })才能知道它实际包含哪些actions,不能只信角色名
定时导出 system.users 的实操要点
如果你仍需要定期导出 system.users 作为基线比对(例如检测异常新增用户),注意以下限制和写法:
- 必须连接到
admin数据库才能读system.users,其他库不可见该集合 -
mongoexport不支持导出system.*集合(会报错collection does not exist),只能用mongodump - 命令示例:
mongodump --host localhost --port 27017 --username admin --password "pwd" --authenticationDatabase admin --db admin --collection system.users --out ./audit_backup/ - 导出结果是 BSON,不是人类可读 JSON;如需文本格式,得后续用
mongorestore --dryRun或写脚本解析admin/system.users.bson - Windows 批处理中注意
%date%和%time%格式不稳定,建议改用powershell -Command "(Get-Date).ToString('yyyyMMdd_HHmmss')"
最小可行审计报告生成逻辑
一个能落地的自动化权限审计报告,至少应包含三部分拼接:
- 当前
system.users快照(用mongodump定时抓取) - 最近 7 天的
auditLog文件(按日期切割,用jq提取atype == "createUser" or atype == "grantRole"的条目) - 各角色实际权限展开(循环执行
db.getRole(..., {showPrivileges:true})并存为 JSON)
三者用时间戳和用户名做关联,才能看出“谁在何时授予了什么权限”。跳过任意一环,报告就只是静态清单,不是审计。


















