必须先确认security.authorization已启用,否则扫描结果不可信;需在mongosh中执行db.runcommand({getcmdlineopts: 1})验证parsed.security.authorization值为"enabled"字符串,而非仅配置文件设置或依赖连接报错判断。

必须先确认 security.authorization 已启用,否则所有扫描结果都不可信——连基础鉴权都没生效,工具扫出来的“合规项”全是假阳性。
扫描前必须验证授权状态是否真实生效
配置文件里写了 security.authorization: enabled 不等于它真在运行。容器、Ansible 或启动脚本可能覆盖配置,或服务没重启。
- 进
mongosh执行db.runCommand({getCmdLineOpts: 1}),检查返回中parsed.security.authorization是否为"enabled"(字符串,不是布尔值) - 若返回
"disabled"或字段不存在,立即停扫,修正配置并systemctl restart mongod - 别依赖
db.adminCommand({listDatabases: 1})是否报错来判断——普通用户连不上不等于鉴权开了,root 用户连得上也不代表鉴权已启用
用 mongo-audit 扫描时权限和连接参数不能省
工具连得通 ≠ 能扫全。静默漏检比报错更危险,尤其在 MongoDB 6.0+ 上。
- 扫描账号必须有
clusterAdmin+readAnyDatabase角色;仅root不够,某些审计命令(如getParameter)需集群级权限 - 连接时必须显式切换到
admin库:加--eval "db.getSiblingDB('admin').runCommand({listDatabases: 1})",否则listDatabases在非admin库默认被禁用 - TLS 连接必须强制指定:
--tls --tlsCAFile /path/to/ca.pem;不加参数时工具可能卡在 handshake 阶段,无任何提示
默认 admin 账户是合规扫描的硬性雷区
CIS MongoDB Benchmark、Nessus 等工具直接匹配用户名为 admin 的 root 角色账户,命中即标“高危”,改密码无效。
- 执行
use admin后运行:db.getUsers({filter: {roles: {$elemMatch: {role: "root", db: "admin"}}}}) - 若返回中含
user: "admin",必须新建语义化账户(如"ops-admin-2026"),再执行db.dropUser("admin") - 社区版无法靠
db.createUser()实现等保要求的密码策略(最小长度 12、历史密码禁止复用),只能补 OS 层 PAM:确认/etc/pam.d/mongod加载了pam_pwquality.so且配置minlen=12 difok=5
最常被忽略的是密钥硬编码问题:encryptionKeyFile 路径绝不能出现在 /etc/mongod.conf 明文里——应由 KMS 动态注入;还有 TLS 版本必须实测,光配 net.tls.mode: requireTLS 不够,得用 openssl s_client -connect host:27017 -tls1_2 验证握手是否成功。











