以下流程在独立运行的 mongod 实例上配置 SCRAM 客户端身份验证。
若要为副本集或分片集群使用 SCRAM,见“使用密钥文件身份验证部署自管理副本集”。
重要
同一个用户不能同时使用 SCRAM 和另一种身份验证类型。
操作流程
在未启用访问控制的情况下启动 MongoDB
启动一个未启用访问控制的独立 mongod 实例。
打开终端,以 mongod 用户身份执行以下命令:
mongod --port 27017 --dbpath /var/lib/mongodb
本教程中的 mongod 实例使用端口 27017 和 /var/lib/mongodb 数据目录。
教程假定 /var/lib/mongodb 目录已经存在,且是默认 dbPath。可以按需要指定其他数据目录或端口。
提示
mongod 启动时会在 /var/lib/mongodb 中创建一些系统文件。为确保这些文件的所有者正确,请以 mongod 用户身份完成教程。如果以 root 身份启动,之后还需要修正文件所有权。
连接实例
打开新终端,使用 mongosh 连接部署:
mongosh --port 27017
如果连接其他部署,请根据需要添加 --host 等命令行选项。
创建用户管理员
重要
本机例外机制
可以在启用访问控制之前或之后创建用户管理员。如果尚未创建任何用户就启用了访问控制,MongoDB 会提供本机例外机制,允许从本机连接并在 admin 数据库中创建用户管理员。创建后,必须以该管理员身份验证,才能继续创建其他用户。
在 mongosh 中:
切换到 admin 数据库。
添加 myUserAdmin 用户,并授予 userAdminAnyDatabase 和 readWriteAnyDatabase 角色:
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: passwordPrompt(), // or cleartext password
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
提示
passwordPrompt() 会提示输入密码。虽然也可以直接把密码写成字符串,但建议使用 passwordPrompt(),避免密码出现在屏幕上,或泄露到 shell 历史记录中。
userAdminAnyDatabase 角色允许用户:
创建用户。
授予或撤销用户的角色。
创建或修改自定义角色。
可以根据需要,为用户分配其他内置角色或自定义角色。
创建用户的数据库就是其身份验证数据库,本例为 admin。虽然用户需要向该数据库进行身份验证,但可以在其他数据库中拥有角色;身份验证数据库不会限制用户权限的作用范围。
启用访问控制并重新启动 MongoDB
关闭 mongod 实例。在 mongosh 中执行以下命令:
db.adminCommand( { shutdown: 1 } )
退出 mongosh。
以启用访问控制的方式启动 mongod。
如果从命令行启动 mongod,添加
--auth选项:mongod --auth --port 27017 --dbpath /var/lib/mongodb如果使用配置文件启动 mongod,添加 security.authorization 设置:
security: authorization: enabled
此后,连接该实例的客户端必须进行身份验证,且只能执行所分配角色允许的操作。
重要
本机例外机制
可以在启用访问控制之前或之后创建用户。如果尚未创建任何用户就启用了访问控制,MongoDB 会提供本机例外机制,允许在 admin 数据库中创建用户管理员。创建后,必须先以用户管理员身份验证,才能创建其他用户。
以用户管理员身份连接并验证
使用 mongosh 时,可以选择以下方式:
启动 mongosh 时添加 -u <username>、-p 和 --authenticationDatabase <database> 命令行选项:
mongosh --port 27017 --authenticationDatabase \
"admin" -u "myUserAdmin" -p
在提示出现时输入密码。
或者先使用 mongosh 连接数据库部署:
mongosh --port 27017
然后在 mongosh 中切换到身份验证数据库,本例为 admin,再通过 db.auth(<username>, <pwd>) 验证:
use admin
db.auth("myUserAdmin", passwordPrompt()) // or cleartext password
提示
passwordPrompt() 会提示输入密码。虽然也可以直接以字符串指定密码,但建议使用 passwordPrompt(),避免密码显示在屏幕上,或泄露到 shell 历史记录中。
在提示出现时输入密码。
后续步骤
若要为副本集或分片集群使用 SCRAM,见“使用密钥文件身份验证部署自管理副本集”。
原文:Use SCRAM to Authenticate Clients on Self-Managed Deployments。作者/来源:MongoDB 文档团队。本文依据所列原文整理为中文,代码、命令与配置示例保留原文。











暂无评论内容