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

将自托管分片集群更新到密钥文件认证

本页内容

  • 概述
  • 注意事项
  • 开始之前
  • 步骤
  • x.509 内部认证

在分片集群上强制执行访问控制需要配置分片集群需要配置

对于本教程,分片集群的每个成员必须使用相同的内部认证机制和设置。这意味着在每个mongosmongod上强制执行内部认证。

以下教程使用密钥文件启用内部认证。

强制执行内部认证也强制执行用户访问控制。要连接到副本集,客户端如mongosh 需要使用一个 用户账户。请参阅访问控制。

如果 Cloud Manager 或 Ops Manager 正在管理您的部署,则内部身份验证将自动强制执行。

要配置受管理部署的访问控制,请参阅:为 MongoDB 部署配置访问控制,在Cloud Manager 手册Ops Manager 手册中。

重要

为了避免因 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企业版)。

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

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

通常,要为分片集群创建用户,请连接到mongos并添加分片集群用户。

但是,某些维护操作需要直接连接到分片集群中的特定分片。执行这些操作时,您必须直接连接到分片并作为分片本地管理用户进行认证。

分片本地用户仅在特定分片中存在,应仅用于分片特定的维护和配置。您无法使用分片本地用户连接到mongos

有关更多信息,请参阅自管理部署中的用户安全文档。

将分片集群升级以强制执行访问控制需要停机时间。

从 MongoDB 8.0 版本开始,您可以使用 directShardOperations 角色来执行需要直接对分片执行命令的维护操作。

警告

使用 directShardOperations 角色运行命令可能会导致您的集群停止正常工作,并可能导致数据损坏。仅将 directShardOperations 角色用于维护目的或MongoDB 支持的指导下。完成维护操作后,停止使用 directShardOperations 角色。

1

使用密钥文件认证,分片集群中的每个 mongodmongos 实例都将密钥文件的内容作为共享密码来验证集群中的其他成员。只有具有正确密钥文件的 mongodmongos 实例才能加入分片集群。

注意

内部成员身份认证的密钥文件 使用 YAML 格式以允许在密钥文件中存在多个密钥。YAML 格式接受以下任一格式:

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

  • 密钥字符串序列

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

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

注意

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

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

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

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

2

每个托管 mongodmongos 组件的碎片化集群的服务器都必须包含一个密钥文件的副本。

将密钥文件复制到每个托管碎片化集群成员的服务器。确保运行 mongodmongos 实例的用户是该文件的拥有者并且可以访问密钥文件。

避免在可以轻易从托管 mongodmongos 实例的硬件上断开的存储介质上存储密钥文件,例如U盘或网络附加存储设备。

3

mongosh 连接到一个 mongos

sh.stopBalancer()

如果正在进行迁移,均衡器可能不会立即停止。使用 sh.stopBalancer() 方法将阻止shell直到均衡器停止。

从MongoDB 6.0.3开始,不再执行自动分块分割。这是因为平衡策略的改进。自动分割命令仍然存在,但不执行操作。

在MongoDB 6.0.3之前的版本中,sh.stopBalancer() 还会禁用碎片化集群的自动分割。

使用 sh.getBalancerState() 验证均衡器是否已停止。

sh.getBalancerState()

重要

在均衡器停止运行之前不要继续。

有关配置碎片化集群均衡器行为的教程,请参阅 管理碎片化集群均衡器

4

连接 mongosh 到每个 mongos 并关闭它们。

使用 db.shutdownServer() 方法在 admin 数据库上安全关闭 mongos

db.getSiblingDB("admin").shutdownServer()

重复操作,直到集群中所有 mongos 实例都离线。

完成此步骤后,集群中所有 mongos 实例都应离线。

5

连接 mongosh 到配置服务器部署中的每个 mongod 并关闭它们。

对于复制集配置服务器部署,最后关闭主成员。

使用 db.shutdownServer() 方法在 admin 数据库上安全关闭 mongod

db.getSiblingDB("admin").shutdownServer()

重复操作,直到所有配置服务器都离线。

6

对于每个分片副本集,连接 mongosh 到副本集中的每个 mongod 成员并关闭它们。最后关闭 成员。

使用 db.shutdownServer() 方法在 admin 数据库上安全关闭 mongod

db.getSiblingDB("admin").shutdownServer()

对每个分片副本集重复此步骤,直到所有分片副本集中的 mongod 实例都离线。

完成此步骤后,整个分片集群应离线。

7

启动配置服务器副本集中的 每个 mongod。包括 keyFile 设置。该 keyFile 设置强制执行 自我管理内部/成员身份验证自我管理部署中的基于角色的访问控制。

您可以通过配置文件或命令行指定 mongod 设置。

配置文件

如果使用配置文件,对于配置服务器副本集,将 配置文件 中的 security.keyFile 设置为密钥文件的路径,将 sharding.clusterRole 设置为 configsvr,并将 replication.replSetName 设置为配置服务器副本集的名称。

security:
keyFile: <path-to-keyfile>
sharding:
clusterRole: configsvr
replication:
replSetName: <setname>
storage:
dbpath: <path>

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

通过指定 --config 选项和配置文件路径来启动 mongod

mongod --config <path-to-config>

命令行

如果使用命令行参数,对于配置服务器副本集,使用 -keyFile--configsvr--replSet 参数启动 mongod

mongod --keyFile <path-to-keyfile> --configsvr --replSet <setname> --dbpath <path>

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

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

在重新启动每个成员时,请确保使用原始的副本集名称。您不能更改副本集的名称。

8

使用带有 keyFile 参数的 mongod 强制执行 自管理内部/成员身份验证自管理部署中的基于角色的访问控制

使用配置文件或命令行启动副本集中的每个 mongod

配置文件

如果使用配置文件,将 配置文件 中的 security.keyFile 选项设置为密钥文件的路径,并将 replication.replSetName 选项设置为 原始 副本集名称。

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <setname>
storage:
dbPath: <path>

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

通过指定 --config 选项和配置文件路径来启动 mongod

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

命令行

如果使用命令行参数,启动 mongod 并指定 --keyFile--replSet 参数。

mongod --keyfile <path-to-keyfile> --replSet <setname> --dbpath <path>

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

有关启动参数的更多信息,请参阅 mongod 参考页面。

在重新启动每个成员时,请确保使用原始的副本集名称。您不能更改副本集的名称。

重复此步骤,直到集群中所有分片都上线。

9

重要

自托管部署中的 Localhost 异常 允许通过 localhost 接口连接的客户端在强制访问控制的 mongod 上创建用户。创建第一个用户后,自托管部署中的 Localhost 异常 将关闭。

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

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

对于集群中的每个分片副本集,通过 mongosh 连接到 主节点 的 localhost 接口。您必须在与目标 mongod 相同的机器上运行 mongosh 以使用 localhost 接口。

admin 数据库上创建一个具有 userAdminAnyDatabase 角色的用户。此用户可以根据需要为分片副本集创建其他用户。创建此用户还会关闭自托管部署中的 Localhost 异常。

以下示例在admin数据库上创建了分片本地用户fred

重要

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

提示

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

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

使用带有 keyFile 参数的 mongod 强制执行 自管理内部/成员身份验证自管理部署中的基于角色的访问控制

使用配置文件或命令行启动副本集中的每个mongos

配置文件

如果使用配置文件,请将security.keyFile设置为密钥文件的路径,并将sharding.configDB设置为副本集名称以及至少一个副本集成员的路径,格式为<replSetName>/<host:port>

security:
keyFile: <path-to-keyfile>
sharding:
configDB: <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

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

指定--config选项和配置文件路径来启动mongos

mongos --config <path-to-config-file>

命令行

如果使用命令行参数,请指定--keyFile--configdb参数来启动mongos

mongos --keyFile <path-to-keyfile> --configdb <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

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

到此为止,整个分片集群已重新上线,并可以使用指定的密钥文件进行内部通信。然而,外部程序如mongosh需要使用正确配置的用户才能读取或写入集群。

11

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

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

12

重要

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

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

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

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

重要

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

以下示例在 admin 数据库中创建用户 fred

提示

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

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

有关内置角色及其与数据库管理操作相关的完整列表,请参阅 数据库用户角色

13

使用 db.auth() 以用户管理员身份进行身份验证以创建其他用户

提示

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

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

按提示输入密码。

或者,使用 -u <username>-p <password>--authenticationDatabase "admin" 参数连接到目标副本集成员的新 mongosh 会话。您必须使用 Localhost Exception in Self-Managed Deployments 来连接到 mongos

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

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

14

集群管理员用户拥有分片集群的 clusterAdmin 角色,而不是分片本地集群管理员。

以下示例在 admin 数据库上创建用户 ravi

重要

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

提示

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

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

有关与副本集和分片集群操作相关的内置角色的完整列表,请参阅 Cluster Administration Roles

15

要执行分片操作,请使用以下方法之一以 clusterAdmin 用户身份进行身份验证:db.auth() 方法或带有 usernamepasswordauthenticationDatabase 参数的新 mongosh 会话。

注意

这是分片集群的集群管理员,而不是 碎片本地集群管理员。

16

启动均衡器。

sh.startBalancer()

从MongoDB 6.0.3开始,不再执行自动分块分割。这是因为平衡策略的改进。自动分割命令仍然存在,但不执行操作。

在 MongoDB 6.0.3 之前的版本中,sh.startBalancer() 还会为分片集群启用自动拆分。

使用 sh.getBalancerState() 验证均衡器是否已启动。

有关分片集群均衡器的教程,请参阅 管理分片集群均衡器

17

创建用户以便客户端可以连接并访问分片集群。有关可用的内置角色,例如 数据库用户角色,请参阅 readreadWrite。您可能还需要额外的管理员用户。有关用户的信息,请参阅 自管理部署中的用户

要创建额外的用户,您必须以具有 userAdminAnyDatabaseuserAdmin 角色的用户身份进行认证。

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

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

返回

部署分片集群