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

使用密钥文件身份验证部署自托管复制集

本页内容

  • 概述
  • 注意事项
  • 使用密钥文件访问控制部署新复制集
  • x.509 内部身份验证

在副本集上实施访问控制副本集需要配置

对于本教程,副本集的每个成员使用相同的内部身份验证机制和设置。

实施内部身份验证也会实施用户访问控制。要连接到副本集,客户端如mongosh需要使用用户账户。见用户和身份验证机制。

如果您目前正在使用或计划使用云管理器或操作管理器,请参阅云管理器手册操作管理器手册以实施访问控制。

重要

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

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

mongodmongos 默认绑定到本地主机。如果您的部署成员在不同的主机上运行,或者您希望远程客户端连接到您的部署,您必须指定 --bind_ipnet.bindIp

本教程主要涉及 mongod 进程。Windows 用户应使用 mongod.exe 程序。

由于密钥文件在可管理性和密码学强度方面的局限性,我们建议仅在测试和开发环境中使用密钥文件。对于生产环境,我们强烈建议使用 x.509 证书。虽然密钥文件可以在特定的、受控的场景中保持安全,但在复杂的部署中,它们会带来可扩展性和管理方面的挑战。x.509 证书提供了更强大的安全功能,支持更好的密钥管理,支持个体认证,并遵循行业标准以确保敏感数据保护。

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

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

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

重要

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

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

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

对于副本集中的每个成员,使用 mongodsecurity.keyFile 配置文件设置或 --keyFile 命令行选项启动。使用 --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 参考页面。

4

mongosh 连接到本地主机接口上的任意一个 mongod 实例。您必须在与 mongod 实例相同的物理机器上运行 mongosh

本地主机接口仅在部署中未创建用户时才可用。创建第一个用户后,本地主机接口将关闭。

5

mongosh 中,运行 rs.initiate() 方法。

rs.initiate() 可以接受一个可选的 副本集配置文档。在 副本集配置文档 中,包括

以下示例初始化一个包含三个成员的副本集。

重要

在副本集的 单个 mongod 实例上运行 rs.initiate()

重要

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

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

rs.initiate(
{
_id : "myReplSet",
members: [
{ _id : 0, host : "mongo1.example.net:27017" },
{ _id : 1, host : "mongo2.example.net:27017" },
{ _id : 2, host : "mongo3.example.net:27017" }
]
}
)

rs.initiate() 触发一次 选举 并从成员中选出一个作为 主节点

在继续之前连接到主节点。使用 rs.status() 定位主节点成员。

6

重要

创建第一个用户后,将不再存在 localhost 异常

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

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

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

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

以下示例创建名为 fred 的用户,并在 admin 数据库上赋予其 userAdminAnyDatabase 角色。

重要

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

提示

您可以使用与各种用户身份验证管理方法和命令结合使用的 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 身份验证

返回

内部