旋转加密密钥

在本页面

大多数法规要求强制要求必须每年淘汰用于解密敏感数据的托管密钥,并用新密钥替换。

MongoDB 提供了两种密钥旋转选项。您可以使用使用新密钥的新实例来旋转二进制文件。或者,如果您使用 KMIP 服务器进行密钥 Management,则可以旋转主密钥。

旋转副本集的成员

对于副本集,要旋转出成员:

  • 启动一个新的mongod实例,该实例配置为使用新密钥。在副本集名称中包括--replSet选项,以及配置中特定的其他任何选项,例如--dbpath--bind_ip
mongod --replSet myReplSet --enableEncryption \
--kmipServerName <KMIP Server HostName> \
--kmipServerCAFile ca.pem --kmipClientCertificateFile client.pem
  • mongo shell 连接到副本集的主数据库。

  • 将实例添加到副本集,最初将成员添加为non-votingpriority 0成员:

rs.add( { host: <host:port>, priority: 0, votes: 0 } )

Tip

当新添加的辅助节点的votespriority设置大于零时,在其初始同步期间,即使辅助节点不能提供读取或成为主节点,因为其数据仍不一致,所以该辅助节点仍会计为有表决权的成员。

这可能导致大多数投票成员在线但无法选举主要成员的情况。为避免这种情况,请考虑首先使用priority :0votes :0添加新的辅助服务器。然后,一旦成员已转换为SECONDARY状态,请使用rs.reconfig()更新其优先级和投票。

在初始同步过程中,将使用一组全新的数据库密钥以及新的系统密钥对数据进行重新加密。

  • 确保新成员已达到SECONDARY状态。要检查副本集成员的状态,请运行rs.status()
rs.status()
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)

其中nmembers数组中新成员的数组索引。

Warning

  • rs.reconfig() shell 方法可以强制当前主节点降级,从而导致election。当主服务器降级时,mongod关闭所有 Client 端连接。尽管这通常需要 10 到 20 秒,但请尝试在计划的维护期间进行这些更改。

  • 避免重新配置包含不同 MongoDB 版本成员的副本集,因为验证规则在 MongoDB 版本之间可能有所不同。

KMIP 主密钥轮换

如果您使用 KMIP 服务器进行密钥 Management,则可以旋转主密钥(唯一的外部 Management 密钥)。使用新的主密钥,内部密钥库将被重新加密,但数据库密钥将保持不变。这样就无需重新加密整个数据集。

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设置。