文档菜单
文档首页
/
MongoDB 手册
/ / / /

将自托管副本集更新为密钥文件身份验证

本页内容

  • 概述
  • 注意事项
  • 在现有副本集中强制执行密钥文件访问控制
  • x.509 内部认证

在现有副本集上强制执行访问控制需要配置

  • 使用内部认证的副本集成员之间的安全性,以及

  • 连接客户端和副本集之间的安全性使用用户访问控制。

在本教程中,副本集的每个成员使用相同的内部认证机制和设置。

强制执行内部认证也强制执行用户访问控制。要连接到副本集,客户端如mongosh需要使用用户帐户。见用户。

如果云管理器或运维管理器正在管理您的部署,请参阅云管理器手册运维管理器手册以强制执行访问控制。

重要

为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤其重要。

在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0版本开始,仅配置了IP地址的节点将无法通过启动验证,并且不会启动。

MongoDB的二进制程序,mongodmongos,默认绑定到localhost

本教程使用mongod程序。Windows用户应使用mongod.exe程序。

密钥文件是最低级别的安全形式,最适合测试或开发环境。对于生产环境,我们建议使用x.509证书

本教程介绍了仅在admin数据库中创建最小数量的管理用户。对于用户身份验证,教程使用默认的SCRAM身份验证机制。挑战-响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509证书自托管LDAP代理身份验证(仅适用于MongoDB企业版)或自托管部署上的Kerberos身份验证(仅适用于MongoDB企业版)。

有关创建特定身份验证机制用户的详细信息,请参阅特定身份验证机制页面。

有关用户创建和管理最佳实践,请参阅➤ 配置基于角色的访问控制

以下执行访问控制的程序需要停机。对于不需要停机的程序,请参阅将自管理副本集更新为密钥文件身份验证(无停机)

1

使用密钥文件身份验证,副本集中的每个mongod实例使用密钥文件的内容作为共享密码来验证部署中的其他成员。只有具有正确密钥文件的mongod实例才能加入副本集。

注意

内部成员身份验证的密钥文件使用 YAML 格式,允许在密钥文件中包含多个密钥。YAML 格式接受以下两种方式:

  • 单个密钥字符串(与早期版本相同)

  • 密钥字符串序列

YAML 格式与使用文本文件格式的现有单密钥密钥文件兼容。

密钥长度必须在 6 到 1024 个字符之间,且只能包含 base64 集中的字符。副本集的所有成员必须共享至少一个共同密钥。

注意

在 UNIX 系统上,密钥文件不应具有组或世界权限。在 Windows 系统上,不检查密钥文件权限。

您可以使用任何您选择的方法生成密钥文件。例如,以下操作使用 openssl 生成一个复杂的伪随机 1024 个字符字符串,用作共享密码。然后使用 chmod 修改文件权限,仅允许文件所有者读取文件

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

有关使用密钥文件的详细信息和要求,请参阅 密钥文件

2

将密钥文件复制到托管副本集成员的服务器。确保运行 mongod 实例的用户是该文件的所有者并可以访问密钥文件。

请避免将密钥文件存储在可以轻松从托管 mongod 实例的硬件断开连接的存储介质上,例如 USB 驱动器或网络附加存储设备。

3

从副本集中的次要节点开始,关闭每个mongod。继续直到所有副本集成员都离线,包括任何仲裁者。必须先关闭主节点,以避免潜在的回滚。

要关闭mongod,使用mongosh连接到每个mongod,并在admin数据库上运行db.shutdownServer()

use admin
db.shutdownServer()

此步骤结束时,所有副本集成员应该都处于离线状态。

4

使用security.keyFile配置文件设置或--keyFile命令行选项重新启动副本集中的每个mongod。使用--keyFile命令行选项或security.keyFile配置文件设置运行mongod将强制执行自我管理内部/成员身份验证以及自我管理部署中的基于角色的访问控制

如果使用配置文件,设置

根据需要包含额外的配置选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员运行在不同的主机上,请指定 net.bindIp 设置。

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>
net:
bindIp: localhost,<hostname(s)|ip address(es)>

使用配置文件启动 mongod

mongod --config <path-to-config-file>

有关配置文件的更多信息,请参阅 配置选项。

如果使用命令行选项,请使用以下选项启动 mongod

  • --keyFile 设置为密钥文件的路径,并且

  • --replSet 设置为副本集名称。

根据需要包含额外的配置选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员运行在不同的主机上,请指定 --bind_ip

mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> --bind_ip localhost,<hostname(s)|ip address(es)>

重要

为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤其重要。

在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0版本开始,仅配置了IP地址的节点将无法通过启动验证,并且不会启动。

有关命令行选项的更多信息,请参阅 mongod 参考页面。

5

mongosh 连接到 mongod 实例之一,通过 localhost 接口。您必须在与 mongod 实例相同的物理机上运行 mongosh

使用 rs.status() 来识别 主节点 的副本集成员。如果您连接到了主节点,请继续下一步。如果没有,请通过 localhost 接口mongosh 连接到主节点。

重要

在继续之前,您必须连接到主节点。

6

重要

创建第一个用户后,localhost 异常 将不再可用。

第一个用户必须具有创建其他用户的权限,例如具有 userAdminAnyDatabase 角色的用户。这确保了在 自托管部署中的本地主机异常 关闭后,您可以创建其他用户。

如果至少有一个用户没有创建用户的权限,一旦本地主机异常关闭,您可能无法创建或修改具有新权限的用户,因此可能无法访问必要的操作。

使用 db.createUser() 方法添加用户。该用户应在 admin 数据库上至少具有 userAdminAnyDatabase 角色。

您必须连接到 主节点 才能创建用户。

以下示例在admin数据库上创建具有userAdminAnyDatabase角色的用户fred

重要

密码应该是随机的、长的且复杂的,以确保系统安全并防止或延迟恶意访问。

提示

您可以使用passwordPrompt()方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo shell版本中那样直接指定密码。

admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

当提示时输入密码。有关与数据库管理操作相关的所有内置角色的完整列表,请参阅数据库用户角色

7

认证到admin数据库。

mongosh中,使用db.auth()进行认证。例如,以下以用户管理员fred进行认证:

提示

您可以使用passwordPrompt()方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo shell版本中那样直接指定密码。

db.getSiblingDB("admin").auth("fred", passwordPrompt()) // or cleartext password

或者,使用-u <username>-p <password>--authenticationDatabase参数连接一个新的mongosh实例到主副本集成员。

mongosh -u "fred" -p --authenticationDatabase "admin"

如果您没有指定命令行选项-p的密码,mongosh会提示您输入密码。

8

集群管理员用户拥有 clusterAdmin 角色,该角色授予了对复制操作的访问权限。

admin 数据库中创建集群管理员用户并分配 clusterAdmin 角色。

提示

您可以使用passwordPrompt()方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo shell版本中那样直接指定密码。

db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)

按提示输入密码。

有关与副本集操作相关的所有内置角色的完整列表,请参阅 集群管理角色

9

创建用户以允许客户端连接并交互副本集。有关创建只读和读写用户的基本内置角色,请参阅 数据库用户角色

您可能还需要其他管理用户。有关用户的信息,请参阅 自管理部署中的用户

有关使用 x.509 进行内部认证的详细信息,请参阅使用 x.509 证书进行自管理 MongoDB 的成员身份认证。

要从密钥文件内部认证升级到 x.509 内部认证,请参阅将自管理 MongoDB 从密钥文件认证升级到 x.509 认证。

返回

部署副本集