4.2. 加密加载
默认情况下,所有 RBD API 都会像未加密的 RBD 镜像一样对待加密的 RBD 镜像。您可以在镜像的任意位置读取或写入原始数据。在镜像中写入原始数据可能会使加密格式的完整性风险。例如,原始数据可能会覆盖位于镜像开头的加密元数据。要安全地对加密的输入/输出(I/O)或维护操作对加密的 RBD 镜像执行,必须在打开镜像后立即应用额外的加密负载操作。
加密负载操作要求您指定加密格式和密码短语,用于解锁镜像本身的加密密钥及其每个明确格式化的镜像。已打开的 RBD 镜像的所有 I/O 都是加密或解密克隆的 RBD 镜像,这包括父镜像的 IO。加密密钥由 RBD 客户端保存在内存中,直到镜像关闭为止。
在 RBD 镜像中载入加密后,就无法应用其他加密加载或格式操作。此外,使用打开的镜像上下文检索 RBD 镜像大小和父级重叠的 API 调用可分别返回有效的镜像大小和有效的父重叠。当 RBD 镜像通过 rbd-nbd
将 RBD 镜像映射为块设备时,会自动载入加密。
用于检索镜像大小的 API 调用和使用打开的镜像上下文返回有效的镜像大小和有效的父重叠。
如果加密镜像的克隆被明确格式化,则克隆的镜像的扁平化或缩小需要透明的,因为父数据必须根据克隆的镜像格式重加密,因为它是从父快照复制的。如果在发出 flatten 操作前没有载入加密,则之前在克隆的镜像中访问的父数据可能会变得不可读取。
如果明确格式化了加密镜像的克隆,则缩减克隆的镜像的操作是透明的。这是因为,在克隆的镜像(如包含快照或克隆的镜像)与与对象大小不一致的大小相同时,会涉及从父快照复制一些数据的操作,类似于扁平化。如果在发出缩小操作前没有载入加密,则之前在克隆的镜像中访问的父数据可能变得不可读取。