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

将自托管副本集更新为密钥文件认证(无停机时间)

本页内容

  • 概述
  • 在现有副本集上强制执行密钥文件访问控制
  • x.509 内部认证

为了防止未经授权的访问,强制执行您的部署的认证。副本集的认证包括副本集成员之间的内部认证和连接到副本集的客户端的用户访问控制如果您的部署目前没有强制执行认证,您可以使用--transitionToAuth选项来强制执行认证而无需停机。

本教程使用密钥文件内部认证机制用于内部安全,以及基于SCRAM的客户端连接基于角色的访问控制

如果您使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的

如果您使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的

请参阅云管理器手册Ops Manager手册以强制执行身份验证。

本教程假设在现有主副本集成员下线后,您的副本集可以选举新的主节点。这需要

  • 主节点下线后,大多数投票副本集成员可用。

  • 至少有一个非延迟隐藏优先级 0次要节点

运行带有--transitionToAuthmongod将接受已验证和未验证的连接。在此过渡状态下连接到mongod的客户可以执行任何数据库的读取、写入和管理操作。

在以下过程的末尾,副本集将拒绝任何尝试进行非认证连接的客户端。此过程创建用户,以便客户端应用程序在连接到副本集时使用。

请参阅➤ 配置基于角色的访问控制,了解用户创建和管理最佳实践。

MongoDB 可执行文件,mongodmongos,默认绑定到 localhost

重要

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

重要

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

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

1

连接到主节点以创建具有userAdminAnyDatabase角色的用户。该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" } ]
}
)

完成此过程后,管理副本集中用户的任何客户端都必须以该用户或具有类似权限的用户身份进行身份验证。

请参阅数据库用户角色,获取内置角色的完整列表以及与数据库管理操作相关的信息。

2

连接到主节点,使用clusterAdmin角色创建用户。该clusterAdmin角色允许访问复制操作,例如配置副本集。

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

重要

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

提示

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

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

完成此过程后,任何管理或维护副本集的客户端都必须以该用户身份或具有类似权限的用户身份进行身份验证。

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

3

创建用户以允许客户端应用程序连接并与副本集交互。完成本教程后,客户端必须以配置的用户身份进行身份验证以连接到副本集。

请参阅数据库用户角色,了解用于创建只读和读写用户的内置基本角色。

以下示例在foo数据库上创建具有读写权限的用户。

重要

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

foo数据库中创建具有readWrite角色的用户。

提示

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

db.getSiblingDB("foo").createUser(
{
"user" : "joe",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "readWrite", "db" : "foo" } ]
}
)

以该用户身份进行身份验证的客户端可以对foo数据库执行读写操作。有关创建已验证连接的更多信息,请参阅使用自管理部署对用户进行身份验证

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

4

在执行此步骤时,副本集不强制执行身份验证。但是,客户端应用程序仍然可以指定身份验证凭据并连接到副本集。

将客户端应用程序更新为使用配置的用户身份验证副本集。身份验证连接需要用户名、密码和身份验证数据库。请参阅使用自托管部署身份验证用户。

例如,以下代码连接到名为mongoRepl的副本集,并以用户joe的身份进行身份验证。

mongosh -u joe -password -authenticationDatabase foo --host mongoRepl/mongo1.example.net:27017, mongo2.example.net:27017, mongo3.example.net:27017

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

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

本教程完成后,副本集将拒绝未经过身份验证的客户端连接。现在执行此步骤可以确保在过渡前后客户端都可以连接到副本集。

5

使用密钥文件身份验证,副本集中的每个mongod实例使用密钥文件的內容作为共享密码,以验证部署中的其他成员。只有具有正确密钥文件的mongod实例才能加入副本集。

注意

内部成员身份验证密钥文件使用YAML格式,允许在密钥文件中包含多个密钥。YAML格式接受以下格式:

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

  • 密钥字符串序列

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

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

注意

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

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

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

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

6

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

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

7

重新启动副本集中的每个 次要仲裁 成员,包括配置中的

必须逐个重启每个成员,以确保副本集中多数成员保持在线。

从连接到次要或仲裁成员的 mongosh 会话中,针对 admin 数据库执行 db.shutdownServer() 命令。

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

请在您的 配置文件 中指定以下设置。

mongodmongos 默认绑定到本地主机。如果您的部署成员运行在不同的主机上或您希望远程客户端连接到您的部署,您必须指定 net.bindIp 设置。

security:
keyFile: <path-to-keyfile>
transitionToAuth: true
replication:
replSetName: <replicaSetName>

在启动 mongod 时,使用包含配置文件路径的 --config 选项。

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

有关配置文件的更多信息,请参阅 配置选项

或者,您可以在启动 mongod 时使用等效的命令行选项(例如 --transitionToAuth--keyFile)。有关选项的完整列表,请参阅 mongod 参考页面。

根据您的部署情况,包含适当的额外设置。

完成此步骤后,所有辅助成员和仲裁成员都应启动并运行,且 security.transitionToAuth 设置为 true

8

降低副本集中的成员并重新启动该成员,包括其配置

使用 mongosh 连接到主节点并使用 rs.stepDown() 方法降低主节点。

rs.stepDown()

一旦主节点降低并且副本集选举了新的主节点,关闭旧的主节点 mongod.

从连接到旧主节点的 mongosh 会话中,在 admin 数据库上执行 db.shutdownServer()

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

请在您的 配置文件 中指定以下设置。

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

security:
keyFile: <path-to-keyfile>
transitionToAuth: true
replication:
replSetName: <replicaSetName>

使用配置文件启动 mongod

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

有关配置文件的更多信息,请参阅 配置选项

或者,您可以在启动 mongod 时使用等效的命令行选项(例如 --transitionToAuth--keyFile)。有关选项的完整列表,请参阅 mongod 参考页面。

根据您的部署情况,包含适当的额外设置。

本步骤结束时,副本集的所有成员都应启动并运行,其中 security.transitionToAuth 设置为 truesecurity.keyFile 设置为密钥文件路径。

9

重新启动副本集中的每个 从节点仲裁者 成员,并在重新启动时移除 security.transitionToAuth 选项。您必须逐个进行此操作,以确保副本集中的多数成员保持在线。

如果副本集的大多数成员同时离线,则副本集可能进入只读模式。

mongosh 连接到辅助成员或仲裁成员,并在 admin 数据库上执行 db.shutdownServer()

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

重启 mongod,这次 使用 security.transitionToAuth 选项,而是 使用 内部认证机制,如 security.keyFile

请在您的 配置文件 中指定以下设置。

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

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>

使用配置文件启动 mongod

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

有关配置文件的更多信息,请参阅 配置选项

您还可以在启动您的 mongod 时使用等效的 mongod 选项。有关选项的完整列表,请参阅 mongod 参考页面。

根据您的部署情况,包含适当的额外设置。

完成此步骤后,所有辅助成员和仲裁成员都应运行,并已配置内部认证,但 使用 security.transitionToAuth。客户端只能通过配置的客户端认证机制连接到这些 mongod 实例。

10

将副本集中的主成员降级,然后不使用选项重新启动它。

重要

在此步骤结束时,未使用身份验证连接的客户端无法连接到副本集。在完成此步骤之前,请更新客户端以使用身份验证连接,以避免连接中断。

使用 mongosh 连接到主节点并使用 rs.stepDown() 方法降低主节点。

rs.stepDown()

一旦主节点降低并且副本集选举了新的主节点,关闭旧的主节点 mongod.

从连接到旧主节点的 mongosh 会话中,在 admin 数据库上执行 db.shutdownServer()

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

重启 mongod,这次 不使用 security.transitionToAuth 选项,而是使用内部认证机制,例如 security.keyFile

请在您的 配置文件 中指定以下设置。

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>

使用配置文件启动 mongod

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

有关配置文件的更多信息,请参阅 配置选项

在启动您的 mongod 时,您也可以使用等效的 mongod 选项。有关选项的完整列表,请参阅 mongod 参考页面。

根据您的部署情况,包含适当的额外设置。

在此步骤结束时,副本集的所有成员都应正常运行并强制执行认证。客户端只能通过配置的客户端认证机制连接到这些 mongod 实例。

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

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

返回

更新副本集

© . All rights reserved.