Qemu镜像安全加密测试

文章目录

  • 简介
  • 1.已经过时的qemu自带的加密方式介绍
    • 1.1.创建secret uuid的xml
    • 1.2.产生uuid
    • 1.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 berrange@redhat.com)废除(deprecated),本章节先介绍一下这种方式的基本操作和废除原因123,以避免日后使用使用方式或者研究思路有错误。

1.1.创建secret uuid的xml

# cat demo-secret.xml
<secret ephemeral='no' private='no'><uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid><usage type='volume'><volume>/home/VirtualMachines/demo.qcow2</volume></usage>
</secret>

ephemeral是短暂的意思,如果设置为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 created

1.3.给secret赋值

# MYSECRET=`echo "open seseme" | base64`# virsh secret-set-value 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f $MYSECRETSecret value set

base64是一种编码格式,这样,一个拥有唯一标识符uuid的secret就产生完整了。

1.4.创建一个存储池

#virsh pool-dumpxml VirtualMachines

<pool type='dir'><name>VirtualMachines</name><source></source><target><path>/home/VirtualMachines</path></target>
</pool>

这是一个目录类型的存储池,必须先用mkdir创建/home/VirtualMachines目录

#virsh pool-define xxxx.xml

1.5.在存储池中创建一个镜像

# cat demo-disk.xml
<volume><name>demo.qcow2</name><capacity>5368709120</capacity><target><format type='qcow2'/><encryption format='qcow'><secret type='passphrase' uuid='0a81f5b2-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 type='qemu'><name>demo</name><memory>500200</memory><vcpu>4</vcpu><os><type arch='i686' machine='pc'>hvm</type><kernel>/home/vmlinuz-PAE</kernel><initrd>/home/initrd-PAE.img</initrd><boot dev='hd'/></os><devices><emulator>/usr/bin/qemu-kvm</emulator><disk type='file' device='disk'><driver name='qemu' type='qcow2'/><source file='/home/VirtualMachines/demo.qcow2'/><target dev='hda' bus='ide'/><encryption format='qcow'><secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/></encryption></disk><input type='tablet' bus='usb'/><input type='mouse' bus='ps2'/><graphics type='vnc' port='-1' autoport='yes'/></devices>
</domain>

这是一个空硬盘,可以直接用内核文件vmlinuz和initrd做PXE启动。

2.弃用以上加密方式

2.1.原作者Daniel Berrange的观点

A. AES-CBC加密算法本身很脆弱,容易受到选择明文攻击
B. 本实现直接用的1.3小节中的passphrase当作加密密钥,密钥的选择不安全,太短并且缺乏随机性
C. 当加密被入侵之后,没有机制可以修改密钥,镜像安全得不到保证

2.2.Markus Armbruster更深入的操作

首先创建三个文件4

[root@localhost home]# qemu-img create -f raw backing.img 4m
Formatting 'backing.img', fmt=raw size=4194304
[root@localhost home]# qemu-img create -f qcow2 -o encryption,backing_file=backing.img,backing_fmt=raw geheim.qcow2 4m
Formatting 'geheim.qcow2', fmt=qcow2 size=4194304 backing_file=backing.img backing_fmt=raw encryption=on cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@localhost home]# qemu-img create -f qcow2 -o backing_file=backing.img, backing_fmt=raw normal.qcow2 4m
Formatting 'normal.qcow2', fmt=qcow2 size=4194304 backing_file=backing.img backing_fmt=raw encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

这里qemu-img执行了三次,可以看到,出现了一个backing_file参数,如果“-o”选项中使用了backing_file这个选项来指定其后端镜像文件,那么这个创建的镜像文件仅记录与后端镜像文件的差异部分。后端镜像文件不会被修改,除非在QEMU monitor中使用“commit”命令或者使用“qemu-img commit”命令去手动提交这些改动。这种情况下,size参数不是必须需的,其值默认为后端镜像文件的大小。另外,直接使用“-b backfile”参数也与“-o backing_file=backfile”效果相同。
剩下的操作,现在的QEMU版本已经不支持,会提示报错

[root@localhost 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,然后进行加密
[root@localhost ~]#  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.
#映射分区,需要输入密码,之后就不用了
[root@localhost ~]# cryptsetup luksOpen /dev/sdc test_disk //把sdb1映射为test_disk
Enter passphrase for /dev/sdc: 
[root@localhost ~]# ll -d /dev/mapper/test_disk 
lrwxrwxrwx. 1 root root 7 Oct 19 02:02 /dev/mapper/test_disk -> ../dm-2
#查看映射分区状态
[root@localhost ~]# cryptsetup status /dev/mapper/
cl-root    cl-swap    control    test_disk  
[root@localhost ~]# cryptsetup status /dev/mapper/cl-root 
[root@localhost ~]# cryptsetup status /dev/mapper/cl-swap 
[root@localhost ~]# cryptsetup status /dev/mapper/control 
/dev/mapper/control is inactive.
[root@localhost ~]# 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会不会报错,猜测是会报错的,后面再进行验证。

#挂载分区
[root@localhost home]# mkfs.xfs /dev/mapper/test_disk 
meta-data=/dev/mapper/test_disk  isize=512    agcount=4, agsize=327552 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310208, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost home]# mount /dev/sdc /home/crypto_test/
mount: unknown filesystem type 'crypto_LUKS'  //不能直接挂载,要挂载在映射设备上
[root@localhost home]# mount /dev/mapper/test_disk /home/crypto_test/
[root@localhost home]# df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/test_disk  5.0G   33M  5.0G   1% /home/crypto_test

挂载成功。

#关闭映射,先卸载后关闭
[root@localhost home]# umount /home/crypto_test/
[root@localhost 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
[root@localhost home]# cryptsetup luksClose test_disk
[root@localhost 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 ephemeral='no' private='yes'><uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid><usage type='volume'><volume>/home/crypto-test/twofish.luks</volume></usage>
</secret>#demo-pool.xml
<pool type='dir'><name>test-pool</name><source></source><target><path>/home/crypto-test</path></target>
</pool>#demo-disk.xml
<volume><name>twofish.luks</name><capacity>3111111111</capacity><target><format type='raw'/><encryption format='luks'><secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/><cipher name='twofish' size='256' mode='cbc' hash='sha256'/><ivgen name='plain64' hash='sha256'/></encryption></target>
</volume>

差异在于

<format type='raw'/><encryption format='luks'>

4.2.步骤

#查看镜像文件格式

[root@localhost 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 type='file' device='disk'><driver name='qemu' type='raw'/><source file='/home/crypto-test/twofish.luks'/><backingStore/><target dev='hda' bus='ide'/><encryption format='luks'><secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/></encryption><alias name='ide0-0-0'/><address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'><driver name='qemu' type='raw'/><source file='/home/ubuntu-14.04.1-server-amd64-20170531.iso'/><backingStore/><target dev='hdc' bus='ide'/><readonly/><alias name='ide0-1-0'/><address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>

在使用加密镜像的时候,由于实验中建立的是一个空镜像,里面没有操作系统,因此要带上一个cdrom,系统安装好之后,测试把<encryption format='luks'>删除,会找不到硬盘,加密生效。
在这里插入图片描述

故意将passphrase的最后一个字母从f改成e,再启动虚拟机

<encryption format='luks'><secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6e'/>
</encryption>
[root@localhost 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-21ccc2f80d6e'

4.3.结论

使用了LUKS之后,libvirt配置的passphrase不再用来当作生成加密密钥,仅仅用来解锁加密密钥,并且可以随时更改[3]。并且在demo-disk.xml的encryption标签里面,还可以配置成其他的选项来选择加密算法和密钥生成方式。

Reference


  1. Using QCow2 disk encryption with libvirt in Fedora 12(deprecated) ↩︎

  2. [Qemu-devel] [PULL 03/17] block: Deprecate QCOW/QCOW2 encryption ↩︎

  3. QEMU QCow2 built-in encryption: just say no. Deprecated now, to be deleted soon ↩︎

  4. KVM虚拟机磁盘镜像文件管理命令qemu-img介绍及简单使用总结 ↩︎

  5. Secret XML format ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实现在页面拖拽放大缩小div并显示鼠标在div的坐标

1、功能要求&#xff1a; 实现在一个指定区域拖拽div,并可以放大缩小&#xff0c;同时显示鼠标在该div里的坐标&#xff0c;如图可示 缩小并拖动 2、实现 <div class"div_content" ref"div_content"><div class"div_image" id"…

【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建)

CI/CD是持续集成&#xff0c;持续部署&#xff0c;集成就是开发人员通过自动化编译&#xff0c;发布&#xff0c;测试的手段集成软件&#xff0c;在开发的测试环境上测试发现自己的错误&#xff1b;持续部署是自动化构建&#xff0c;部署&#xff0c;通常也是在测试环境上进行&…

014 - ARM64上的GIC-400(GICv2)

本章节涉及到的参考文档有三个&#xff1a; BCM2711 ARM Peripherals.pdfARM Generic Interrupt Controller Architecture Specification.pdf (简称gic_v2)CoreLink GIC-400 Generic Interrupt Controller Technical Reference Manual.pdf 1. GIC 发展历史 在早期的 ARM 系统…

深度学习技巧应用29-软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下软件设计模式与神经网络巧妙结合&#xff0c;如何快速记忆软件设计模式。我们知道软件设计模式有23种&#xff0c;考试的时候经常会考到&#xff0c;但是这么种里面我们如何取判断它呢&#xff0c;如何去记忆它呢&a…

双指针——盛水最多的容器

一, 题目要求 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Jmeter接口自动化测试 —— Jmeter下载安装及入门

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;Apache JMeter - Download Apache JMeter 安装 由于Jmeter是基于Java的…

酷克数据发布HD-SQL-LLaMA模型,开启数据分析“人人可及”新时代

随着行业数字化进入深水区&#xff0c;企业的关注点正在不断从“数字”价值转向“数智”价值。然而&#xff0c;传统数据分析的操作门槛与时间成本成为了掣肘数据价值释放的阻力。常规的数据分析流程复杂冗长&#xff0c;需要数据库管理员设计数据模型&#xff0c;数据工程师进…

STP生成树协议详解

一、STP作用 如果链路断开或节点故障&#xff0c;那么互联的设备就无法正常通信了&#xff0c;这类网络问题叫做单点故障。没有备份的链路或节点&#xff0c;出现故障会直接断网。如果要提供 724 小时不间断的服务&#xff0c;那就需要在网络中提前部署冗余。避免出现单点故障…

快速入门python机器学习

文章目录 机器学习概述1.1 人工智能概述机器学习与人工智能、深度学习1.1.2 机器学习、深度学习能做些什么 1.2 什么是机器学习1.2.1 定义1.2.2 解释1.2.3 数据集构成 1.3 机器学习算法分类1.3.1 总结1.3.2 练习1.3.3 机器学习算法分类 1.4 机器学习开发流程&#xff08;了解&a…

ECharta雷达图 样式调整

预期效果&#xff1a; <template><div id"operationalRisk-radar-chart" class"h-290 w-385"></div> </template><script>export default {name: radarChart} </script> <script setup>import { onMounted, r…

CleanMyMac X4.14.4最新免费版本功能介绍

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全&#xff01;CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软…

GEO生信数据挖掘(八)富集分析(GO 、KEGG、 GSEA 打包带走)

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 本节对差异基因进行富集分析。 …

大咖云集,智慧碰撞|第 18 届 CLK 大会完整议程揭晓(内附报名通道)

自 2006 年以来&#xff0c;在国内 Linux 技术爱好者和行业公司的鼎力支持下&#xff0c;中国 Linux 内核开发者大会已走过 17个年头&#xff0c;是中国 Linux 内核领域最具影响力的峰会之一。今年的中国内核开发者大会依然秉承历届理念&#xff0c;以“自由、协作、创新”为理…

Python-Python高阶技巧:闭包、装饰器、设计模式、多线程、网络编程、正则表达式、递归

版本说明 当前版本号[20231018]。 版本修改说明20231018初版 目录 文章目录 版本说明目录Python高阶技巧闭包简单闭包修改外部函数变量的值实现以下atm取钱的闭包实现了闭包注意事项 装饰器装饰器的一般写法&#xff08;闭包写法&#xff09;装饰器的语法糖写法 设计模式单例…

x86 架构的机载计算机,它来了!

Allspark 2-x86采用Intel酷睿11代或12代CPU&#xff0c;x86架构&#xff0c;适用于无人机等机器人运行SLAM、VIO等复杂逻辑和高精度的机器视觉任务。预装 Ubuntu 22.04或Windows 11&#xff0c;满足多种使用场景。 市面上现有的一些NUC产品&#xff0c;不仅没有针对移动机器人使…

【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表 2. 循环链表 a. 循环链表节点结构体 b. 创建新节点 c. 在循环链表末尾插入节点 d. 删除循环链表中指定值的节点 e. 在循环链表中查找指定值的…

HZOJ-271: 滑动窗口

题目描述 ​ 给出一个长度为 N&#xfffd; 的数组&#xff0c;一个长为 K&#xfffd; 的滑动窗口从最左移动到最右&#xff0c;每次窗口移动&#xff0c;如下图&#xff1a; 找出窗口在各个位置时的极大值和极小值。 输入 ​ 第一行两个数 N,K&#xfffd;,&#xfffd;。 …

linux部署gitlab

1. 配置yum源&#xff1a; vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabled1 2. 更新本地缓存 sudo yum install -y gitlab-ce 3. 安装相关依赖 yum …

白水三佳电脑ERP部署

安装宝塔面板&#xff0c;有这个方便很多&#xff0c;可以省下3天的环境部署时间。 移动端&#xff0c; 先取移动版的压缩包&#xff0c;上传至服务器/www/wwwroot/目录下面&#xff0c;直接解压到当前目录后会生成/www/wwwroot/m/的目录&#xff0c;移动版就在这里面了。以下…

Python3----------抽象(多态、封装、继承等)

术语多态&#xff08;polymorphism&#xff09;源自希腊语&#xff0c;意思是“有多种形态”。这大致意味着即便你不知道变量指向的是哪种对象&#xff0c;也能够对其执行操作&#xff0c;且操作的行为将随对象所属的类型&#xff08;类&#xff09;而异。 封装&#xff08;en…