Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

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

在此页面上

  • Overview
  • Considerations
  • 使用密钥文件访问控制来部署新副本集
  • x.509 内部身份验证

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

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

实施内部身份验证还可执行用户访问控制。要连接到副本集,像 mongosh 这样的客户端需要使用用户账户。请参阅用户和身份验证机制。

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

重要

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

在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。

leafygreen-ui-tqgtuileafygreen-ui-tqgtui,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --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 到 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

通过本地主机接口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

重要

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

第一个用户必须拥有创建其他用户的特权,如具备 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身份验证。

后退

内部资料