本文目录导读:

MongoDB 启用访问控制(即认证机制)主要涉及以下几个核心步骤,通常建议在部署完成后、正式使用前就启用,以避免后期数据迁移的麻烦。
核心步骤概览
- 连接到未启用访问控制的 MongoDB 实例。
- 创建管理员用户(
userAdminAnyDatabase角色)。 - 启用访问控制并重启 MongoDB 服务。
- 使用管理员用户验证并创建普通数据库用户。
详细操作步骤
前提条件
- 已经安装并启动了 MongoDB 服务(未开启认证状态)。
- 本地或远程可以连接到 MongoDB Shell(
mongosh或旧版mongo)。
步骤 1:连接到 MongoDB 实例
使用 MongoDB Shell 连接到目标实例(默认端口 27017):
mongosh
如果连接成功,你会看到类似 test> 的提示符。
步骤 2:创建管理员用户
切换到 admin 数据库,并创建一个具有用户管理权限的超级管理员。
use admin
// 创建一个名为 adminUser 的用户,密码为 yourStrongPassword
// 角色 userAdminAnyDatabase 允许该用户管理其他所有数据库的用户
// 角色 readWriteAnyDatabase 是可选的,赋予管理员读写所有数据库的权限(根据需求添加)
db.createUser({
user: "adminUser",
pwd: "yourStrongPassword", // 请替换为强密码
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" } // 可选
]
})
注意:密码应使用强密码,生产中避免使用简单密码。
步骤 3:启用访问控制
修改 MongoDB 配置文件(通常位于 /etc/mongod.conf 或 /usr/local/etc/mongod.conf),或者通过启动参数启用。
方法 A:修改配置文件(推荐)
找到 security 部分,添加或取消注释 authorization: enabled:
# security: security: authorization: enabled
保存文件后,重启 MongoDB 服务:
# Linux (systemd) sudo systemctl restart mongod # macOS (Homebrew) brew services restart mongodb-community
方法 B:命令行启动(临时测试)
如果你是通过命令行启动 mongod,可以在启动命令中添加 --auth 参数:
mongod --auth --port 27017 --dbpath /var/lib/mongodb
步骤 4:重新连接并验证
重启后,用管理员用户连接测试:
mongosh -u adminUser -p yourStrongPassword --authenticationDatabase admin
如果连接成功,表示访问控制已生效。
步骤 5:创建普通数据库用户(可选)
在企业应用中,通常为每个数据库或应用创建专用用户,遵循最小权限原则。
// 1. 先用管理员用户连接
// 2. 切换到目标数据库,myDatabase
use myDatabase
// 3. 创建只拥有该数据库读写权限的用户
db.createUser({
user: "appUser",
pwd: "appUserPassword",
roles: [
{ role: "readWrite", db: "myDatabase" }
]
})
这样,应用连接时只需连接 myDatabase 并使用 appUser,无法访问其他数据库。
关键注意事项
- 认证数据库(authenticationDatabase):用户的身份认证总是在其创建时所在的数据库中进行,管理员用户在
admin库创建,所以连接时需指定--authenticationDatabase admin,普通用户在myDatabase创建,连接时需指定--authenticationDatabase myDatabase。 - 先创建用户再启用认证:强烈建议在开启认证之前创建好管理员用户,如果先开启认证却没有用户,你将无法登录。
- 配置文件权限:修改配置文件后,确保 MongoDB 进程有权限读取该文件(通常文件属主应为
mongodb或root)。 - 启用 TLS/SSL(生产环境):仅启用密码认证不够安全。务必同时启用 TLS/SSL 加密,防止密码在网络传输中被窃听,MongoDB 官方文档建议
auth + TLS一起配置。 - 副本集(Replica Set):如果使用副本集,每个节点都需要启用
authorization: enabled,并且主要在admin数据库中创建密钥文件(keyfile)用于节点间内部认证,步骤略有不同:- 生成 Keyfile 并分发到所有节点。
- 在配置文件中指定
security.keyFile: /etc/mongodb-keyfile。 - 然后创建用户。
常见错误与解决
- 错误:
Authentication failed.- 原因:密码错误,或者认证数据库指定错误(例如用户建在
admin库,连接时却用了myDatabase)。 - 解决:检查连接参数,确保
--authenticationDatabase正确。
- 原因:密码错误,或者认证数据库指定错误(例如用户建在
- 错误:
MongoServerError: userNotFound- 原因:用户在指定数据库中不存在。
- 解决:确认用户在正确的数据库中。
- 忘记管理员密码怎么办?
- 解决方案:必须关闭 MongoDB 服务,禁用
authorization: enabled(或去掉--auth参数),以无认证模式启动,然后连接到数据库来修改或重置密码,操作后重新启用认证。
- 解决方案:必须关闭 MongoDB 服务,禁用
对于大多数单节点 MongoDB 部署,启用访问控制的完整流程是:
use admin→db.createUser(...)创建超级管理员。- 修改配置文件添加
security.authorization: enabled。 - 重启 MongoDB 服务。
- 用管理员登录,验证成功。
- 为每个应用创建专用的、权限最小的数据库用户。
别忘了配套启用 TLS/SSL 和 防火墙 来构建更完整的安全体系。