Qcow2 相对于 Raw格式的磁盘有以下几种特性:
Backing File(也是我一直使用qcow2的原因)
Snapshot(Cow在qcow2 中除Backing File以外的另一种应用模式)
Compress(还没有研究过)
Encrypted(加密)
参考的帖子:---》传送门《---
不知是因为qemu设计的bug还是其他原因,使用qemu-img create 创建的镜像中指定qcow2 指定加密参数,创建磁盘时并不会提示输入初识密码,也就是密码是空,也没有发现可以修改密码的方法(除了convert)。
[root@localhost modules]# qemu-img create -f qcow2 -o encryption encrypted.img 1G
Formatting 'encrypted.img', fmt=qcow2 size=1073741824 encryption=on cluster_size=65536
[root@localhost modules]# qemu-img info encrypted.img
Disk image 'encrypted.img' is encrypted.
password:
image: encrypted.img
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 136K
encrypted: yes
cluster_size: 65536
显示的是需要输入密码,但此时如论输入什么都可以通过验证。
通过convert的方式将已有的磁盘装换格式时,附加密码。
[root@localhost modules]# qemu-img convert -f raw -O qcow2 -o encryption redhat6u2_x64_10G.img test.qcow2
Disk image 'test.qcow2' is encrypted.
password:
输入密码确认,就可以进行格式转换。
使用qemu-img info 或者其他使用磁盘的时候就需要输入密码才可以继续进行。
创建一个使用加密磁盘做boot disk的虚拟机。当虚拟机启动的时候,使用vnc连接到终端,发现终端是黑的,并没有任何字符。在qmp终端输入cont,返回输入密码提示。输入密码,从磁盘启动。
[root@localhost modules]# /usr/libexec/qemu-kvm -drive file=test.qcow2,format=qcow2 -monitor stdio -vnc 0.0.0.0:1
QEMU 0.12.1 monitor - type 'help' for more information
(qemu) cont
ide0-hd0 (test.qcow2) is encrypted.
Password: ****
当然这个密码也可以是错误的,机器仍然会启动,为什么呢?
我自己的想法:
我们是对虚拟机的磁盘加密,而不是虚拟机,输入密码只是相当于bios一个流程的东西,没有磁盘也是可以启动机器的。
实验结果是,如果密码错误,就不会从磁盘启动,并且磁盘没有被识别。qcow2本身的加密没有做解密认证,也就是任何密码都可以解密,但就像是以毒攻毒,如果使用的毒药不正确,就会毒发身亡。(其实有点像之前听说过的一种加密方式:用txt的形式打开文件,然后在前边添加个1,保存,文件就无法正常使用了,等需要使用的时候,再编辑将1去掉,就可以正常使用。)
通过libvirt 使用qcow2 加密的磁盘
[root@localhost modules]# virsh start test
error: Failed to start domain test
error: internal error unable to execute QEMU command 'cont': Device 'drive-ide0-0-0' is encrypted
( 这也可以间接发现,通过libvirt启动的虚拟机的简易流程。)
在本地创建一个密钥xml
[root@localhost modules]# cat secret.xml
<secret ephemeral='no' private='yes'>
</secret>
libvirt标准的处理流程,define声明一下
[root@localhost modules]# virsh secret-define secret.xml
Secret d2e4c1a1-9ce3-283b-f743-1c516fdccaa0 created
返回一个UUID,下面都是要拿UUID来作为密钥匹配的。
使用命令获取密钥对应的实际密码。
[root@localhost modules]# virsh secret-get-value d2e4c1a1-9ce3-283b-f743-1c516fdccaa0
error: Secret not found: secret 'd2e4c1a1-9ce3-283b-f743-1c516fdccaa0' does not have a value
定义一个密钥,密文为"fengren",需要通过base64 加密传送到密钥中。
[root@localhost modules]# virsh secret-set-value d2e4c1a1-9ce3-283b-f743-1c516fdccaa0 `echo -n "fengren" |base64 `
Secret value set
这个地方不可以直接使用echo
或者
[root@localhost modules]# virsh secret-set-value d2e4c1a1-9ce3-283b-f743-1c516fdccaa0 `printf %s "fengren" |base64 `
Secret value set
再查看一下,因为定义的是私有key,所以这个值是看不到的。如果可以查看到的话,就起不到安全的作用了。
[root@localhost modules]# virsh secret-get-value d2e4c1a1-9ce3-283b-f743-1c516fdccaa0
error: operation secret is private forbidden for read only access
在虚拟机的配置文件磁盘段中添加密钥,后启动虚拟机。
<encryption format='qcow'>
<secret type='passphrase' uuid='d2e4c1a1-9ce3-283b-f743-1c516fdccaa0'/>
</encryption>
[root@localhost modules]# virsh start test
就可以冲破密码的障碍 进入系统了。当然官方建议,为了安全起见,再删除secret之前,一定要保证虚拟机使用的加密磁盘先被处理掉。