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

更新自托管分片集群到密钥文件身份验证(无中断)

本页内容

  • 概述
  • 注意事项
  • 开始之前
  • 在现有分片集群上强制实施密钥文件访问控制
  • x.509 证书内部身份验证

重要

以下过程适用于使用 MongoDB 3.4 或更高版本的分片集群。

MongoDB 的早期版本不支持无停机升级。对于使用 MongoDB 早期版本的分片集群,请参阅将自管理的分片集群更新到密钥文件认证.

MongoDB 分片集群可以强制执行 用户认证 以及其组件的 内部认证,以防止未经授权的访问。

以下教程描述了使用 security.transitionToAuth 将现有分片集群转换为强制执行认证而无需停机的过程。

在尝试本教程之前,请熟悉本文件的全部内容。

如果您使用云管理器或运维管理器来管理您的部署,请参阅云管理器手册运维管理器手册,以强制执行身份验证。

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

本教程配置了使用SCRAM进行客户端身份验证,以及使用密钥文件进行内部身份验证。

有关可用的客户端和内部身份验证机制的完整列表,请参阅自托管部署的身份验证文档。

本教程假设每个分片副本集以及配置服务器副本集在卸任现有主节点后,都可以选择一个新的主节点

副本集只有在满足以下两个条件时才能选择主节点

  • 在卸任主节点后,大多数投票副本集成员可用。

  • 至少有一个可用的次要成员不是延迟的,隐藏的,或者优先级为0的。

确保您的分片集群至少有两个可用的 mongos 实例。本教程需要重启集群中的每个 mongos。如果您的分片集群只有一个 mongos 实例,则在 mongos 不可用期间将导致停机。

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

警告

使用 directShardOperations 角色执行命令可能会导致您的集群无法正常工作,并可能导致数据损坏。仅在使用维护目的或在MongoDB支持指导下时使用 directShardOperations 角色进行维护操作后,停止使用此角色。

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

注意

内部成员认证密钥文件使用YAML格式,以便在密钥文件中包含多个密钥。YAML格式接受以下两种形式:

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

  • 一系列密钥字符串

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

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

注意

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

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

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

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

请避免将密钥文件存储在可以轻松从托管mongodmongos实例的硬件上断开的存储介质上,例如USB驱动器或网络附加存储设备。

有关使用密钥文件进行内部认证的更多信息,请参阅密钥文件。

您必须连接到mongos以完成本节中的步骤。在这些步骤中创建的用户是集群级别用户,不能用于访问单个分片副本集。

1

使用db.createUser()方法创建管理员用户,并分配以下角色

执行维护操作或对分片集群进行用户管理操作的客户端必须在教程结束时使用此用户进行身份验证。现在创建此用户以确保在实施身份验证后您可以访问集群。

admin = db.getSiblingDB("admin");
admin.createUser(
{
user: "admin",
pwd: "<password>",
roles: [
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);

重要

密码应该是随机的、长的且复杂的,以防止或阻碍恶意访问。

2

除了管理员用户外,您可以在实施身份验证之前创建其他用户。这确保了在完全实施身份验证后可以访问分片集群。

示例

以下操作在 marketing 数据库中创建用户 joe,并赋予该用户 readWrite 角色。

db.getSiblingDB("marketing").createUser(
{
"user": "joe",
"pwd": "<password>",
"roles": [ { "role" : "readWrite", "db" : "marketing" } ]
}
)

身份验证为 "joe" 的客户端可以在 marketing 数据库上执行读和写操作。

有关 MongoDB 提供的角色的详细信息,请参阅 Database User Roles

有关添加用户的更多信息,请参阅 Add Users 教程。在添加新用户时,请考虑 安全最佳实践

3

尽管分片集群目前不强制执行身份验证,但在连接到分片集群时,您仍然可以更新客户端应用程序以指定身份验证凭据。这可能会防止在教程结束时断开连接。

示例

以下操作使用 mongosh 连接到分片集群,以 joe 用户身份在 marketing 数据库上进行身份验证。

mongosh --username "joe" --password "<password>" \
--authenticationDatabase "marketing" --host mongos1.example.net:27017

如果您的应用程序使用 MongoDB 驱动程序,请参阅相关的 driver 文档,了解创建已验证连接的说明。

1

对于每个 mongos:

  1. 复制现有的 mongos 配置文件,并给它一个独特的名称,例如 <filename>-secure.conf(或者在 Windows 上使用 .cfg)。您将使用这个新的配置文件将 mongos 转变为强制在分片集群中执行身份验证。保留原始配置文件以备备份。

  2. 在新的配置文件中添加以下设置

    security:
    transitionToAuth: true
    keyFile: <path-to-keyfile>

    新的配置文件应包含之前由 mongos 使用的所有配置设置以及新的安全设置。

2

注意

如果您的集群只有一个 mongos,这一步将在 mongos 离线时导致中断。

按照重新启动 mongos 实例的步骤进行,一次一个 mongos

  1. 连接到 mongos 以关闭。

  2. 使用 db.shutdownServer() 方法针对 admin 数据库安全关闭 mongos

    db.getSiblingDB("admin").shutdownServer()
  3. 使用新的配置文件重启 mongos,使用 --config 指定配置文件的路径。例如,如果新的配置文件名为 mongos-secure.conf

    mongos --config <path>/mongos-secure.conf

    其中 <path> 代表包含新配置文件的文件夹的系统路径。

对下一个 mongos 实例重复重启过程,直到分片集群中的所有 mongos 实例都已重启。

本节结束时,分片集群中的所有 mongos 实例都运行在具有 security.transitionToAuthsecurity.keyFile 内部认证的状态下。

1

对于配置服务器副本集中的每个 mongod

  1. 复制现有的 mongod 配置文件,给它一个独特的名称,例如 <filename>-secure.conf(或在 Windows 上使用 .cfg)。您将使用这个新的配置文件将 mongod 转换为在分片集群中强制执行身份验证。保留原始配置文件以备备份。

  2. 在新的配置文件中添加以下设置

    security:
    transitionToAuth: true
    keyFile: <path-to-keyfile>
2

逐个重启副本集,从 次要 成员开始。

  1. 要逐个重启 次要 成员,

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

      db.getSiblingDB("admin").shutdownServer()
    2. 使用新的配置文件重启 mongod,指定配置文件的路径使用 --config。例如,如果新配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含新配置文件的文件夹的系统路径。

    当此成员启动后,对下一个 次要 成员重复操作。

  2. 一旦所有 次要 成员都已重启并启动,重启主节点

    1. 连接到 mongod

    2. 使用 rs.stepDown() 方法使主节点降级并触发选举。

      rs.stepDown()

      您可以使用 rs.status() 方法确保副本集已选举出新的主节点。

    3. 一旦您使主节点降级并已选出新的主节点,使用 db.shutdownServer() 方法在 admin 数据库上关闭旧的主节点。

      db.getSiblingDB("admin").shutdownServer()
    4. 使用新的配置文件重启 mongod,指定配置文件的路径使用 --config。例如,如果新配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含新配置文件的文件夹的系统路径。

在本节结束时,配置服务器副本集中的所有 mongod 实例都在运行,使用 security.transitionToAuthsecurity.keyFile 内部认证。

在强制认证的分片集群中,每个分片副本集应该有它自己的 分片本地管理员。您不能使用一个分片本地管理员来访问另一个分片或分片集群。

连接到每个分片副本集的 主成员,并使用 db.createUser() 方法创建一个用户,将其分配以下角色

提示

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

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

完成本教程后,如果您想连接到分片以执行需要直接连接到分片的维护操作,您必须以分片本地管理员身份进行身份验证。

注意

直接连接到分片应仅用于分片特定的维护和配置。通常,客户端应通过mongos连接到分片集群。

一次过渡一个分片副本集,重复这些步骤以对分片集群中的每个分片副本集进行操作。

1

对于分片副本集中的每个mongod

  1. 复制现有的 mongod 配置文件,给它一个独特的名称,例如 <filename>-secure.conf(或在 Windows 上使用 .cfg)。您将使用这个新的配置文件将 mongod 转换为在分片集群中强制执行身份验证。保留原始配置文件以备备份。

  2. 在新的配置文件中添加以下设置

    security:
    transitionToAuth: true
    keyFile: <path-to-keyfile>
2

逐个重启副本集,从 次要 成员开始。

  1. 要逐个重启 次要 成员,

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

      db.getSiblingDB("admin").shutdownServer()
    2. 使用新的配置文件重启 mongod,指定配置文件的路径使用 --config。例如,如果新配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含新配置文件的文件夹的系统路径。

    一旦这个成员启动,重复对副本集的下一个次要成员进行操作,直到所有次要成员都已更新。

  2. 一旦所有 次要 成员都已重启并启动,重启主节点

    1. 连接到 mongod

    2. 使用 rs.stepDown() 方法使主节点降级并触发选举。

      rs.stepDown()

      您可以使用 rs.status() 方法确保副本集已选举出新的主节点。

    3. 一旦您使主节点降级并已选出新的主节点,使用 db.shutdownServer() 方法在 admin 数据库上关闭旧的主节点。

      db.getSiblingDB("admin").shutdownServer()
    4. 使用新的配置文件重启 mongod,指定配置文件的路径使用 --config。例如,如果新配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含新配置文件的文件夹的系统路径。

在教程的这个阶段,分片集群的每个组件都使用--transitionToAuthsecurity.keyFile内部认证运行。分片集群至少有一个管理员用户,每个分片副本集都有一个本地管理员用户。

剩余部分涉及将分片集群从过渡状态中移出,以完全强制执行认证。

重要

在本节结束之前,客户端必须指定认证凭据以连接到分片集群。在完成本节之前更新客户端以指定认证凭据,以避免连接丢失。

要完成将分片集群过渡到完全强制执行认证的过程,必须重启每个没有security.transitionToAuth设置的mongos实例。

1

从本教程创建的mongos配置文件中删除security.transitionToAuth键及其值。保留教程中添加的security.keyFile设置。

security:
keyFile: <path-to-keyfile>
2

注意

如果您的集群只有一个 mongos,这一步将在 mongos 离线时导致中断。

按照以下步骤重启 mongos 实例,每次重启一个

  1. 连接到 mongos 以关闭。

  2. 使用 db.shutdownServer() 方法针对 admin 数据库安全关闭 mongos

    db.getSiblingDB("admin").shutdownServer()
  3. 使用更新后的配置文件重启 mongos,使用 --config 选项指定配置文件路径。例如,如果更新后的配置文件名为 mongos-secure.conf

    mongos --config <path>/mongos-secure.conf

本节结束时,所有 mongos 实例将强制执行客户端认证和 security.keyFile 内部认证。

重要

本步骤结束时,客户端必须指定认证凭据才能连接到配置服务器副本集。在完成本节之前更新客户端以指定认证凭据,以避免连接丢失。

为了完成向完全强制执行分片集群中认证的过渡,您必须重启每个不包含 mongod 实例的 security.transitionToAuth 设置。

1

从本教程中创建的配置服务器配置文件中移除 security.transitionToAuth 键及其值。保留教程中添加的 security.keyFile 设置。

security:
keyFile: <path-to-keyfile>
2

逐个重启副本集,从 次要 成员开始。

  1. 要逐个重启 次要 成员,

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

      db.getSiblingDB("admin").shutdownServer()
    2. 使用更新后的配置文件重新启动 mongod,指定配置文件路径使用 --config。例如,如果新的配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含更新配置文件的文件夹的系统路径。

    当此成员启动后,对下一个 次要 成员重复操作。

  2. 一旦所有 次要 成员都已重启并启动,重启主节点

    1. 连接到 mongod

    2. 使用 rs.stepDown() 方法使主节点降级并触发选举。

      rs.stepDown()

      您可以使用 rs.status() 方法确保副本集已选举出新的主节点。

    3. 一旦您使主节点降级并已选出新的主节点,使用 db.shutdownServer() 方法在 admin 数据库上关闭旧的主节点。

      db.getSiblingDB("admin").shutdownServer()
    4. 使用更新后的配置文件重新启动 mongod,指定配置文件路径使用 --config。例如,如果新的配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含更新配置文件的文件夹的系统路径。

本节结束时,配置服务器复制集中的所有 mongod 实例将强制执行客户端身份验证和 security.keyFile 内部身份验证。

重要

在此步骤结束时,客户端必须指定身份验证凭据以连接到分片副本集。在完成本节之前,更新客户端以指定身份验证凭据,以避免连接丢失。

为了完成过渡到在分片集群中全面实施身份验证,您必须在分片集群中每个分片副本集的每个成员上重启,且不使用 security.transitionToAuth 设置。

一次过渡一个分片副本集,重复这些步骤以对分片集群中的每个分片副本集进行操作。

1

从本教程中创建的配置服务器配置文件中移除 security.transitionToAuth 键及其值。保留教程中添加的 security.keyFile 设置。

security:
keyFile: <path-to-keyfile>
2

逐个重启副本集,从 次要 成员开始。

  1. 要逐个重启 次要 成员,

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

      db.getSiblingDB("admin").shutdownServer()
    2. 使用更新后的配置文件重新启动 mongod,指定配置文件路径使用 --config。例如,如果新的配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含更新配置文件的文件夹的系统路径。

    当此成员启动后,对下一个 次要 成员重复操作。

  2. 一旦所有 次要 成员都已重启并启动,重启主节点

    1. 连接到 mongod

    2. 使用 rs.stepDown() 方法使主节点降级并触发选举。

      rs.stepDown()

      您可以使用 rs.status() 方法确保副本集已选举出新的主节点。

    3. 一旦您使主节点降级并已选出新的主节点,使用 db.shutdownServer() 方法在 admin 数据库上关闭旧的主节点。

      db.getSiblingDB("admin").shutdownServer()
    4. 使用更新后的配置文件重新启动 mongod,指定配置文件路径使用 --config。例如,如果新的配置文件名为 mongod-secure.conf

      mongod --config <path>/mongod-secure.conf

      其中 <path> 代表包含更新配置文件的文件夹的系统路径。

本节结束时,分片集群中的所有 mongosmongod 实例都将执行客户端身份验证和基于 security.keyFile 的内部身份验证。客户端只能通过配置的身份验证机制连接到分片集群。其他组件只能通过指定正确的密钥文件加入集群。

MongoDB 支持使用安全的 TLS/SSL 连接与 x.509 证书进行内部身份验证。分片集群成员和副本集成员可以使用 x.509 证书来验证其属于集群或副本集,而不是使用 密钥文件。

有关使用 x.509 证书进行内部身份验证的详细信息,请参阅 使用 x.509 证书进行 Self-Managed MongoDB 的成员身份验证。

将 Self-Managed MongoDB 从密钥文件身份验证升级到 x.509 身份验证 描述了如何将部署的内部身份验证机制从基于密钥文件的认证升级到基于 x.509 证书的认证。

返回

更新分片集群