当前位置: 首页 > 科技观察

使用Luks2加密CephRbd,你会知道吗?

时间:2023-03-14 12:47:15 科技观察

背??景多个行业(例如金融行业)越来越需要使用租户/用户提供的加密密钥在主机上以卷粒度加密数据。这是由国家法规和对安全的日益重视推动的。迄今为止,CephRBD并未提供任何此类解决方案,现有的替代方案是在libRBD之前添加一个加密层。此类解决方案的示例是使用QEMULUKS或依赖DM-Crypt进行加密。但是,在与RBD层中实现的存储功能接口时,使用RBD之上的加密层存在局限性。当我们镜像克隆时,它只有在父母和孩子使用相同的加密密钥加密时才有效。通过将加密下移到libRBD,可以灵活使用CephRBD克隆。关于luks加密,我们再介绍一下luks。虽然在上一篇已经介绍过了,但是还是没有深究。LUKS有两个版本,LUKS2具有对标头损坏的弹性等特性,默认使用Argon2加密算法,而LUKS1使用PBKDF2。LUKS2支持4KB的加密块大小,而QEMU中的luks1加密工作在加密块粒度,加密单元扇区为512字节,效率较低。目前libvirt只支持luks1和luks2格式的磁盘加密,从qemu4.5开始就不再支持qcow磁盘加密了。加密标签支持可选的引擎标签,目前定义的引擎值有qemu和librbd。qemu和librbd都需要qemu驱动程序才能使用。librbd引擎要求qemu版本>=6.1.0,ceph集群和librbd1>=16.1.0,只适用于RBD网盘。如果没有指定引擎标签,则默认使用qemu引擎。luks2格式目前只有librbd引擎支持,只能应用于RBD网盘(RBD镜像)。我们现在使用的是Ubuntu20.04系统,对应的qemu版本是4.2,libvirt版本是6.0。该版本只能使用luks格式进行加密。如果要使用luks2格式加密,必须将qemu版本升级到6.1以上,libvirt版本升级到7.9以上。升级只能通过编译升级,可惜没有升级成功,不过ubuntu22.04的libvirt版本是8.0,qemu版本是6.2。这里我安装了一个Ubuntu22.04系统验证rbd镜像加密。#virshversionCompiledagainstlibrary:libvirt8.0.0Usinglibrary:libvirt8.0.0UsingAPI:QEMU8.0.0Runninghypervisor:QEMU6.2.0查看libvirt版本列表,发现从2021.11.1发布的7.9版本开始支持librbd加密引擎.加密格式默认情况下,RBD图像未加密。要加密RBD图像,需要将其格式化为受支持的加密格式之一(luks1或luks2)。格式化操作会将加密的元数据写入rbd映像。加密元数据通常包括加密格式和版本、加密算法和模式规范以及用于保护加密密钥的信息等信息。目前只能格式化图像。加密图像的克隆本质上是使用相同的格式和密码加密的。在格式化之前写入图像的任何数据都可能变得不可读,尽管它仍可能占用存储资源。目前仅支持AES-128和AES-256加密算法。另外,xts-plain64是目前唯一支持的加密模式。然而,可以在RBD之外导入现有的LUKS图像。使用luks2格式加密rbd镜像我就不介绍如何使用luks加密cephrbd了。我在上一篇文章中已经介绍过了。这里介绍一下使用luks2加密rbd和格式化图片rbd加密格式{pool-name}/{image-name}{luks1|luks2}{passphrase-file}[–cipher-alg{aes-128|aes-256}]例如root@node1:/yyds#rbdencryptionformatlibvirt-pool/288luks2passphrase-fileroot@node1:/yyds#catpassphrase-file123456加密格式操作生成一个LUKS头并将其写入到图像的开头。标头附加有一个密钥槽,其中包含一个随机生成的加密密钥,由从密码文件读取的密码保护。默认情况下,将使用xts-plain64模式下的AES-256,格式化操作也允许选择AES-128。定义秘密#vimsecret.xml548dff81-a251-4702-90c0-0fc7d0c7754e#virshsecret-defineluks-secret.xmlSecret548dff81-a251-4702-90c0-0fc7d0c7754ecreatedsetpasswordvirshsecret-set-value548dff81-a251-4702-90c0-0fc7d0c7754e--interactive#下面输入磁盘加密密码,必须和格式化密码一样上面的图像Enternewvalueforsecret:Secretvalueseteditvirtualmachinediskfield,addencryption<主机名='node1'port='6789'/><加密格式='luks2'engine='librbd'>启动虚拟机virshstartvmencryptedrbdimagecloneandmountthesub-imageroot@node1:~#rbdsnapcreatelibvirt-pool/288@snapshot_61Creatingsnap:100%complete...done.root@node1:~#rbdsnapprotectlibvirt-pool/288@snapshot_61root@node1:~#rbdclonelibvirt-pool/288@snapshot_61libvirt-pool/388root@node1:~#rbdinfolibvirt-pool/388rbdimage'388':25600个对象中的大小100GiB顺序22(4个MiB对象)snapshot_count:0id:2c2aea7815e969block_name_prefix:rbd_data.2c2aea7815e969格式:2个功能:分层,独占锁,deep-fliffd-map:标志:create_timestamp:星期三Jun108:56:372022access_timestamp:WedJun108:56:372022modify_timestamp:WedJun108:56:372022parent:libvirt-pool/288@snapshot_61overlap:100GiBhereIReplacetheimagenamewith克隆的388,去掉了加密字段,发现无法挂载。克隆的子镜像也被加密。克隆的镜像不支持luks加密root@node1:~#rbdencryptionformatlibvirt-pool/388luks2passphrase-filerbd:encryptionformaterror:2022-06-01T06:39:32.691+00007fc65aba7340-1librbd::api::Image:encryption_format:无法格式化克隆图像(95)不支持操作