必须先启用security.authorization: enabled,否则rbac和cis合规检查均无效;需通过db.runcommand({getcmdlineopts: 1})验证parsed.security.authorization为"enabled",并确保tls强制启用、审计账号专用且非默认admin用户名。

必须先确认 security.authorization 已启用,否则所有 CIS 基线检查结果都无效——连基础认证都没开,合规性评估直接失去意义。
验证 mongod 是否真正启用了访问控制
很多团队以为加了 --auth 或配了 authorization: enabled 就算完成,但实际运行时可能被覆盖或未生效。最可靠的方式是进 shell 执行:
db.runCommand({getCmdLineOpts: 1})
重点看返回中 parsed.security.authorization 字段是否为 "enabled";若为 "disabled",或整个字段缺失,说明配置未加载成功。常见原因包括:
- 配置文件路径指定错误,
mongod --config指向了旧版或空配置 - systemd 服务文件里写了
ExecStart=...,但硬编码了--noauth参数(优先级高于 config) - Docker 启动时用
-e MONGO_INITDB_ROOT_PASSWORD,却没同步启用 auth(社区版该变量不自动开启 authorization)
CIS 要求的最小权限账号不能用 root 或 admin 用户替代
CIS MongoDB Benchmark 明确要求:审计账户必须是专用、非默认、具备 clusterAdmin + readAnyDatabase 角色的用户,仅拥有 root 角色不够——某些关键命令(如 listDatabases 在非-admin 库下被禁用,getParameter 需集群级权限)会静默失败。
实操要点:
- 新建账号必须显式切换到
admin库创建:use admin后再db.createUser(...) - 避免在
test或业务库中执行db.getUsers(),否则看不到全局角色 - 脚本调用
listDatabases时,必须用--eval "db.getSiblingDB('admin').runCommand({listDatabases: 1})",否则返回空或报错
默认 admin 用户名是 CIS 直接扣分项,改密码没用
CIS 第 2.1 条明确将用户名为 "admin" 的 root 角色账户列为高危项。工具不是检测密码强度,而是匹配字面用户名。执行:
use admin
db.getUsers({filter: {roles: {$elemMatch: {role: "root", db: "admin"}}}})
若返回中含 "user" : "admin",必须立刻新建语义化账号(如 "sec-audit-2026"),再执行 db.dropUser("admin")。注意:
-
db.updateUser("admin", {...})只改密码/角色,不解决用户名本身违规 - 删除前确保新账号已成功登录并能执行
db.runCommand({serverStatus: 1})和db.adminCommand({getLog: "startupWarnings"}) - Ansible 或自动化脚本中,
dropUser是幂等操作,但需捕获UserNotFound异常避免中断
TLS 连接必须显式声明,不能依赖配置自动协商
CIS 要求强制 TLS 1.2+,且禁止明文传输。但 MongoDB 客户端在未加参数时可能降级走非加密连接,尤其在 net.tls.mode: preferTLS 下——这不符合 CIS 的 requireTLS 要求。
扫描或审计脚本务必带齐参数:
-
--tls --tlsCAFile /etc/ssl/mongo-ca.pem(缺一不可,漏掉--tls会导致握手卡死无报错) - 用
openssl s_client -connect host:27017 -tls1_2 -servername your-hostname实测,确认输出含Verify return code: 0 (ok) - 检查证书 SAN 是否包含 IP 和 DNS 名,否则部分 CIS 工具(如 Nessus)会标为“证书不匹配”
真正容易被忽略的是:CIS 不接受“配置了 TLS 但允许非 TLS 连接”的折中方案——requireTLS 是硬性开关,一旦设为 allowTLS 或 preferTLS,整条基线即不通过。











