将自管理分片集群更新为使用密钥文件进行身份验证(无停机时间)
Overview
重要
以下过程适用于使用 MongoDB 3.4 或更高版本的分片集群。
早期版本的MongoDB不支持不停机升级。 对于MongoDB的分片集群,请参阅将自管理分片集群更新为密钥文件身份验证。
MongoDB 分片集群可以强制执行用户身份验证及其组件的内部身份验证,以防止未经授权的访问。
以下教程介绍了使用 security.transitionToAuth
将现有分片集群转换为强制身份验证的过程,而不会导致停机。
在尝试本教程之前,请先熟悉本文档的内容。
Considerations
Cloud Manager 或 Ops Manager
如果您使用Cloud Manager 或MongoDB Ops Manager 管理部署,请参阅 MongoDBCloud Manager手册 或MongoDB Ops Manager 手册 中的 为 部署配置访问控制 以强制执行身份验证。
IP 绑定
内部和客户端身份验证机制
本教程使用SCRAM配置身份验证进行客户端身份验证,使用密钥文件进行内部身份验证。
有关可用客户端和内部身份验证机制的完整列表,请参阅自管理部署上的身份验证文档。
架构
本教程假设每个分片副本集以及配置服务器副本集都可以在降级其现有主节点后选择新的主节点。
仅当以下两个条件为 true 时,副本集才能选举主节点:
mongos
实例的最小数量
确保您的分片集群有至少两个可用的 mongos 实例。 本教程需要重新启动集群中的每个mongos
。 如果您的分片集群只有一个mongos
实例,则会在mongos
离线期间导致停机。
开始之前
从MongoDB 8.0开始,您可以使用directShardOperations
角色执行需要直接对分片执行命令的分片操作。
警告
使用directShardOperations
角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations
角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations
角色。
在现有分片集群上实施密钥文件访问控制
创建和分发密钥文件
在使用密钥文件身份验证时,分片集群中的每个 mongod
或 mongos
实例将密钥文件内容作为共享密码,以对部署中的其他节点进行身份验证。仅具有正确密钥文件的 mongod
或 mongos
实例可以加入分片集群。
注意
用于内部成员身份验证的密钥文件使用 YAML 格式,允许在密钥文件中包含多个密钥。YAML 格式接受以下任一形式:
单个密钥字符串(与早期版本相同)
键字符串序列
YAML 格式与使用文本文件格式的现有单密钥文件兼容。
密钥长度必须在 6 到 1,024 个字符之间,并且只能包含 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
,并为该用户分配marketing
数据库上的readWrite
角色。
db.getSiblingDB("marketing").createUser( { "user": "joe", "pwd": "<password>", "roles": [ { "role" : "readWrite", "db" : "marketing" } ] } )
身份验证为"joe"
的客户端可以对marketing
数据库执行读取和写入操作。
有关 MongoDB 提供的角色,请参阅数据库用户角色。
转换每个mongos
实例以强制执行身份验证
创建新的mongos
配置文件。
对于每个mongos
:
复制现有的
mongos
配置文件,并为其指定一个不同的名称,例如<filename>-secure.conf
(如果使用 Windows,则为.cfg
)。 您将使用这个新的配置文件来转换mongos
,以在分片集群中强制执行身份验证。 保留原始配置文件以备备份。在新配置文件中,添加以下设置:
security.transitionToAuth
设置为true
security.keyFile
设置为密钥文件路径。如果使用不同的内部身份验证机制,请指定适合该机制的设置。
security: transitionToAuth: true keyFile: <path-to-keyfile> 新的配置文件应包含
mongos
之前使用的所有配置设置以及新的安全设置。
在本部分结束时,分片集群中的所有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()
方法降级主节点并trigger选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选择新的主节点。一旦您降级主节点并选举了新的主节点,请对
admin
数据库使用db.shutdownServer()
方法关闭旧的主节点。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()
方法降级主节点并trigger选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选择新的主节点。一旦您降级主节点并选举了新的主节点,请对
admin
数据库使用db.shutdownServer()
方法关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() 使用新的配置文件重新启动
mongod
,并使用--config
指定配置文件的路径。 例如,如果新配置文件名为mongod-secure.conf
:mongod --config <path>/mongod-secure.conf 其中
<path>
表示包含新配置文件的文件夹的系统路径。
此时,分片集群的每个组件都使用--transitionToAuth
和security.keyFile
内部身份验证运行。 分片集群至少有一个管理用户,每个分片副本集都有一个分片本地管理用户。
其余部分涉及使分片集群脱离过渡状态以全面实施身份验证。
在没有 的情况下重新启动每个mongos
实例transitionToAuth
重要
在本节最后,客户端必须指定身份验证档案才能连接到分片集群。 在完成本部分之前,更新客户端以指定身份验证档案,以避免连接丢失。
要在分片集群中完成向完全强制执行身份验证的过渡,您必须重新启动每个不带mongos
设置的security.transitionToAuth
实例。
从 配置文件中删除transitionToAuth
mongos
。
从本教程中创建的security.transitionToAuth
mongos
配置文件中删除 键及其值。保留教程中添加的security.keyFile
设置。
security: keyFile: <path-to-keyfile>
在本节的最后,所有mongos
实例都强制执行客户端身份验证和security.keyFile
内部身份验证。
重新启动每个配置服务器副本集成员,无需 transitionToAuth
重要
在此步骤结束时,客户端必须指定身份验证档案才能连接到配置服务器副本集。 在完成本部分之前,更新客户端以指定身份验证档案,以避免连接丢失。
要在分片集群中完成向完全强制执行身份验证的过渡,您必须重新启动每个不带mongod
设置的security.transitionToAuth
实例。
从 配置文件中删除transitionToAuth
mongod
。
从本教程中创建的配置服务器配置文件中删除security.transitionToAuth
键及其值。 保留教程中添加的security.keyFile
设置。
security: keyFile: <path-to-keyfile>
使用更新的配置文件,一次重启一个mongod
。
从副本集开始,一次重启一个副本集。
要一次重启一个从节点,
连接到
mongod
并对admin
数据库使用db.shutdownServer()
方法,安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() Restart the
mongod
with the updated configuration file, specifying the path to the config file using--config
. 例如,如果新配置文件名为mongod-secure.conf
:mongod --config <path>/mongod-secure.conf 其中
<path>
表示包含已更新配置文件的文件夹的系统路径。
该节点启动后,对下一个从节点重复上述步骤。
所有从节点重新启动并启动后,重新启动主节点:
连接到
mongod
。使用
rs.stepDown()
方法降级主节点并trigger选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选择新的主节点。一旦您降级主节点并选举了新的主节点,请对
admin
数据库使用db.shutdownServer()
方法关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() Restart the
mongod
with the updated configuration file, specifying the path to the config file using--config
. 例如,如果新配置文件名为mongod-secure.conf
:mongod --config <path>/mongod-secure.conf 其中
<path>
表示包含已更新配置文件的文件夹的系统路径。
在本部分最后,配置服务器副本集中的所有mongod
实例都会强制执行客户端身份验证和security.keyFile
内部身份验证。
重新启动每个分片副本集中的每个成员,无需 transitionToAuth
重要
在此步骤结束时,客户端必须指定身份验证档案才能连接到分片副本集。 在完成本部分之前,更新客户端以指定身份验证档案,以避免连接丢失。
要在分片集群中完成向完全强制执行身份验证的过渡,您必须重新启动不带security.transitionToAuth
设置的分片集群中每个分片副本集的每个成员。
一次过渡一个分片副本集,对分片集群中的每个分片副本集重复这些步骤。
从 配置文件中删除transitionToAuth
mongod
。
从本教程中创建的配置服务器配置文件中删除security.transitionToAuth
键及其值。 保留教程中添加的security.keyFile
设置。
security: keyFile: <path-to-keyfile>
使用更新的配置文件,一次重启一个mongod
。
从副本集开始,一次重启一个副本集。
要一次重启一个从节点,
连接到
mongod
并对admin
数据库使用db.shutdownServer()
方法,安全关闭mongod
。db.getSiblingDB("admin").shutdownServer() Restart the
mongod
with the updated configuration file, specifying the path to the config file using--config
. 例如,如果新配置文件名为mongod-secure.conf
:mongod --config <path>/mongod-secure.conf 其中
<path>
表示包含已更新配置文件的文件夹的系统路径。
该节点启动后,对下一个从节点重复上述步骤。
所有从节点重新启动并启动后,重新启动主节点:
连接到
mongod
。使用
rs.stepDown()
方法降级主节点并trigger选举。rs.stepDown() 您可以使用
rs.status()
方法确保副本集已选择新的主节点。一旦您降级主节点并选举了新的主节点,请对
admin
数据库使用db.shutdownServer()
方法关闭旧的主节点。db.getSiblingDB("admin").shutdownServer() Restart the
mongod
with the updated configuration file, specifying the path to the config file using--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用于使用自管理MongoDB进行成员身份验证的证书。
将自管理MongoDB从密钥文件身份验证升级到 x。 509身份验证描述了如何升级部署的内部身份验证机制从基于密钥文件的身份验证升级到 x. 509基于证书的身份验证。