配置加密
概述
本页讨论了支持静态加密的服务器配置。如果您使用MongoDB Atlas,您的数据已经加密。MongoDB在云服务提供商级别管理Atlas加密,但您也可以使用自己的密钥管理解决方案。有关详细信息,请参阅Atlas 密钥管理文档。
MongoDB Enterprise 3.2为WiredTiger存储引擎引入了原生加密选项。在Atlas之外,加密仅适用于使用WiredTiger存储引擎的企业安装。
安全地管理加密密钥是存储加密的关键要求。MongoDB使用一个主密钥,该密钥不随MongoDB安装存储。只有主密钥才进行外部管理,其他密钥可以与您的MongoDB实例一起存储。
MongoDB的加密存储引擎支持两种主密钥管理选项
通过密钥管理互操作性协议(KMIP)与第三方密钥管理设备的集成。推荐
使用密钥文件进行本地密钥管理。
重要
MongoDB无法加密现有数据。当您使用新密钥启用加密时,MongoDB实例不能有任何预存数据。如果您的MongoDB安装已经存在现有数据,请参阅静态加密现有数据以获取其他步骤。
密钥管理
MongoDB Enterprise支持与兼容的密钥管理设备安全地传输密钥。
MongoDB Enterprise支持与密钥管理互操作性协议(KMIP)兼容的密钥管理设备安全地传输密钥。
关于MongoDB认证合作伙伴的列表,请参考合作伙伴列表。
提示
推荐
使用密钥管理器符合监管密钥管理指南,例如HIPAA、PCI-DSS和FERPA,并且比本地密钥管理推荐。
先决条件
您的密钥管理器必须支持KMIP通信协议。
默认的KMIP协议版本是1.2。您可以在MongoDB服务器配置文件中配置MongoDB使用KMIP版本1.0或1.1。.
对于使用KMIP的第三方密钥管理设备的集成,您应允许以下KMIP操作KMIP,以下操作
创建(
操作_create
)获取(
operation_get
)激活(
operation_activate
)
要验证MongoDB到KMIP服务器,您必须拥有由密钥管理设备签发的有效证书。
注意
Windows上的MongoDB Enterprise不再支持AES256-GCM
作为静止加密的块加密。此用法仅在Linux上受支持。
使用新密钥加密
当您连接到密钥管理器时创建新密钥,请使用以下选项启动mongod
要连接到1.0或1.1版本的KMIP服务器,请使用--kmipUseLegacyProtocol
选项。
根据您的配置需要包括附加选项。例如,如果您希望远程客户端连接到您的部署或您的部署成员在不同的主机上运行,请指定--bind_ip
。
重要
在Windows上使用--kmipClientCertificateFile
和KMIP服务器强制执行TLS 1.2时,使用KMIP服务器启用加密失败。
要在Windows上启用KMIP的静态加密,您必须
将客户端证书导入Windows证书存储。
使用
--kmipClientCertificateSelector
选项。
以下操作会在您的密钥管理器中创建一个新的主密钥。 mongod
使用主密钥来加密为每个数据库生成的密钥。
mongod --enableEncryption \ --kmipServerName <KMIP Server HostName> \ --kmipPort <KMIP server port> \ --kmipServerCAFile ca.pem \ --kmipClientCertificateFile client.pem
mongod
在启动时验证与KMIP服务器的连接。
在--kmipServerName
中指定的服务器名称必须与KMIP服务器提供的证书上的Subject Alternative Name (SAN) 或Common Name (CN) 匹配。 SAN
可以是一个系统名称或IP地址。
如果存在SAN
,mongod
将不会尝试与CN
匹配。
如果KMIP服务器的主机名或IP地址既不匹配SAN
也不匹配CN
,则mongod
不会启动。
要验证密钥创建和使用是否成功,请检查日志文件。如果成功,进程将记录以下消息
[initandlisten] Created KMIP key with id: <UID> [initandlisten] Encryption key manager initialized using master key with id: <UID>
使用现有密钥进行加密
您可以使用KMIP服务器已经管理的现有主密钥。要使用现有密钥,启动mongod
时使用以下选项以将mongod
连接到密钥管理器
要连接到1.0或1.1版本的KMIP服务器,请使用--kmipUseLegacyProtocol
选项。
根据您的配置需要包括附加选项。例如,如果您希望远程客户端连接到您的部署或您的部署成员在不同的主机上运行,请指定--bind_ip
。
mongod --enableEncryption \ --kmipServerName <KMIP Server HostName> \ --kmipPort <KMIP server port> \ --kmipServerCAFile ca.pem \ --kmipClientCertificateFile client.pem \ --kmipKeyIdentifier <UID>
mongod
在启动时验证与KMIP服务器的连接。
在--kmipServerName
中指定的服务器名称必须与KMIP服务器提供的证书上的Subject Alternative Name (SAN) 或Common Name (CN) 匹配。 SAN
可以是一个系统名称或IP地址。
如果存在SAN
,mongod
将不会尝试与CN
匹配。
如果KMIP服务器的主机名或IP地址既不匹配SAN
也不匹配CN
,则mongod
不会启动。
本地密钥管理
重要
使用密钥文件方法不符合大多数监管密钥管理指南,并需要用户安全地管理自己的密钥。
密钥文件的安全管理至关重要。
要使用密钥文件进行加密,您必须拥有一个包含单个16或32字符字符串的base64编码的密钥文件。密钥文件只能由mongod
进程的所有者访问。
使用16或32字符字符串创建base64编码的密钥文件。您可以使用任何您喜欢的生成方法来创建编码的密钥文件。例如,
openssl rand -base64 32 > mongodb-keyfile 更新文件权限。
chmod 600 mongodb-keyfile 要使用密钥文件,请使用以下选项启动
mongod
--enableEncryption
,--encryptionKeyFile <密钥文件路径>
,
mongod --enableEncryption --encryptionKeyFile mongodb-keyfile 根据您的配置需要包括附加选项。例如,如果您希望远程客户端连接到您的部署或您的部署成员在不同的主机上运行,请指定
--bind_ip
。验证加密密钥管理器是否成功初始化密钥文件。如果操作成功,进程将记录以下消息
[initandlisten] Encryption key manager initialized with key file: <path to keyfile>
加密现有数据
MongoDB无法加密现有数据。当您使用新密钥启用加密时,MongoDB实例不能有任何预存数据。
如果您使用的是包含现有数据的副本集,请使用滚动初始同步来加密数据。
例如,考虑一个包含三个成员的副本集。副本集正在使用中并持有您想要加密的数据。以下是加密静止数据的步骤
准备服务器。
按照以下步骤准备服务器
选择一个次要服务器。
停止次要服务器上的
mongod
。可选:备份
dbPath
中的数据。如果不需要完整备份,请考虑仅备份diagnostic.data
目录以保留可能有用的故障排除数据。有关更多信息,请参阅全时段诊断数据捕获。从
dbPath
中删除文件和目录。
启用加密。
使用加密启用启动二级服务器。MongoDB实例创建新的密钥库。
同步数据。
从主节点导入数据。启动mongod进程,指定适当的复制选项。
MongoDB在同步过程中进行初始同步并加密数据。
在二级节点上重复此过程。
当第一个二级节点完成数据导入和加密后,在其他mongod
实例上重复此过程。