zoukankan      html  css  js  c++  java
  • Qcow2 disk encrypted

    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之前,一定要保证虚拟机使用的加密磁盘先被处理掉。

  • 相关阅读:
    [UE4]利用取模运算达到循环遍历数组的目的
    RESTful登录设计(基于Spring及Redis的Token鉴权)
    Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    业务中使用分布式的场景
    mycat系列-Mycat 分片规则
    MyCat
    mysql 分区说明
    mysql 表分区 查看表分区 修改表分区
    MySql 分区 分库 分表
    tomcat7部署多个web应用不同编码,端口
  • 原文地址:https://www.cnblogs.com/fengrenzw/p/3345787.html
Copyright © 2011-2022 走看看