配置加密
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) 的密钥管理设备来安全地传输密钥。
有关 MongoDB 认证合作伙伴的列表,请参阅合作伙伴列表。
提示
推荐
使用密钥管理器符合监管密钥管理准则,例如 HIPAA、PCI-DSS 和 FERPA。而且相比本地密钥管理,密钥管理器更推荐使用。
先决条件
密钥管理器必须支持 KMIP 通信协议。
默认 KMIP 协议版本是 1.2。您可以在 MongoDB 服务器 配置文件中将 MongoDB 配置为使用 KMIP 1.0 或 1.1 版本。
对于使用 KMIP 与第三方密钥管理设备进行的集成,您应允许以下 KMIP 操作:
创建(
operation_create
)获取 (
operation_get
)激活 (
operation_activate
)
要在 KMIP 服务器上对 MongoDB 进行身份验证,您必须拥有密钥管理设备颁发的有效证书。
注意
Windows 上的 MongoDB Enterprise 不再支持将 AES256-GCM
作为静态加密的分组密码算法。仅 Linux 版本支持此用法。
使用新密钥加密
要在连接密钥管理器时创建新密钥,请使用以下选项启动 mongod
:
要连接到 1.0 或 1.1 版本的 KMIP 服务器,请使用 --kmipUseLegacyProtocol
选项。
根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip
。
以下操作将在密钥管理器中创建新的主密钥。mongod
使用主密钥对 mongod
为每个数据库所生成的密钥进行加密。
mongod --enableEncryption \ --kmipServerName <KMIP Server HostName> \ --kmipPort <KMIP server port> \ --kmipServerCAFile ca.pem \ --kmipClientCertificateFile client.pem
mongod
启动时验证与 KMIP 服务器的连接。
--kmipServerName
中指定的服务器名称必须与 KMIP 服务器出示的证书上的主题备用名称 SAN
或公用名 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 服务器出示的证书上的主题备用名称 SAN
或公用名 CN
相匹配。SAN
可以是系统名称或 IP 地址。
如果存在 SAN
,则 mongod
不会尝试与 CN
配对。
如果 KMIP 服务器的主机名或 IP 地址与 SAN
和 CN
都不匹配,则 mongod
不会启动。
本地密钥管理
重要
使用密钥文件方法不符合大多数监管密钥管理准则,因而需要用户安全地管理自己的密钥。
密钥文件的安全管理至关重要。
要使用密钥文件进行加密,您必须拥有一个采用 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
实例上重复该进程。