在自管理 MongoDB 部署中使用 SCRAM 验证客户端

以下流程在独立运行的 mongod 实例上配置 SCRAM 客户端身份验证。

若要为副本集或分片集群使用 SCRAM,见“使用密钥文件身份验证部署自管理副本集”。

重要

同一个用户不能同时使用 SCRAM 和另一种身份验证类型。

1

启动一个未启用访问控制的独立 mongod 实例。

打开终端,以 mongod 用户身份执行以下命令:

mongod --port 27017 --dbpath /var/lib/mongodb

本教程中的 mongod 实例使用端口 27017 和 /var/lib/mongodb 数据目录。

教程假定 /var/lib/mongodb 目录已经存在,且是默认 dbPath。可以按需要指定其他数据目录或端口。

提示

mongod 启动时会在 /var/lib/mongodb 中创建一些系统文件。为确保这些文件的所有者正确,请以 mongod 用户身份完成教程。如果以 root 身份启动,之后还需要修正文件所有权。

2

打开新终端,使用 mongosh 连接部署:

mongosh --port 27017

如果连接其他部署,请根据需要添加 --host 等命令行选项。

3

重要

本机例外机制

可以在启用访问控制之前或之后创建用户管理员。如果尚未创建任何用户就启用了访问控制,MongoDB 会提供本机例外机制,允许从本机连接并在 admin 数据库中创建用户管理员。创建后,必须以该管理员身份验证,才能继续创建其他用户。

在 mongosh 中:

  1. 切换到 admin 数据库。

  2. 添加 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。虽然用户需要向该数据库进行身份验证,但可以在其他数据库中拥有角色;身份验证数据库不会限制用户权限的作用范围。

4

关闭 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 数据库中创建用户管理员。创建后,必须先以用户管理员身份验证,才能创建其他用户。

5

使用 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 文档团队。本文依据所列原文整理为中文,代码、命令与配置示例保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容