更新自托管分片集群到密钥文件身份验证(无中断)
概述
重要
以下过程适用于使用 MongoDB 3.4 或更高版本的分片集群。
MongoDB 的早期版本不支持无停机升级。对于使用 MongoDB 早期版本的分片集群,请参阅将自管理的分片集群更新到密钥文件认证.
MongoDB 分片集群可以强制执行 用户认证 以及其组件的 内部认证,以防止未经授权的访问。
以下教程描述了使用 security.transitionToAuth
将现有分片集群转换为强制执行认证而无需停机的过程。
在尝试本教程之前,请熟悉本文件的全部内容。
注意事项
云管理器和运维管理器
IP 绑定
内部和客户端身份验证机制
本教程配置了使用SCRAM进行客户端身份验证,以及使用密钥文件进行内部身份验证。
有关可用的客户端和内部身份验证机制的完整列表,请参阅自托管部署的身份验证文档。
架构
本教程假设每个分片副本集以及配置服务器副本集在卸任现有主节点后,都可以选择一个新的主节点。
副本集只有在满足以下两个条件时才能选择主节点
最小数量的mongos
实例
确保您的分片集群至少有两个可用的 mongos 实例。本教程需要重启集群中的每个 mongos
。如果您的分片集群只有一个 mongos
实例,则在 mongos
不可用期间将导致停机。
开始之前
从MongoDB 8.0版本开始,您可以使用 directShardOperations
角色执行需要直接针对分片执行命令的维护操作。
警告
使用 directShardOperations
角色执行命令可能会导致您的集群无法正常工作,并可能导致数据损坏。仅在使用维护目的或在MongoDB支持指导下时使用 directShardOperations
角色进行维护操作后,停止使用此角色。
在现有分片集群上强制执行密钥文件访问控制
创建和分发密钥文件
使用密钥文件认证,分片集群中的每个mongod
或mongos
实例使用密钥文件内容作为认证集群中其他成员的共享密码。只有拥有正确密钥文件的mongod
或mongos
实例才能加入分片集群。
注意
内部成员认证密钥文件使用YAML格式,以便在密钥文件中包含多个密钥。YAML格式接受以下两种形式:
单个密钥字符串(与早期版本相同)
一系列密钥字符串
YAML格式与使用文本文件格式的现有单个密钥密钥文件兼容。
密钥长度必须在6到1024个字符之间,且只能包含base64集合中的字符。分片集群的所有成员必须共享至少一个共同密钥。
注意
在UNIX系统上,密钥文件不得具有组或世界权限。在Windows系统上,不检查密钥文件权限。
您可以使用任何您选择的方法生成密钥文件。例如,以下操作使用openssl
生成一个复杂的伪随机1024字符字符串,用作共享密码。然后使用chmod
更改文件权限,只为文件所有者提供读权限。
openssl rand -base64 755 > <path-to-keyfile> chmod 400 <path-to-keyfile>
将密钥文件复制到每个托管分片集群成员的服务器上。确保运行mongod
或mongos
实例的用户是该文件的拥有者并且可以访问密钥文件。
请避免将密钥文件存储在可以轻松从托管mongod
或mongos
实例的硬件上断开的存储介质上,例如USB驱动器或网络附加存储设备。
有关使用密钥文件进行内部认证的更多信息,请参阅密钥文件。
配置分片集群管理员用户和客户端用户
您必须连接到mongos
以完成本节中的步骤。在这些步骤中创建的用户是集群级别用户,不能用于访问单个分片副本集。
创建管理员用户。
使用db.createUser()
方法创建管理员用户,并分配以下角色
clusterAdmin
在admin
数据库上userAdmin
角色在admin
数据库上
执行维护操作或对分片集群进行用户管理操作的客户端必须在教程结束时使用此用户进行身份验证。现在创建此用户以确保在实施身份验证后您可以访问集群。
admin = db.getSiblingDB("admin"); admin.createUser( { user: "admin", pwd: "<password>", roles: [ { role: "clusterAdmin", db: "admin" }, { role: "userAdmin", db: "admin" } ] } );
重要
密码应该是随机的、长的且复杂的,以防止或阻碍恶意访问。
可选:为客户端应用程序创建其他用户。
除了管理员用户外,您可以在实施身份验证之前创建其他用户。这确保了在完全实施身份验证后可以访问分片集群。
示例
以下操作在 marketing
数据库中创建用户 joe
,并赋予该用户 readWrite
角色。
db.getSiblingDB("marketing").createUser( { "user": "joe", "pwd": "<password>", "roles": [ { "role" : "readWrite", "db" : "marketing" } ] } )
身份验证为 "joe"
的客户端可以在 marketing
数据库上执行读和写操作。
有关 MongoDB 提供的角色的详细信息,请参阅 Database User Roles
。
将每个 mongos
实例过渡到强制执行身份验证
创建一个新的 mongos
配置文件。
对于每个 mongos
:
复制现有的
mongos
配置文件,并给它一个独特的名称,例如<filename>-secure.conf
(或者在 Windows 上使用.cfg
)。您将使用这个新的配置文件将mongos
转变为强制在分片集群中执行身份验证。保留原始配置文件以备备份。在新的配置文件中添加以下设置
security.transitionToAuth
设置为true
security.keyFile
设置为密钥文件路径。如果使用不同的内部身份验证机制,指定适合该机制的设置。
security: transitionToAuth: true keyFile: <path-to-keyfile> 新的配置文件应包含之前由
mongos
使用的所有配置设置以及新的安全设置。
一次一个,使用新的配置文件重新启动 mongos
。
按照重新启动 mongos
实例的步骤进行,一次一个 mongos
。
连接到
mongos
以关闭。使用
db.shutdownServer()
方法针对admin
数据库安全关闭mongos
。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重启
mongos
,使用--config
指定配置文件的路径。例如,如果新的配置文件名为mongos-secure.conf
mongos --config <path>/mongos-secure.conf 其中
<path>
代表包含新配置文件的文件夹的系统路径。
本节结束时,分片集群中的所有 mongos
实例都运行在具有 security.transitionToAuth
和 security.keyFile
内部认证的状态下。
将配置服务器副本集成员过渡到强制认证
创建一个新的 mongod
配置文件。
对于配置服务器副本集中的每个 mongod
,
复制现有的
mongod
配置文件,给它一个独特的名称,例如<filename>-secure.conf
(或在 Windows 上使用.cfg
)。您将使用这个新的配置文件将mongod
转换为在分片集群中强制执行身份验证。保留原始配置文件以备备份。在新的配置文件中添加以下设置
security.transitionToAuth
设置为true
security.keyFile
设置为密钥文件路径。如果使用不同的内部身份验证机制,指定适合该机制的设置。
security: transitionToAuth: true keyFile: <path-to-keyfile>
逐个重启 mongod
,使用新的配置文件。
逐个重启副本集,从 次要 成员开始。
要逐个重启 次要 成员,
连接到
mongod
并在admin
数据库上使用db.shutdownServer()
方法安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重启
mongod
,指定配置文件的路径使用--config
。例如,如果新配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含新配置文件的文件夹的系统路径。
当此成员启动后,对下一个 次要 成员重复操作。
一旦所有 次要 成员都已重启并启动,重启主节点
连接到
mongod
。使用
rs.stepDown()
方法使主节点降级并触发选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选举出新的主节点。一旦您使主节点降级并已选出新的主节点,使用
db.shutdownServer()
方法在admin
数据库上关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重启
mongod
,指定配置文件的路径使用--config
。例如,如果新配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含新配置文件的文件夹的系统路径。
在本节结束时,配置服务器副本集中的所有 mongod
实例都在运行,使用 security.transitionToAuth
和 security.keyFile
内部认证。
将每个分片副本集成员过渡到强制认证
创建分片本地管理员
在强制认证的分片集群中,每个分片副本集应该有它自己的 分片本地管理员。您不能使用一个分片本地管理员来访问另一个分片或分片集群。
连接到每个分片副本集的 主成员,并使用 db.createUser()
方法创建一个用户,将其分配以下角色
clusterAdmin
在admin
数据库上userAdmin
角色在admin
数据库上
提示
您可以使用与各种用户认证管理方法和命令结合的 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
连接到分片集群。
步骤
一次过渡一个分片副本集,重复这些步骤以对分片集群中的每个分片副本集进行操作。
创建一个新的mongod
配置文件。
对于分片副本集中的每个mongod
,
复制现有的
mongod
配置文件,给它一个独特的名称,例如<filename>-secure.conf
(或在 Windows 上使用.cfg
)。您将使用这个新的配置文件将mongod
转换为在分片集群中强制执行身份验证。保留原始配置文件以备备份。在新的配置文件中添加以下设置
security.transitionToAuth
设置为true
security.keyFile
设置为密钥文件路径。如果使用不同的内部身份验证机制,指定适合该机制的设置。
security: transitionToAuth: true keyFile: <path-to-keyfile>
逐个,使用新配置文件重启mongod
。
逐个重启副本集,从 次要 成员开始。
要逐个重启 次要 成员,
连接到
mongod
并在admin
数据库上使用db.shutdownServer()
方法安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重启
mongod
,指定配置文件的路径使用--config
。例如,如果新配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含新配置文件的文件夹的系统路径。
一旦这个成员启动,重复对副本集的下一个次要成员进行操作,直到所有次要成员都已更新。
一旦所有 次要 成员都已重启并启动,重启主节点
连接到
mongod
。使用
rs.stepDown()
方法使主节点降级并触发选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选举出新的主节点。一旦您使主节点降级并已选出新的主节点,使用
db.shutdownServer()
方法在admin
数据库上关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重启
mongod
,指定配置文件的路径使用--config
。例如,如果新配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含新配置文件的文件夹的系统路径。
在教程的这个阶段,分片集群的每个组件都使用--transitionToAuth
和security.keyFile
内部认证运行。分片集群至少有一个管理员用户,每个分片副本集都有一个本地管理员用户。
剩余部分涉及将分片集群从过渡状态中移出,以完全强制执行认证。
重启每个没有transitionToAuth
的mongos
实例
重要
在本节结束之前,客户端必须指定认证凭据以连接到分片集群。在完成本节之前更新客户端以指定认证凭据,以避免连接丢失。
要完成将分片集群过渡到完全强制执行认证的过程,必须重启每个没有security.transitionToAuth
设置的mongos
实例。
从mongos
配置文件中删除transitionToAuth
设置
从本教程创建的mongos
配置文件中删除security.transitionToAuth
键及其值。保留教程中添加的security.keyFile
设置。
security: keyFile: <path-to-keyfile>
本节结束时,所有 mongos
实例将强制执行客户端认证和 security.keyFile
内部认证。
不使用 transitionToAuth
重启每个配置服务器副本集成员
重要
本步骤结束时,客户端必须指定认证凭据才能连接到配置服务器副本集。在完成本节之前更新客户端以指定认证凭据,以避免连接丢失。
为了完成向完全强制执行分片集群中认证的过渡,您必须重启每个不包含 mongod
实例的 security.transitionToAuth
设置。
从 mongod
配置文件中移除 transitionToAuth
。
从本教程中创建的配置服务器配置文件中移除 security.transitionToAuth
键及其值。保留教程中添加的 security.keyFile
设置。
security: keyFile: <path-to-keyfile>
一次一个,使用更新后的配置文件重新启动 mongod
。
逐个重启副本集,从 次要 成员开始。
要逐个重启 次要 成员,
连接到
mongod
并在admin
数据库上使用db.shutdownServer()
方法安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() 使用更新后的配置文件重新启动
mongod
,指定配置文件路径使用--config
。例如,如果新的配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含更新配置文件的文件夹的系统路径。
当此成员启动后,对下一个 次要 成员重复操作。
一旦所有 次要 成员都已重启并启动,重启主节点
连接到
mongod
。使用
rs.stepDown()
方法使主节点降级并触发选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选举出新的主节点。一旦您使主节点降级并已选出新的主节点,使用
db.shutdownServer()
方法在admin
数据库上关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() 使用更新后的配置文件重新启动
mongod
,指定配置文件路径使用--config
。例如,如果新的配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含更新配置文件的文件夹的系统路径。
本节结束时,配置服务器复制集中的所有 mongod
实例将强制执行客户端身份验证和 security.keyFile
内部身份验证。
在不使用 transitionToAuth
的情况下重启每个分片副本集的每个成员
重要
在此步骤结束时,客户端必须指定身份验证凭据以连接到分片副本集。在完成本节之前,更新客户端以指定身份验证凭据,以避免连接丢失。
为了完成过渡到在分片集群中全面实施身份验证,您必须在分片集群中每个分片副本集的每个成员上重启,且不使用 security.transitionToAuth
设置。
一次过渡一个分片副本集,重复这些步骤以对分片集群中的每个分片副本集进行操作。
从 mongod
配置文件中删除 transitionToAuth
。
从本教程中创建的配置服务器配置文件中移除 security.transitionToAuth
键及其值。保留教程中添加的 security.keyFile
设置。
security: keyFile: <path-to-keyfile>
一次一个地,使用更新后的配置文件重启 mongod
。
逐个重启副本集,从 次要 成员开始。
要逐个重启 次要 成员,
连接到
mongod
并在admin
数据库上使用db.shutdownServer()
方法安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() 使用更新后的配置文件重新启动
mongod
,指定配置文件路径使用--config
。例如,如果新的配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含更新配置文件的文件夹的系统路径。
当此成员启动后,对下一个 次要 成员重复操作。
一旦所有 次要 成员都已重启并启动,重启主节点
连接到
mongod
。使用
rs.stepDown()
方法使主节点降级并触发选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选举出新的主节点。一旦您使主节点降级并已选出新的主节点,使用
db.shutdownServer()
方法在admin
数据库上关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() 使用更新后的配置文件重新启动
mongod
,指定配置文件路径使用--config
。例如,如果新的配置文件名为mongod-secure.conf
mongod --config <path>/mongod-secure.conf 其中
<path>
代表包含更新配置文件的文件夹的系统路径。
本节结束时,分片集群中的所有 mongos
和 mongod
实例都将执行客户端身份验证和基于 security.keyFile
的内部身份验证。客户端只能通过配置的身份验证机制连接到分片集群。其他组件只能通过指定正确的密钥文件加入集群。
x.509 证书内部身份验证
MongoDB 支持使用安全的 TLS/SSL 连接与 x.509 证书进行内部身份验证。分片集群成员和副本集成员可以使用 x.509 证书来验证其属于集群或副本集,而不是使用 密钥文件。
有关使用 x.509 证书进行内部身份验证的详细信息,请参阅 使用 x.509 证书进行 Self-Managed MongoDB 的成员身份验证。
将 Self-Managed MongoDB 从密钥文件身份验证升级到 x.509 身份验证 描述了如何将部署的内部身份验证机制从基于密钥文件的认证升级到基于 x.509 证书的认证。