旋转加密密钥
在本页面
大多数法规要求强制要求必须每年淘汰用于解密敏感数据的托管密钥,并用新密钥替换。
MongoDB 提供了两种密钥旋转选项。您可以使用使用新密钥的新实例来旋转二进制文件。或者,如果您使用 KMIP 服务器进行密钥 Management,则可以旋转主密钥。
旋转副本集的成员
对于副本集,要旋转出成员:
mongod --replSet myReplSet --enableEncryption \
--kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
-
将mongo shell 连接到副本集的主数据库。
-
将实例添加到副本集,最初将成员添加为non-voting,priority 0成员:
rs.add( { host: <host:port>, priority: 0, votes: 0 } )
Tip
当新添加的辅助节点的votes和priority设置大于零时,在其初始同步期间,即使辅助节点不能提供读取或成为主节点,因为其数据仍不一致,所以该辅助节点仍会计为有表决权的成员。
这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0和votes :0添加新的辅助服务器。然后,一旦成员已转换为SECONDARY状态,请使用rs.reconfig()更新其优先级和投票。
在初始同步过程中,将使用一组全新的数据库密钥以及新的系统密钥对数据进行重新加密。
- 确保新成员已达到SECONDARY状态。要检查副本集成员的状态,请运行rs.status():
rs.status()
- 新节点完成其初始同步过程后,请使用rs.reconfig()更新新添加的辅助节点的投票和优先级设置。有关详情,请参见将辅助服务器添加到现有副本集:
var cfg = rs.conf();
cfg.members[n].priority = 1; // Substitute the correct array index for the new member
cfg.members[n].votes = 1; // Substitute the correct array index for the new member
rs.reconfig(cfg)
其中n
是members数组中新成员的数组索引。
Warning
-
rs.reconfig() shell 方法可以强制当前主节点降级,从而导致election。当主服务器降级时,mongod关闭所有 Client 端连接。尽管这通常需要 10 到 20 秒,但请尝试在计划的维护期间进行这些更改。
-
避免重新配置包含不同 MongoDB 版本成员的副本集,因为验证规则在 MongoDB 版本之间可能有所不同。
- 从副本集中删除旧节点并删除其所有数据。有关说明,请参见从副本集中删除成员
KMIP 主密钥轮换
如果您使用 KMIP 服务器进行密钥 Management,则可以旋转主密钥(唯一的外部 Management 密钥)。使用新的主密钥,内部密钥库将被重新加密,但数据库密钥将保持不变。这样就无需重新加密整个数据集。
-
一次旋转一个副本集的secondary个成员的主密钥。
-
重新启动辅助服务器,包括--kmipRotateMasterKey选项。包括任何其他特定于您的配置的选项,例如--bind_ip。如果成员已经包含--kmipKeyIdentifier选项,请使用新密钥更新--kmipKeyIdentifier选项以使用,或者省略以从 KMIP 服务器请求新密钥:
mongod --enableEncryption --kmipRotateMasterKey \
--kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
如果使用配置文件,请包含security.kmip.rotateMasterKey。
-
成功完成主密钥旋转并重新加密数据库密钥库后,mongod将退出。
-
重新启动没有--kmipRotateMasterKey参数的辅助节点。包括任何其他特定于您的配置的选项,例如
--bind_ip
。
mongod --enableEncryption --kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
如果使用配置文件,请删除security.kmip.rotateMasterKey设置。
- 降级主副本集。
将mongoShell 连接到主要数据库,并使用rs.stepDown()降低主要数据库并强制选择新的主要数据库:
rs.stepDown()
-
当rs.status()显示主要成员已卸任而另一个成员已处于
PRIMARY
状态时,请旋转该已卸任成员的主密钥: -
重新启动已降级的成员,包括--kmipRotateMasterKey选项。包括特定于您的配置的任何其他选项,例如
--bind_ip
。如果成员已经包含--kmipKeyIdentifier选项,请使用新密钥更新--kmipKeyIdentifier选项以使用或省略。
mongod --enableEncryption --kmipRotateMasterKey \
--kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
如果使用配置文件,请包含security.kmip.rotateMasterKey。
-
成功完成主密钥旋转并重新加密数据库密钥库后,mongod将退出。
-
重新启动不带--kmipRotateMasterKey选项的已降级成员。包括任何其他特定于您的配置的选项,例如
--bind_ip
。
mongod --enableEncryption --kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
如果使用配置文件,请删除security.kmip.rotateMasterKey设置。