开启 MongoDB 访问控制 Auth 机制的核心是在配置文件中设置 security.authorization: enabled 或在启动命令中添加 `--auth` 参数,且在启用前必须先创建管理员账户。此操作适用于生产环境安全加固,风险在于若未提前创建管理员账户会导致无法登录数据库。
先说结论:开启 MongoDB 认证必须在重启服务前完成管理员账户创建,否则会导致实例无法访问。
- 先判断:确认当前实例是否已存在管理员账户,避免启用后锁死。
- 优先做:在 admin 数据库创建拥有 userAdminAnyDatabase 或 root 角色的用户。
- 再验证:使用 db.auth() 或连接字符串验证身份认证是否生效。
命令速用版
若通过命令行启动,直接添加 `--auth` 参数即可开启认证;若使用配置文件,需修改 security 段落。
mongod `--auth` `--port` 27017
配置文件 mongod.conf 修改示例:
security: authorization: enabled
为什么会这样
MongoDB 默认安装后不启用访问控制,任何连接者均可操作数据。开启 Auth 机制强制用户通过身份验证才能执行操作,防止未授权访问和数据泄露。未开启复制集的实例需先创建用户再重启带 auth 的服务,开启复制集的实例还需配置密钥文件用于内部认证。
分步处理
按照以下顺序操作可确保安全开启认证且不被锁在数据库外面。
1. 启动无认证的 MongoDB 实例:确保当前可以免密登录,例如使用 mongo `--port`=27017 连接。
2. 创建管理员用户:切换到 admin 数据库并创建拥有管理角色的用户。
use admin
db.createUser({
user: "admin",
pwd: "secure_password",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
})3. 修改配置文件开启认证:在 mongod.conf 中添加 security.authorization: enabled,注意冒号后需空一格。
4. 重启 MongoDB 服务:使用 systemctl restart mongod 或重新启动 mongod 进程使配置生效。
5. 使用认证登录:连接时指定用户名密码及认证数据库。
mongo -u admin -p secure_password `--authenticationDatabase` admin
怎么验证是否生效
通过检查授权状态参数和尝试免密登录来验证配置是否成功。
1. 检查授权状态:在 Shell 中运行命令 db.runCommand({getParameter: 1, authorization: 1}),若返回 authorization: enabled 则表示已开启。
2. 验证登录权限:尝试不使用密码连接数据库,若被拒绝则说明认证生效;使用 db.auth("admin", "secure_password") 返回 1 表示验证成功。
常见坑
操作过程中容易遇到锁死、副本集配置遗漏和网络暴露问题。
1. 未创建管理员先开启认证:若重启前未在 admin 库创建用户,重启后将无法登录,需再次关闭认证修复。
2. 副本集未配置密钥文件:开启复制集的实例执行内部认证时,必须在每个成员上部署相同的密钥文件,否则成员间无法通信。
3. 监听公网 IP:仅开启认证不足够,建议配合 bind_ip 参数限制只监听私有 IP 或本地 IP,防止公网扫描。
常见问题
忘记管理员密码怎么办
需临时关闭认证重启数据库修改密码。修改 mongod.conf 将 authorization 设为 disabled 或移除 `--auth` 参数,重启后登录修改用户密码,再重新开启认证。
应用程序连接字符串如何配置
在 MongoDB URI 中加入用户名密码及认证数据库信息。格式为 mongodb://username:password@host:port/database?authSource=admin,确保 authSource 指向用户创建的数据库。
参考来源
- MongoDB 开启用户认证
- JN_0006:MongoDB 未授权访问漏洞处理
- mongodb 用户认证管理
- mongodb 开启 auth
- Mongo(2): MongoDB 权限认证实战——从零配置用户角色与访问控制
- mongodb 如何开启访问控制
- 配置 MongoDB 身份验证和授权