使用 SCRAM 对自管理部署上的客户端进行身份验证
以下步骤将为在独立运行的 mongod
实例上进行客户端身份验证设置 SCRAM。
要对副本集或分片集群使用 SCRAM 身份验证,请参阅使用密钥文件身份验证部署自管理副本集。
重要
You cannot use both SCRAM authentication and another authentication type for the same user.
步骤
在没有访问控制的情况下启动 MongoDB
在没有访问控制的情况下,启动独立运行的 mongod
实例。
打开终端并以 mongod
用户的身份运行以下命令:
mongod --port 27017 --dbpath /var/lib/mongodb
本教程中的 mongod
实例使用 port 27017
和 /var/lib/mongodb
数据目录。
本教程假定 /var/lib/mongodb
目录已存在,并且是默认的 dbPath
。您可以根据需要指定其他数据目录或端口。
创建用户管理员
重要
本地主机异常
在启用访问控制前后都能创建用户管理员。如果您先启用访问控制,再创建用户,MongoDB 会提供本地主机例外,允许您在 admin
数据库中创建用户管理员。创建后,您必须以用户管理员身份进行身份验证才能创建其他用户。
使用 mongosh
:
切换到
admin
数据库并添加具有
userAdminAnyDatabase
和
readWriteAnyDatabase
角色的myUserAdmin
用户”:
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
,您可以
使用 -u
<username>
、-p
和 --authenticationDatabase <database>
命令行选项启动 mongosh
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 身份验证,请参阅使用密钥文件身份验证部署自管理副本集。