轮换自管理分片集群的密钥
分片集群成员可以使用密钥文件,以同一部署的节点身份相互进行身份验证。
密钥文件可以包含多个密钥,如果至少一个密钥在成员之间通用,则成员身份验证建立。 这样就可以在不停机的情况下滚动升级密钥。
以下教程将逐步介绍在不停机的情况下更新分片集群密钥的过程。 [1]
警告
本教程中的示例键仅用于说明目的。 请勿在部署中使用 。 相反,使用您选择的任何方法(例如 openssl rand -base64
756
等)。
考虑一个分片集群,其中每个成员的密钥文件都包含以下密钥:
以下过程将更新分片集群成员以使用新密钥:
[1] | 本教程不适用于 MongoDB 的 storage engine 本地 密钥 管理所使用的密钥文件。该密钥文件只能包含一个密钥。 |
开始之前
从MongoDB 8.0开始,您可以使用directShardOperations
角色执行需要直接对分片执行命令的分片操作。
警告
使用directShardOperations
角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations
角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations
角色。
步骤
1. 修改密钥文件以包含旧密钥和新密钥
修改每个成员的密钥文件以包含旧密钥和新密钥。
警告
本教程中的示例键仅用于说明目的。 请勿用于您的部署。 相反,使用您选择的任何方法(例如 openssl rand -base64
756
等)。
您可以将多个密钥字符串指定为密钥字符串序列(可以选择用引号括起来):
1. 重新启动每个成员
一旦所有密钥文件都包含旧密钥和新密钥,请一次重启每个成员。
配置服务器
对于配置服务器副本集 (CSRS) 的每个从节点,将 mongosh
连接到节点,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
对于主节点,将mongosh
连接到该节点,然后
使用
rs.stepDown()
降级该节点:rs.stepDown() 使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
分片副本集
对于分片副本集的每个从节点,将mongosh
连接到该节点,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
对于每个分片副本集的主节点,将mongosh
连接到节点,然后
使用
rs.stepDown()
降级该节点:rs.stepDown() 使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
mongos
路由器
对于每个 mongos/router 实例,将mongosh
连接到mongos
实例,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
所有成员重新启动后,成员现在接受旧密钥或新密钥进行成员身份验证。
3. 仅将密钥文件内容更新为新密钥
警告
本教程中的示例键仅用于说明目的。 请勿用于您的部署。 相反,使用您选择的任何方法(例如 openssl rand -base64
756
等)。
修改每个成员的密钥文件以仅包含新密码。
4. 重新启动每个成员
一旦所有密钥文件仅包含新密钥,请一次重启一个成员。
配置服务器
对于配置服务器副本集 (CSRS) 的每个从节点,将mongosh
连接到节点,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
对于主节点,将mongosh
连接到该节点,然后
使用
rs.stepDown()
降级该节点:rs.stepDown() 使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
分片副本集
对于分片副本集的每个从节点,将mongosh
连接到该节点,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
对于每个分片副本集的主节点,将mongosh
连接到节点,然后
使用
rs.stepDown()
降级该节点:rs.stepDown() 使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
mongos
路由器
对于每个 mongos/router 实例,将mongosh
连接到mongos
实例,然后:
使用
db.shutdownServer()
方法关闭成员:use admin db.shutdownServer() 重新启动成员。
所有成员重新启动后,成员现在仅接受用于成员身份验证的新密钥。