配置加密
版本 3.2 中的新增功能。
Overview
本页将讨论用于支持静态加密的服务器配置。如果您使用的是 MongoDB Atlas,您的数据已经被加密。MongoDB 在云提供商级别管理 Atlas 加密,但您也可以使用自己的密钥管理解决方案。有关详情信息,请参阅 Atlas 密钥管理文档。
MongoDB Enterprise 3.2 为 WiredTiger 存储引擎引入了一个原生加密选项。在 Atlas 之外,加密仅适用于使用 WiredTiger 存储引擎的企业安装。
加密密钥的安全管理是存储加密的一项关键要求。MongoDB 使用一个主密钥,该密钥不会与 MongoDB 安装的文件一起存储。只有主密钥是在外部管理的,其他密钥可以与您的 MongoDB 实例一起存储。
MongoDB 的加密存储引擎支持针对主密钥的两种密钥管理选项:
通过 Key Management Interoperability Protocol (KMIP) 与第三方密钥管理设备集成。推荐
通过密钥文件使用本地密钥管理。
重要
MongoDB 无法加密现有数据。使用新密钥来启用加密时,MongoDB 实例不可有任何预先存在的数据。如果 MongoDB 安装已包含数据,则请参阅对现有数据进行静态加密以了解其他步骤。
密钥管理器
MongoDB Enterprise 支持使用兼容的密钥管理设备来安全地传输密钥。使用密钥管理器可将密钥存储在密钥管理器中。
MongoDB Enterprise 支持使用符合 Key Management Interoperability Protocol (KMIP) 的密钥管理设备来安全传输密钥。 任何为 KMIP 提供支持的设备供应商都应该是兼容的。
有关 MongoDB 认证合作伙伴的列表,请参阅合作伙伴列表。
提示
推荐
使用密钥管理器符合监管密钥管理准则,例如 HIPAA、PCI-DSS 和 FERPA。而且相比本地密钥管理,密钥管理器更推荐使用。
先决条件
密钥管理器必须支持 KMIP 通信协议。
对于使用 KMIP 与第三方密钥管理设备进行的集成,您应允许以下 KMIP 操作:
创建(
operation_create
)获取 (
operation_get
)激活 (
operation_activate
)
要在 KMIP 服务器上对 MongoDB 进行身份验证,您必须拥有密钥管理设备颁发的有效证书。
注意
Windows 上的 MongoDB Enterprise 不再支持将 AES256-GCM
作为静态加密的分组密码算法。仅 Linux 版本支持此用法。
使用新密钥加密
要创建新密钥,请使用以下选项启动 ,将mongod
mongod
连接到密钥管理器:
根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip
。
以下操作在密钥经理中创建一个新的主密钥, mongod
使用该主密钥加密mongod
为每个数据库生成的密钥。
mongod --enableEncryption --kmipServerName <KMIP Server HostName> \ --kmipPort <KMIP server port> --kmipServerCAFile ca.pem \ --kmipClientCertificateFile client.pem
连接到 KMIP 服务器时, mongod
CN
验证指定的SAN
--kmipServerName
SAN
与以下内容匹配: KMIP 服务器。 [1]如果SAN
存在,则mongod
与CN
不匹配。 如果主机名与SAN
(或CN
)不匹配,则mongod
将无法连接。
要确保密钥创建和使用成功,请检查日志文件。如果已成功,此进程则会记录以下消息:
[initandlisten] Created KMIP key with id: <UID> [initandlisten] Encryption key manager initialized using master key with id: <UID>
使用现有密钥进行加密
您可以使用 KMIP 服务器创建和托管的现有主密钥。要使用现有密钥,请使用以下选项启动mongod
mongod
,将 连接到经理:
根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip
。
mongod --enableEncryption --kmipServerName <KMIP Server HostName> \ --kmipPort <KMIP server port> --kmipServerCAFile ca.pem \ --kmipClientCertificateFile client.pem --kmipKeyIdentifier <UID>
连接到 KMIP 服务器时, mongod
CN
验证指定的SAN
--kmipServerName
SAN
与以下内容匹配: KMIP 服务器。 [1]如果SAN
存在,则mongod
与CN
不匹配。 如果主机名与SAN
(或CN
)不匹配,则mongod
将无法连接。
[1] | ( 1 , 2 )从 MongoDB 4.2 开始,在执行 SAN 比较时,MongoDB 支持比较 DNS 名称或 IP 地址。 在以前的版本中,MongoDB 仅支持 DNS 名称的比较。 |
本地密钥管理
重要
使用密钥文件方法不符合大多数监管密钥管理准则,因而需要用户安全地管理自己的密钥。
密钥文件的安全管理至关重要。
要使用密钥文件进行加密,您必须拥有一个采用 Base64 编码的密钥文件(包含单个 16 或 32 个字符的字符串)。密钥文件只能由 mongod
进程的所有者访问。
使用 16 或 32 个字符组成的字符串来创建 Base64 编码的密钥文件。您可使用任何您偏好的方法来生成编码后的密钥文件。例如,
openssl rand -base64 32 > mongodb-keyfile 更新文件权限。
chmod 600 mongodb-keyfile 要使用密钥文件,请使用以下选项启动
mongod
:--enableEncryption
,--encryptionKeyFile <path to keyfile>
,
mongod --enableEncryption --encryptionKeyFile mongodb-keyfile 根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定
--bind_ip
。验证加密密钥管理器是否使用密钥文件成功初始化。如果操作成功,该进程将记录以下消息:
[initandlisten] Encryption key manager initialized with key file: <path to keyfile>
对现有数据进行静态加密
MongoDB 无法加密现有数据。使用新密钥来启用加密时,MongoDB 实例不能有任何预先存在的数据。
如果使用的副本集确有现有数据,请使用滚动初始同步来加密该数据。
例如,试想一个有三个节点的副本集。该副本集正在使用且持有您要加密的数据。您对该数据进行静态加密时应采取的步骤如下:
同步数据。
从主节点导入数据。启动 mongod 进程,从而按需指定复制选项。
mongod
执行初始同步,并在同步过程中加密数据。
在从节点上重复执行此流程。
当第一个从节点完成导入和加密数据后,在其他从节点 mongod
实例上重复该进程。