如何开启 MongoDB 访问控制 Auth 机制防止未授权访问

文章导读
开启 MongoDB 访问控制 Auth 机制的核心是在配置文件中设置 security.authorization: enabled 或在启动命令中添加 `--auth` 参数,且在启用前必须先创建管理员账户。此操作适用于生产环境安全加固,风险在于若未提前创建管理员账户会导致无法登录数据库。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

开启 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. 使用认证登录:连接时指定用户名密码及认证数据库。

如何开启 MongoDB 访问控制 Auth 机制防止未授权访问
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 身份验证和授权