南冒网站建设制作推广公司,dedeseo网站,免费网站推广2023,手机免费云服务器永久使用文章目录 简介1.已经过时的qemu自带的加密方式介绍1.1.创建secret uuid的xml1.2.产生uuid1.3.给secret赋值1.4.创建一个存储池1.5.在存储池中创建一个镜像1.6.在虚拟机中使用该镜像 2.弃用以上加密方式2.1.原作者Daniel Berrange的观点2.2.Markus Armbruster更深入的操作 3. LU… 文章目录 简介1.已经过时的qemu自带的加密方式介绍1.1.创建secret uuid的xml1.2.产生uuid1.3.给secret赋值1.4.创建一个存储池1.5.在存储池中创建一个镜像1.6.在虚拟机中使用该镜像 2.弃用以上加密方式2.1.原作者Daniel Berrange的观点2.2.Markus Armbruster更深入的操作 3. LUKS(Linux Unified Key Setup)加密简介4.Libvirt对镜像进行LUKS加密4.1.需要的文件 4.2.步骤4.3.结论Reference 简介
本文介绍两种qemu镜像加密方式一种是已经过时的方式另外一种是luks方式作为对比和学习使用。
1.已经过时的qemu自带的加密方式介绍
这种加密方式已经被原作者(Daniel P. Berrange berrangeredhat.com)废除(deprecated)本章节先介绍一下这种方式的基本操作和废除原因123以避免日后使用使用方式或者研究思路有错误。
1.1.创建secret uuid的xml
# cat demo-secret.xml
secret ephemeralno privatenouuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f/uuidusage typevolumevolume/home/VirtualMachines/demo.qcow2/volume/usage
/secretephemeral是短暂的意思如果设置为yes则vm重启之后加密就会消失这一般应用于有第三方加密管理的情况下这里选择no。 privacy是表明是否libvirt可以给用户看到与该uuid关联的secret信息如果设置为yes就是writeonly的。 uuid就是一个secret的唯一标识如果不指定uuid下一步会随机生成一个。
1.2.产生uuid
# virsh secret-define demo-secret.xmlSecret 1a81f5b2-8403-7b23-c8d6-21ccc2f80d6f created1.3.给secret赋值
# MYSECRETecho open seseme | base64# virsh secret-set-value 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f $MYSECRETSecret value setbase64是一种编码格式这样一个拥有唯一标识符uuid的secret就产生完整了。
1.4.创建一个存储池
#virsh pool-dumpxml VirtualMachines
pool typedirnameVirtualMachines/namesource/sourcetargetpath/home/VirtualMachines/path/target
/pool这是一个目录类型的存储池必须先用mkdir创建/home/VirtualMachines目录
#virsh pool-define xxxx.xml1.5.在存储池中创建一个镜像
# cat demo-disk.xml
volumenamedemo.qcow2/namecapacity5368709120/capacitytargetformat typeqcow2/encryption formatqcowsecret typepassphrase uuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f//encryption/target
/volume# virsh vol-create VirtualMachines demo-disk.xml
Vol demo.qcow2 created from demo-disk.xml可以查看该demo.qcow2的信息
# file demo.qcow2
demo.qcow2: QEMU QCOW Image (v2), 5368709120 bytes, AES-encrypted.这里注意该’passphrase’ 并没有按照例子设置具体值也能正常工作。
1.6.在虚拟机中使用该镜像
# cat demo-guest.xml
domain typeqemunamedemo/namememory500200/memoryvcpu4/vcpuostype archi686 machinepchvm/typekernel/home/vmlinuz-PAE/kernelinitrd/home/initrd-PAE.img/initrdboot devhd//osdevicesemulator/usr/bin/qemu-kvm/emulatordisk typefile devicediskdriver nameqemu typeqcow2/source file/home/VirtualMachines/demo.qcow2/target devhda buside/encryption formatqcowsecret typepassphrase uuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f//encryption/diskinput typetablet bususb/input typemouse busps2/graphics typevnc port-1 autoportyes//devices
/domain这是一个空硬盘可以直接用内核文件vmlinuz和initrd做PXE启动。
2.弃用以上加密方式
2.1.原作者Daniel Berrange的观点
A. AES-CBC加密算法本身很脆弱容易受到选择明文攻击 B. 本实现直接用的1.3小节中的passphrase当作加密密钥密钥的选择不安全太短并且缺乏随机性 C. 当加密被入侵之后没有机制可以修改密钥镜像安全得不到保证
2.2.Markus Armbruster更深入的操作
首先创建三个文件4
[rootlocalhost home]# qemu-img create -f raw backing.img 4m
Formatting backing.img, fmtraw size4194304
[rootlocalhost home]# qemu-img create -f qcow2 -o encryption,backing_filebacking.img,backing_fmtraw geheim.qcow2 4m
Formatting geheim.qcow2, fmtqcow2 size4194304 backing_filebacking.img backing_fmtraw encryptionon cluster_size65536 lazy_refcountsoff refcount_bits16
[rootlocalhost home]# qemu-img create -f qcow2 -o backing_filebacking.img, backing_fmtraw normal.qcow2 4m
Formatting normal.qcow2, fmtqcow2 size4194304 backing_filebacking.img backing_fmtraw encryptionoff cluster_size65536 lazy_refcountsoff refcount_bits16这里qemu-img执行了三次可以看到出现了一个backing_file参数如果“-o”选项中使用了backing_file这个选项来指定其后端镜像文件那么这个创建的镜像文件仅记录与后端镜像文件的差异部分。后端镜像文件不会被修改除非在QEMU monitor中使用“commit”命令或者使用“qemu-img commit”命令去手动提交这些改动。这种情况下size参数不是必须需的其值默认为后端镜像文件的大小。另外直接使用“-b backfile”参数也与“-o backing_filebackfile”效果相同。 剩下的操作现在的QEMU版本已经不支持会提示报错
[rootlocalhost home]# qemu-system-x86_64 -nodefaults -display none -monitor stdio geheim.qcow2
qemu-system-x86_64: -monitor stdio: Use of AES-CBC encrypted qcow2 images is no longer supported in system emulators剩下的分析可以查看附录[2]当前QEMU版本推荐的硬盘加密方式是LUKS(Linux Unified Key Setup)。
3. LUKS(Linux Unified Key Setup)加密简介
#用vmware添加一块新磁盘/dev/sdc然后进行加密
[rootlocalhost ~]# cryptsetup -v -y -c aes-cbc-plain luksFormat /dev/sdcWARNING!This will overwrite data on /dev/sdc irrevocably.Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
Command successful.
#映射分区需要输入密码之后就不用了
[rootlocalhost ~]# cryptsetup luksOpen /dev/sdc test_disk //把sdb1映射为test_disk
Enter passphrase for /dev/sdc:
[rootlocalhost ~]# ll -d /dev/mapper/test_disk
lrwxrwxrwx. 1 root root 7 Oct 19 02:02 /dev/mapper/test_disk - ../dm-2
#查看映射分区状态
[rootlocalhost ~]# cryptsetup status /dev/mapper/
cl-root cl-swap control test_disk
[rootlocalhost ~]# cryptsetup status /dev/mapper/cl-root
[rootlocalhost ~]# cryptsetup status /dev/mapper/cl-swap
[rootlocalhost ~]# cryptsetup status /dev/mapper/control
/dev/mapper/control is inactive.
[rootlocalhost ~]# cryptsetup status /dev/mapper/test_disk
/dev/mapper/test_disk is active.type: LUKS1cipher: aes-cbc-plainkeysize: 256 bitsdevice: /dev/sdcoffset: 4096 sectorssize: 10481664 sectorsmode: read/write可以看到未加密的映射分区是没有加密信息的其中有个/dev/mapper/control不知道是做什么的以后再研究。可以看到/dev/mapper/test_disk分区的加密信息使用的aes-cbc-plain加密算法用qemu-img命令生成的加密镜像从qemu报错可以看出现在的qemu版本不支持这种aes-cbc算法目前无法确定用LUKS生成的加密镜像如果用这种算法qemu会不会报错猜测是会报错的后面再进行验证。
#挂载分区
[rootlocalhost home]# mkfs.xfs /dev/mapper/test_disk
meta-data/dev/mapper/test_disk isize512 agcount4, agsize327552 blks sectsz512 attr2, projid32bit1 crc1 finobt0, sparse0
data bsize4096 blocks1310208, imaxpct25 sunit0 swidth0 blks
naming version 2 bsize4096 ascii-ci0 ftype1
log internal log bsize4096 blocks2560, version2 sectsz512 sunit0 blks, lazy-count1
realtime none extsz4096 blocks0, rtextents0
[rootlocalhost home]# mount /dev/sdc /home/crypto_test/
mount: unknown filesystem type crypto_LUKS //不能直接挂载要挂载在映射设备上
[rootlocalhost home]# mount /dev/mapper/test_disk /home/crypto_test/
[rootlocalhost home]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/test_disk 5.0G 33M 5.0G 1% /home/crypto_test挂载成功。
#关闭映射先卸载后关闭
[rootlocalhost home]# umount /home/crypto_test/
[rootlocalhost home]# cryptsetup status /dev/mapper/test_disk
/dev/mapper/test_disk is active.type: LUKS1cipher: aes-cbc-plainkeysize: 256 bitsdevice: /dev/sdcoffset: 4096 sectorssize: 10481664 sectorsmode: read/write
[rootlocalhost home]# cryptsetup luksClose test_disk
[rootlocalhost home]# cryptsetup status /dev/mapper/test_disk
/dev/mapper/test_disk is inactive.4.Libvirt对镜像进行LUKS加密
4.1.需要的文件
参考第1节步骤和需要的文件几乎完全一样只是加密方式不同。本节只标出不同的地方其他步骤参考第1节5。 需要的文件为demo-disk.xml demo-pool.xml demo-secret.xml
#demo-secret.xml
secret ephemeralno privateyesuuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f/uuidusage typevolumevolume/home/crypto-test/twofish.luks/volume/usage
/secret#demo-pool.xml
pool typedirnametest-pool/namesource/sourcetargetpath/home/crypto-test/path/target
/pool#demo-disk.xml
volumenametwofish.luks/namecapacity3111111111/capacitytargetformat typeraw/encryption formatlukssecret typepassphrase uuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f/cipher nametwofish size256 modecbc hashsha256/ivgen nameplain64 hashsha256//encryption/target
/volume差异在于
format typeraw/和encryption formatluks4.2.步骤
#查看镜像文件格式
[rootlocalhost crypto-test]# file twofish.luks
twofish.luks: LUKS encrypted file, ver 1 [twofish, cbc-plain64:sha256, sha256] UUID: c46eef30-b6c2-473a-959d-84d941b0d893#虚拟机disk配置
disk typefile devicediskdriver nameqemu typeraw/source file/home/crypto-test/twofish.luks/backingStore/target devhda buside/encryption formatlukssecret typepassphrase uuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f//encryptionalias nameide0-0-0/address typedrive controller0 bus0 target0 unit0/
/disk
disk typefile devicecdromdriver nameqemu typeraw/source file/home/ubuntu-14.04.1-server-amd64-20170531.iso/backingStore/target devhdc buside/readonly/alias nameide0-1-0/address typedrive controller0 bus1 target0 unit0/
/disk在使用加密镜像的时候由于实验中建立的是一个空镜像里面没有操作系统因此要带上一个cdrom系统安装好之后测试把encryption formatluks删除会找不到硬盘加密生效。
故意将passphrase的最后一个字母从f改成e再启动虚拟机
encryption formatlukssecret typepassphrase uuid0a81f5b2-8403-7b23-c8d6-21ccc2f80d6e/
/encryption[rootlocalhost home]# virsh start vm_test_2
error: Failed to start domain vm_test_2
error: Secret not found: no secret with matching uuid 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6e4.3.结论
使用了LUKS之后libvirt配置的passphrase不再用来当作生成加密密钥仅仅用来解锁加密密钥并且可以随时更改[3]。并且在demo-disk.xml的encryption标签里面还可以配置成其他的选项来选择加密算法和密钥生成方式。
Reference Using QCow2 disk encryption with libvirt in Fedora 12deprecated ↩︎ [Qemu-devel] [PULL 03/17] block: Deprecate QCOW/QCOW2 encryption ↩︎ QEMU QCow2 built-in encryption: just say no. Deprecated now, to be deleted soon ↩︎ KVM虚拟机磁盘镜像文件管理命令qemu-img介绍及简单使用总结 ↩︎ Secret XML format ↩︎