注意
本文档适用于 Ceph 开发版本。
图像加密
从太平洋版本开始,图像级别的加密可以由RBD客户端内部处理。这意味着您可以设置一个密钥,用于加密特定的RBD图像。本页面描述了RBD加密功能的作用范围。
Note
The krbd
内核模块当前不支持加密。
Note
外部工具(例如dm-crypt、QEMU)也可以用于加密RBD图像,并且该用途的功能集和限制集可能与此处描述的不同。
加密格式
默认情况下,RBD图像未加密。要加密RBD图像,需要将其格式化为支持的加密格式之一。格式化操作将加密元数据持久化到图像中。加密元数据通常包括有关加密格式和版本、密码算法和模式规范以及用于保护加密密钥的信息。加密密钥本身由用户保留的秘密(通常是密码短语)保护,永远不会持久化。基本的加密格式操作需要指定加密格式和密钥。
部分加密元数据可能作为图像数据的一部分存储,通常加密头会写入原始图像数据的开头。这意味着加密图像的有效大小可能小于原始图像大小。有关更多详细信息,请参阅支持的格式部分。
Note
除非明确(重新)格式化,否则加密图像的克隆将使用相同的格式和密钥进行加密。
Note
加密图像的克隆始终是加密的。
Note
在格式化之前写入图像的任何数据可能会变得无法读取,尽管它可能仍然占用存储资源。
Note
启用了日志功能的图像无法由RBD客户端格式化和加密 enabled cannot be formatted and encrypted by RBD clients.
加密加载
格式化图像是启用加密的必要先决条件。然而,格式化的图像仍然会被所有RBD API视为原始未加密图像。特别是,加密的RBD图像可以使用与其他任何图像相同的API打开,并且可以读取/写入原始未加密数据。此类原始IO可能会危及加密格式的完整性,例如通过覆盖图像开头处的加密元数据。
为了在格式化的图像上安全地执行加密IO,在打开图像后应应用额外的加密加载操作。加密加载操作需要提供加密格式和密钥,以解锁图像本身及其每个明确格式化的祖先图像的加密密钥。加密加载操作成功后,打开的图像的所有IO都将被加密/解密。对于克隆图像,这也包括祖先图像的IO。RBD客户端将加密密钥存储在内存中,直到图像关闭。
Note
一旦加载了加密,就无法在打开的图像上下文中应用其他加密加载/格式操作。
Note
一旦加载了加密,使用打开的图像上下文检索图像大小和父重叠的API调用将分别返回有效图像大小和有效父重叠。
Note
一旦加载了加密,用于调整图像大小的API调用将解释指定的目标大小为有效图像大小。
Note
如果加密图像的克隆被明确格式化,则展平克隆图像的操作将不再透明,因为父数据必须根据克隆图像格式重新加密,因为它从父快照复制。如果在发出展平操作之前未加载加密,则克隆图像中之前可访问的任何父数据可能会变得无法读取。
Note
如果加密图像的克隆被明确格式化,则缩小克隆图像的操作将不再透明,因为在某些情况下(例如,如果克隆图像有快照或如果克隆图像正在缩小到与对象大小不一致的大小),它涉及从父快照复制一些数据,类似于展平。如果在发出缩小操作之前未加载加密,则克隆图像中之前可访问的任何父数据可能会变得无法读取。
Note
加密加载可以在通过rbd-nbd.
支持的格式
LUKS
LUKS1和LUKS2都受支持。数据布局完全符合LUKS规范。因此,RBD格式化的图像可以使用支持LUKS的外部工具(如dm-crypt或QEMU)加载。此外,在RBD之外创建的现有LUKS数据可以导入(通过将原始LUKS数据复制到图像中)并由RBD加密加载。
Note
LUKS格式仅在基于Linux的系统中受支持。
Note
目前,仅支持AES-128和AES-256加密算法。此外,xts-plain64是目前唯一支持的加密模式。
要使用LUKS格式,请首先格式化图像:
rbd encryption format [--cipher-alg {aes-128|aes-256}] {image-spec} {luks1|luks2} {passphrase-file}
加密格式化操作生成LUKS头并将其写入图像的开头。头附加了一个包含随机生成的加密密钥的密钥槽,并由从密码短语文件.
Note
在旧版本中,如果密码短语文件的内容以换行符结尾,则会将其删除。
默认情况下,使用xts-plain64模式(这是当前推荐的模式,也是其他工具的通常默认值)的AES-256将被使用。格式化操作允许选择AES-128。添加/删除密码短语目前不受RBD支持,但可以使用兼容的工具(如cryptsetup)应用于原始RBD数据。
LUKS头的大小可能不同(在LUKS2中最多可达136MiB),但通常最多为16MiB,具体取决于libcryptsetup安装的版本。为了获得最佳性能,加密格式化将设置数据偏移量与图像条带周期大小对齐。例如,如果使用配置了8MiB对象大小的图像,则预期最小开销为8MiB;如果使用配置了4MiB对象大小和条带计数的图像,则预期最小开销为12MiB。
在LUKS1中,扇区(最小加密单元)固定为512字节。LUKS2支持更大的扇区,为了更好的性能,我们将默认扇区大小设置为最大4KiB。小于扇区或未对齐到扇区开始的写入将触发客户端上的受保护读取-修改-写入链,并会产生相当大的延迟惩罚。一批此类未对齐的写入可能导致IO竞争,从而进一步降低性能。因此,建议避免在无法保证传入写入对齐到扇区的情况下使用RBD加密。
要映射LUKS格式化的图像,请运行:
rbd device map -t nbd -o encryption-passphrase-file={passphrase-file} {image-spec}
请注意,出于安全原因,加密格式化和加密加载操作都是CPU密集型的,并且可能需要几秒钟才能完成。对于实际图像IO的加密操作,假设AES-NI已启用,应添加相对较小的微秒级延迟,以及CPU利用率的轻微增加。
示例
使用50GiB的有效大小创建LUKS2格式化的图像:
rbd create --size 50G mypool/myimage
rbd encryption format mypool/myimage luks2 passphrase.bin
rbd resize --size 50G --encryption-passphrase-file passphrase.bin mypool/myimage
rbd resize
命令末尾会增长图像以弥补与LUKS2头相关的开销。
给定一个LUKS2格式化的图像,创建一个具有相同有效大小的LUKS2格式化的克隆:
rbd snap create mypool/myimage@snap
rbd snap protect mypool/myimage@snap
rbd clone mypool/myimage@snap mypool/myclone
rbd encryption format mypool/myclone luks2 clone-passphrase.bin
给定一个有效大小为50GiB的LUKS2格式化图像,创建一个具有相同有效大小的LUKS1格式化的克隆:
rbd snap create mypool/myimage@snap
rbd snap protect mypool/myimage@snap
rbd clone mypool/myimage@snap mypool/myclone
rbd encryption format mypool/myclone luks1 clone-passphrase.bin
rbd resize --size 50G --allow-shrink --encryption-passphrase-file clone-passphrase.bin --encryption-passphrase-file passphrase.bin mypool/myclone
由于LUKS1头通常比LUKS2头小,rbd resize
命令末尾会缩小克隆图像以消除不需要的空间分配。
给定一个有效大小为50GiB的LUKS1格式化图像,创建一个具有相同有效大小的LUKS2格式化的克隆:
rbd resize --size 51G mypool/myimage
rbd snap create mypool/myimage@snap
rbd snap protect mypool/myimage@snap
rbd clone mypool/myimage@snap mypool/myclone
rbd encryption format mypool/myclone luks2 clone-passphrase.bin
rbd resize --size 50G --allow-shrink --encryption-passphrase-file passphrase.bin mypool/myimage
rbd resize --size 50G --allow-shrink --encryption-passphrase-file clone-passphrase.bin --encryption-passphrase-file passphrase.bin mypool/myclone
由于LUKS2头通常比LUKS1头大,rbd resize
命令开头会临时增长父图像以在父快照中预留一些额外的空间,从而父图像的克隆图像也会预留空间。这是必要的,以便在克隆图像中访问所有父数据。rbd resize
命令末尾将父图像缩回其原始大小(这不会影响父快照)并将克隆图像缩小以消除未使用的预留空间。
这同样适用于创建未格式化(明文)图像的格式化克隆,因为未格式化的图像根本没有任何头。
要映射格式化的克隆,请为克隆本身及其所有明确格式化的父图像提供加密格式和密码短语。应提供的选项的顺序基于图像层次结构:从克隆图像开始,然后是其父图像,依此类推。encryption-format
和encryption-passphrase-file
options should be provided is based on the image hierarchy: start with
that of the cloned image, then its parent and so on.
以下是一个映射格式化克隆的命令示例:
rbd device map -t nbd -o encryption-passphrase-file=clone-passphrase.bin,encryption-passphrase-file=passphrase.bin mypool/myclone
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.