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

使用密钥文件身份验证部署自管理的分片集群

本页内容

  • 概述
  • 注意事项
  • 开始之前
  • 使用密钥文件访问控制部署分片集群
  • 下一步
  • x.509 内部身份验证

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

  • 集群组件之间的安全,使用 内部身份验证。

  • 连接客户端与集群之间的安全,使用 用户访问控制。

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

以下教程使用 密钥文件启用内部身份验证。

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

如果您正在使用 Cloud Manager 或 Ops Manager 管理您的部署,请参阅相应的 Cloud Manager 手册Ops Manager 手册 以强制执行身份验证。

重要

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

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

MongoDB 二进制文件,mongodmongos,默认绑定到 localhost

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

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

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

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

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

然而,一些维护操作需要直接连接到分片集群中的特定分片。要执行这些操作,您必须直接连接到分片并作为分片本地管理员用户进行身份验证。

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

本教程需要创建分片集群用户,但包括添加分片本地用户的可选步骤。

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

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

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

警告

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

以下过程涉及创建一个新的由mongos、配置服务器和两个分片组成的新分片集群。

重要

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

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

使用密钥文件认证,每个密钥文件认证的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>

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

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

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

以下步骤部署配置服务器副本集。

对于生产部署,部署至少有三个成员的配置服务器副本集。出于测试目的,您可以创建单个成员的副本集。

1

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

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

配置文件

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

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

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

使用 --config 选项和配置文件的路径启动 mongod

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

命令行

如果使用命令行参数,请使用mongod启动程序,并带上--keyFile--configsvr--replSet参数。

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

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

2

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

localhost接口仅在尚未为部署创建用户时可用。创建第一个用户后,localhost接口会关闭。

3

rs.initiate()方法启动副本集,并可以接受一个可选的副本集配置文档。在副本集配置文档中包含:

  • _id。该_id必须与传递给mongod--replSet参数匹配。

  • members 字段。该 members 字段是一个数组,并为副本集的每个成员需要指定一个文档。

  • configsvr 字段。对于配置服务器副本集,必须将 configsvr 字段设置为 true

有关副本集配置文档的更多信息,请参阅自管理副本集配置

使用 rs.initiate() 方法和一个配置文档来初始化副本集。

rs.initiate(
{
_id: "myReplSet",
configsvr: true,
members: [
{ _id : 0, host : "cfg1.example.net:27019" },
{ _id : 1, host : "cfg2.example.net:27019" },
{ _id : 2, host : "cfg3.example.net:27019" }
]
}
)

一旦配置服务器副本集(CSRS)启动并运行,继续创建分片副本集。

对于生产部署,应使用至少包含三个成员的副本集。出于测试目的,您可以创建一个单成员副本集。

以下步骤包括添加分片本地用户的可选程序。现在执行它们确保每个分片都有用户来执行分片级维护。

1

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

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

配置文件

如果使用配置文件,将 security.keyFile 选项设置为密钥文件的路径,将 replication.replSetName 设置为副本集的期望名称,将 sharding.clusterRole 选项设置为 shardsvr

security:
keyFile: <path-to-keyfile>
sharding:
clusterRole: shardsvr
replication:
replSetName: <replSetName>
storage:
dbPath: <path>

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

使用 --config 选项和配置文件的路径启动 mongod

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

命令行

如果使用命令行选项,在启动组件时指定 --keyFilereplSet--shardsvr 参数,例如以下示例

mongod --keyFile <path-to-keyfile> --shardsvr --replSet <replSetName> --dbpath <path>

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

2

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

localhost接口仅在尚未为部署创建用户时可用。创建第一个用户后,localhost接口会关闭。

3

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

rs.initiate() 可以接受一个可选的 replica set configuration document。在 replica set configuration document 中包含

以下示例启动一个包含三个成员的副本集。

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

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

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

4

重要

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

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

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

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

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

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

重要

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

提示

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

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

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

5

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 将提示输入密码。

6

分片本地集群管理员用户具有 clusterAdmin 角色,该角色提供允许访问复制操作的权限。

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

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

提示

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

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

根据提示输入密码。

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

1

使用配置文件或命令行参数指定密钥文件来启动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>

命令行

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

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

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

2

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

localhost接口仅在尚未为部署创建用户时可用。创建第一个用户后,localhost接口会关闭。

3

重要

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

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

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

使用 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" } ]
}
)

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

4

使用 db.auth() 以用户管理员身份进行认证以创建更多用户

提示

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

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

根据提示输入密码。

或者,使用 -u <username>-p <password>--authenticationDatabase "admin" 参数连接到目标副本集成员的新 mongosh 会话。您必须使用 自托管部署中的本地主机异常 来连接到 mongos

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

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

5

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

admin 数据库中创建一个 clusterAdmin 用户。

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

重要

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

提示

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

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

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

6

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

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

要继续操作,您必须连接到 mongos 并以分片集群的管理员用户身份进行身份验证。

注意

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

要将每个分片添加到集群,请使用 sh.addShard() 方法。如果分片是副本集,请指定副本集的名称并指定集的一个成员。在生产部署中,所有分片都应该是副本集。

以下操作将单个分片副本集添加到集群

sh.addShard( "<replSetName>/s1-mongo1.example.net:27017")

以下操作是向集群添加独立 mongod 分片的示例

sh.addShard( "s1-mongo1.example.net:27017")

重复这些步骤,直到集群包含所有分片。此时,分片集群将执行集群访问控制和每个分片集群组件之间的内部通信。

要继续操作,您必须连接到 mongos 并以分片集群的管理员用户身份进行身份验证。

注意

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

要分片集合,请使用 sh.shardCollection() 方法。您必须指定集合的完整命名空间和包含分片键的文档。

您选择的分片键会影响分片效率以及您利用某些分片功能(如 区域)的能力。请参阅“选择分片键”中列出的选择考虑因素。

如果集合已包含数据,您必须在使用 sh.shardCollection() 之前,使用 db.collection.createIndex() 方法在 分片键 上创建索引。

如果集合为空,MongoDB 在 sh.shardCollection() 的过程中创建索引。

以下是一个 sh.shardCollection() 方法的示例

sh.shardCollection("<database>.<collection>", { <key> : <direction> } )

创建用户以允许客户端连接到并交互使用分片集群。

有关创建只读和读写用户的基本内置角色的信息,请参阅 数据库用户角色

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

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

提示

另请参阅

返回

更新副本集(无停机时间)