Docs 菜单

Docs 主页开发应用程序MongoDB Manual

使用密钥文件身份验证部署副本集

在此页面上

  • 概述
  • 考虑因素
  • 使用密钥文件访问控制来部署新副本集
  • x.509 内部身份验证

副本集上执行访问控制需要配置:

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

实施内部身份验证还可实施用户访问控制。要连接到副本集, mongosh等客户端需要使用用户帐户。请参阅用户和身份验证机制。

如果您当前正在使用或计划使用 Cloud Manager 或 Ops Manager,请参阅Cloud Manager 手册Ops Manager 手册以了解如何实施访问控制。

重要

要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。

使用主机名而不是 IP 地址在分割网络范围内配置集群。从 MongoDB 5开始。 0 ,仅配置了 IP 地址的节点未通过启动验证,因此不会启动。

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

本教程主要介绍 mongod 流程。Windows 用户应改用 mongod.exe 程序。

密钥文件是最低限度的安全手段,也最适合测试或开发环境。对于生产环境,建议使用 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 实例才能加入副本集。

注意

从 MongoDB 4.2 开始,用于内部成员身份验证的密钥文件使用 YAML 格式,允许密钥文件中有多个密钥。YAML 格式接受:

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

  • 键字符串序列

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

密钥的长度必须介于 6 到 1,024 个字符之间,且只能包含 base64 集合中的字符。复制集的所有成员均须至少共享一个公钥。

注意

在 UNIX 系统上,密钥文件不得具有群组或全局权限。在 Windows 系统中,不检查密钥文件权限。

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

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

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

2

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

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

3

对于副本集中的每个节点,使用 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 参考页面。

4

通过 本地主机接口mongoshmongod 将 连接到 实例之一。您必须在与 实例相同的物理机器上运行mongosh mongod

只有当尚未为部署创建任何用户,本地主机接口才可用。本地主机接口会在创建第一个用户后关闭。

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

重要

创建第一个用户后,本地主机异常就不再可用。

第一个用户必须拥有创建其他用户的特权,如具备 userAdminAnyDatabase 的用户。这样可以确保在本地主机异常关闭后,您可以创建更多用户。

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

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

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

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

重要

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

提示

mongo shell 的 4.2 版开始,您可以将 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

提示

mongo shell 的 4.2 版开始,您可以将 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 角色:

提示

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

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

根据提示输入密码。

请参阅集群管理角色,获取与副本集和分片集群操作相关的内置角色的完整清单。

9

创建用户,允许客户端与副本集连接和交互。参阅数据库用户角色,了解创建只读和读写用户时使用的基本内置橘色。

您可能还需要其他管理用户。有关用户的更多信息,请参阅用户。

有关使用 x.509 进行内部身份验证的详情,请参阅使用 x.509 证书进行成员身份验证

要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证

← 内部/成员身份验证