先说一个扎心的事实:在 Ubuntu 20.04 上装好 MongoDB 4.4,默认状态下,它既没有认证,也没有加密。任何人只要知道你的 IP 和端口,就能直接连上读走全库数据——这不是什么“开箱即用”的便利,而是摆在桌面上的高危暴露面。

因此,安全加固不是“要不要做”的问题,而是“今天必须完成”的紧迫任务。 下面直接上干货,从认证配置到传输加密,一步不落,帮你彻底锁住 MongoDB 数据库。
如何确认当前 MongoDB 是否已启用认证
别靠猜,直接查配置文件和运行时状态。很多运维改完 mongod.conf 以为就完了,其实没重启或者配置没加载,照样是裸奔状态。
- 查配置文件是否真的启用了授权:
grep -E "^[[:space:]]*security.authorization" /etc/mongod.conf,输出必须是security.authorization: enabled,注意末尾不能有注释符号。 - 验证 mongod 进程实际加载了哪个配置:
ps aux | grep mongod,确认命令行里没有--noauth或--auth。Ubuntu 20.04 的 systemd 服务默认走配置文件,但手动加参数会覆盖它。 - 最直接的方法:本地直连,用
mongo执行db.runCommand({connectionStatus: 1})。如果authInfo.authenticatedUsers是个空数组,那认证就是没生效。
创建管理员用户必须在启用认证前完成
这是最容易卡住的地方。一旦 security.authorization: enabled 生效,而你又没提前建好用户,那就彻底进不去 admin 数据库了——mongo 连上去直接报错 not authorized on admin to execute command,等于把自己锁在门外。
正确的操作顺序:
- 先停服务:
sudo systemctl stop mongod - 临时无认证启动:
sudo mongod --config /etc/mongod.conf --noauth(保持终端占用,另开一个 shell 窗口操作) - 在新终端里连接并创建用户:
mongo --port 27017→use admin→db.createUser({user:"admin", pwd:"Tr0ub4d0ur!2026", roles:["root"]}) - Ctrl+C 结束临时进程,改回配置文件启用认证,再
sudo systemctl start mongod
注意:root 角色虽然方便,但生产环境建议拆成 userAdminAnyDatabase + dbAdminAnyDatabase + clusterAdmin 的组合,避免单点权限过大,提升 MongoDB 用户权限管理安全性。
配置 TLS/SSL 时必须同时指定证书链与私钥路径
如果你只放一个 .pem 文件,漏了中间 CA 或者权限设错,mongod 启动会静默失败——systemctl status mongod 显示 active (exited),但日志里会有 error:0909006C:PEM routines:get_name:no start line 这种提示。
正确的做法:
- 证书文件必须包含完整链:
cat mongodb-server.crt intermediate.crt root.crt > /etc/ssl/mongodb.pem,私钥单独存为/etc/ssl/mongodb-key.pem,然后chown mongodb:mongodb+chmod 600。 - mongod.conf 中必须同时写两行:
net.ssl.mode: requireSSL和net.ssl.PEMKeyFile: /etc/ssl/mongodb.pem(注意不是.crt或.key单独文件)。 - Ubuntu 20.04 默认的 OpenSSL 1.1.1f 不支持 TLS 1.3,但强制写
net.ssl.TLSCertificateKeyFile会导致启动失败。稳妥的做法是用net.ssl.PEMKeyFile+net.ssl.CAFile。
客户端连接必须显式声明认证数据库
很多人配好了服务端 TLS 和认证,但用 mongo -u admin -p xxx 连不上,错误是 Authentication failed——问题大概率不在密码,而在你没告诉客户端“去哪个库验这个用户”。
- CLI 连接必须加
--authenticationDatabase admin,例如:mongo -u admin -p 'Tr0ub4d0ur!2026' --host 10.0.1.5 --port 27017 --authenticationDatabase admin --tls --tlsCAFile /etc/ssl/ca.crt - Node.js 驱动连接字符串要带
authSource=admin参数,比如:mongodb://admin:Tr0ub4d0ur!2026@10.0.1.5:27017/?authSource=admin&tls=true&tlsCAFile=%2Fetc%2Fssl%2Fca.crt - 遗漏
authSource会导致客户端默认在目标数据库(比如test)里找用户,而用户实际存在admin库,自然失败。
还有一个容易被忽略的坑:Ubuntu 20.04 的 AppArmor profile 默认不允许 mongod 访问自定义 SSL 路径。如果把证书放在 /opt/certs/ 这类非标准位置,必须手动更新 /etc/apparmor.d/usr.bin.mongod 并执行 sudo apparmor_parser -r /etc/apparmor.d/usr.bin.mongod,否则日志里只会出现 operation not permitted 这种模糊错误,排查起来非常头疼。
