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.rhkb.cn/news/164422.html

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

相关文章

在前端html页面中向服务器发送post登录请求

目录 前言 搭建服务器 搭建前端登录页面 获取表单值 使用axios发送post登录请求 前言 一般在html页面中向服务器发送post请求的模块为登录请求&#xff0c;本文将介绍如何向服务器发送post请求 搭建服务器 如何搭建服务器请看JWT认证这篇文章&#xff0c;有详细的解说。…

性能测试jmeter命令行运行+html测试报告解读

windows下打开jmeter的运行窗口&#xff0c;可以看到提示不要用GUI模式进行负载测试&#xff0c;如果要用负载测试&#xff0c;用cli模式&#xff0c;因为GUI模式运行jmeter比较消耗性能。 命令行模式 windows下找到jemeter所在文件夹&#xff0c;打开cmd输入命令。 jmeter -n…

Leetcode 第 365 场周赛题解

Leetcode 第 365 场周赛题解 Leetcode 第 365 场周赛题解题目1&#xff1a;2873. 有序三元组中的最大值 I思路代码复杂度分析 题目2&#xff1a;2874. 有序三元组中的最大值 II思路代码复杂度分析思路2 题目3&#xff1a;2875. 无限数组的最短子数组思路代码复杂度分析 题目4&a…

基于JAVA+SpringBoot+UniApp+Vue的前后端分离的手机移动端图书借阅平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会信息化的快速…

IPETRONIK数采与第三方软件集成

一 第三方软件 IPETRONIK公司提供IPEmotion用于车辆测试&#xff0c;但在某些特殊领域也有一些专业的软件&#xff0c;例如标定&#xff0c;则需要IPETRONIK数采来进行压力、温度、转速等信号的采集。 IPETRONIK提供了INCA和CANape插件&#xff0c;且这两款软件均可直接识别到…

微信小程序修改van-popup的背景颜色

效果图&#xff1a; van-popup背景颜色渐变 使用深度修改样式不生效&#xff0c;直接在 custom-style里面修改即可&#xff1b; <van-popup position"bottom"custom-style"height:25%;background:linear-gradient(95deg, #F8FCFF -0.03%, #EDF5FF 64.44…

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用

在Qt中&#xff0c;布局管理器&#xff08;Layout&#xff09;用于管理窗口中的控件的位置和大小&#xff0c;以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI&#xff1a; 1. QVBoxLayout&#xff08;垂直布…

Linux性能优化--性能工具:磁盘I/O

6.0 概述 本章介绍的性能工具能帮助你评估磁盘I/O子系统的使用情况。这些工具可以展示哪些磁盘或分区已被使用&#xff0c;每个磁盘处理了多少I/O,发给这些磁盘的I/O请求要等多久才被处理。 阅读本章后&#xff0c;你将能够&#xff1a; 确定系统内磁盘I/O的总量和类型(读/写…

使用 ClickHouse 深入了解 Apache Parquet (一)

​ 【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 自2013年作为Hadoop的列存储发布以来&#xff0c;Parquet几乎已经成为一种无处不在的文件交换格式&#xff0c;它提供了高效的存储和检索。这种采纳使其成为更近期的…

为网站配置SSL

HTTPS &#xff08;全称&#xff1a;Hyper Text Transfer Protocol over SecureSocket Layer&#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层&#xff0c;HTTPS…

AWS S3加密

Hello大家好&#xff61; 在本课时我们将讨论S3加密相关的内容。 S3加密相关是认证考试的一个重要的主题考点&#xff0c;您需要了解亚马逊S3的几种不同类型的加密方式。| 首先是静态数据的加密&#xff0c;静态数据加密是指数据存储在亚马逊S3 数据中心的磁盘上时&#xff0…

Maven的详细介绍(maven的全据配置以及idea中maven的配置)

maven的理解 Maven 是一个强大的项目管理和构建自动化工具&#xff0c;它通过抽象的项目对象模型(POM&#xff1a;Project Object Model)和构建生命周期模型(Project Lifecycle)来对项目及其构建过程进行管理(Dependency Management System)&#xff0c;Maven 最大化的消除了构…

爬虫/scrapy基础

如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏一键三连支持以下哦&#xff01; 想要一起交流学习的小伙伴可以加zkaq222&#xff08;备注CSDN&#xff0c;不备注通不过哦&#xff09;进入学习&#xff0c;共同学习进步 目录 0x01 安装和简介 0x02 文件作用 0x04 保存…

阿里巴巴店铺所有商品数据接口及店铺商品数据分析

获取阿里巴巴店铺所有商品数据的接口是阿里巴巴开放平台提供的接口&#xff0c;通过该接口可以获取店铺所有商品数据。 通过阿里巴巴开放平台接口获取店铺所有商品数据的方法如下&#xff1a; 在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的 App Key 和 Ap…

C语言实现用递归方法求 () = ∑ (^2)

完整代码&#xff1a; // 用递归方法求 ??(??) ∑ (??^2) #include<stdio.h>int func(int n){if (n1){return 1;}else{return n*nfunc(n-1);} }int main() {int n;printf("请输入一个整数");scanf("%d",&n);printf("%d",func(…

微信好友消息自动回复,让你轻松应对好友咨询

有许多用微信做业务、做微商的小伙伴&#xff0c;微信有时候消息太多看不过来&#xff0c;漏看消息&#xff0c;或者不知道怎么引导用户&#xff0c;让他们看到你想让他们看到的消息。微信上用户多微信上的信息容易漏掉&#xff0c;怎么能有时效的回复客户呢&#xff1f;此时你…

学习pytorch14 损失函数与反向传播

神经网络-损失函数与反向传播 官网损失函数L1Loss MAE 平均MSELoss 平方差CROSSENTROPYLOSS 交叉熵损失注意code 反向传播在debug中的显示code B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/nn.html#loss-functions 损失函数 L1Loss MAE 平均 import to…

食品软水树脂和工业软水树脂有什么区别?高盐水除钙镁应选择什么树脂?

在食品、饮料、制药、汽车制造、化工、电子、制革、钢铁、纺织等许多行业中&#xff0c;水的质量对产品的质量有非常重要的影响。 软化水可以有效改善水质&#xff0c;减少水中钙、镁离子含量&#xff0c;避免水垢形成&#xff0c;从而减少加热和冷却设备的能源消耗&#xff0c…

元梦之星内测上线,如何在B站打响声量?

元梦之星是腾讯天美工作室群研发的超开星乐园派对手游&#xff0c;于2023年1月17日通过审批。该游戏风格可爱软萌&#xff0c;带有社交属性&#xff0c;又是一款开黑聚会的手游&#xff0c;备受年轻人关注。 飞瓜数据&#xff08;B站版&#xff09;显示&#xff0c;元梦之星在…

Python制作PDF转Word工具(Tkinter+pdf2docx)

一、效果样式 二、核心点 1. 使用pdf2docx完成PDF转换Word 安装pdf2docx可能会报错&#xff0c;安装完成引入from pdf2docx import Converter运行也可能报错&#xff0c;可以根据报错提示看缺少那些库&#xff0c;先卸载pip uninstall xxx,使用pip install python-docx -i htt…