百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

kvm qcow2和ceph rbd虚拟机磁盘加密

csdh11 2025-04-30 16:10 7 浏览


kvm qcow2磁盘加密

关于luks加密

LUKS 实现了一种独立于平台的标准磁盘格式,用于各种工具。LUKS 用于加密块设备。加密设备的内容是任意的,因此可以加密任何文件系统,包括交换分区。加密卷的开头有一个未加密的标头,它允许存储多达 8 个 (LUKS1) 或 32 个 (LUKS2)加密密钥以及密码类型和密钥大小等加密参数。此标头的存在是 LUKS 和普通 dm-crypt 之间的主要区别,因为标头允许使用多个不同的密码短语,并且能够轻松更改和删除它们。但是,如果标头丢失或损坏,设备将不再可解密。LUKS (Linux Unified Key Setup)为提供了一个标准的磁盘加密格式,使得它不仅兼容性高,能通用于不同的 Linux 发行版本,还支持多用户/口令,并且由于它的加密密钥独立于口令,所以即使口令失密,我们也无需重新加密整个硬盘,只需要及时的改变口令即可重获安全。

luks加密kvm虚拟机磁盘的实现

在libvirt 4.5版本之前,除了luks加密之外,还支持qcow加密的。qcow磁盘加密

qemu-img convert -O qcow2 --object secret,id=sec0,data=123456 -o encryption=on,encrypt.key-secret=sec0 -f qcow2 test.qcow2 fw-encry.qcow2

加密格式default和qcow可能不再用于创建加密卷。在 QEMU 中使用 qcow 加密卷在 QEMU 2.3 中开始逐步淘汰。下面还是主要来介绍怎么使用luks来实现磁盘加密吧 将现有的虚拟机磁盘转为加密的磁盘,如果直接创建加密磁盘的新虚拟机不需要执行第二步转换磁盘的操作。

  1. 创建大小为20G的luks空磁盘。
qemu-img create -f luks --object secret,data=123,id=sec0 -o key-secret=sec0 fw.luks 20G
  1. 将要加密的qcow2磁盘转换为luks磁盘,目标磁盘不存在将无法转换。
qemu-img convert --target-image-opts \
> --object secret,data=123,id=sec0 -f qcow2 fw.qcow2 -n \
> driver=luks,file.filename=fw.luks,key-secret=sec0
图片.png
  1. 创建一个secret xml文件,不添加UUID会自动生成。
vim volume-secret.xml
<secret ephemeral='no' private='yes'>
<uuid>92f35b9e-c845-47e1-b5a6-f2036a706866</uuid>
<description>Super secret name of my first puppy</description>
<usage type='volume'>
<volume>/home/kvm/images/fw.luks</volume>
</usage>
</secret>
  1. 定义secret

产生的secret以及base64的密码在/etc/libvirt/secrets/中存在

virsh secret-define volume-secret.xml
  1. 给secret设置密码值
# MYSECRET=`printf %s "123" | base64`
# virsh secret-set-value dc057b2b-6a7d-4dba-b76e-37a458448765 $MYSECRET
Secret value set

  1. 编辑虚拟机disk段加入secret的字段
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/home/kvm/images/fw.luks'/>
<target dev='vda' bus='virtio'/>
<encryption format='luks'>
<secret type='passphrase' uuid='dc057b2b-6a7d-4dba-b76e-37a458448765'/>
</encryption>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>

对于卷创建,可以指定用于加密 luks 卷的加密算法。可以为此目的提供以下两个可选元素cipher和ivgen。支持哪些算法取决于管理程序。使用 qemu-img 创建卷时,存储驱动后端使用的默认算法是 'aes-256-cbc',使用 'essiv' 生成初始化向量,使用 'sha256' 哈希算法生成密码和初始化向量。官网例子,只做参考。

<volume>
<name>twofish.luks</name>
<capacity unit='G'>5</capacity>
<target>
<path>/var/lib/libvirt/images/demo.luks</path>
<format type='raw'/>
<encryption format='luks'>
<secret type='passphrase' uuid='f52a81b2-424e-490c-823d-6bd4235bc572'/>
<cipher name='twofish' size='256' mode='cbc' hash='sha256'/>
<ivgen name='plain64' hash='sha256'/>
</encryption>
</target>
</volume>

之后启动虚拟机就可以了

virsh start vm

如果想把加密的磁盘拷贝到其他宿主机上使用,直接执行上面的创建secret之后的操作就可以了

注意:设置的密码一定要与之前宿主机定义的密码一样

如果我们把虚拟机加密引导磁盘的encryption字段去掉,不在虚拟化层进行解密,会怎么样呢,会找不到磁盘引导

<encryption format='luks'>
<secret type='passphrase' uuid='dc057b2b-6a7d-4dba-b76e-37a458448765'/>
</encryption>

如果数据盘不在虚拟化层解密,将不能直接挂载

  • 加密后不能直接挂载
  • 加密后硬盘丢失也不用担心数据被盗
  • 加密后必须做映射才能挂载

LUKS 也是一种基于 device mapper(dm) 机制的加密方案。如果要使用加密后的分区,就必须对加密后的分区做一个映射,映射到 /dev/mapper 这个目录下。映射完成之后,我们也只能挂载这个映射来进行使用,并且在做映射的时候还需要输入加密分区的加密密码。我们使用Cryptsetup工具对数据盘做映射,映射文件将放到 /dev/mapper 目录中。需要输入之前磁盘加密的密码

cryptsetup luksOpen /dev/vdb fw
图片.png

kvm使用ceph rbd磁盘加密

定义secret

  1. 生成secret

所有ceph节点都要执行 生成secret

cd /etc/libvirt/qemu
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
  1. 定义secret,生成的id号要记下来
root@node1:/etc/libvirt/qemu# virsh secret-define --file secret.xml
Secret 01a0ba00-f277-48bb-b937-9001ec91f53e created
root@node2:/etc/libvirt/qemu# virsh secret-define --file secret.xml
Secret 533b5d06-0525-4da3-bddf-907f70c0a31b created
root@node3:/etc/libvirt/qemu# virsh secret-define --file secret.xml
Secret 1740698e-abb9-4502-b801-1ede074f1ce1 created
  1. 获取client.libvirt密钥并将密钥字符串保存到文件中。

三台都执行下面的命令

ceph auth get-key client.libvirt | tee client.libvirt.key
  1. 设置secret的密码。
root@node1:/etc/libvirt/qemu# virsh secret-set-value --secret 01a0ba00-f277-48bb-b937-9001ec91f53e --base64 $(cat client.libvirt.key) 
Secret value set
root@node2:/etc/libvirt/qemu# virsh secret-set-value --secret 533b5d06-0525-4da3-bddf-907f70c0a31b --base64 $(cat client.libvirt.key)
Secret value set
root@node3:/etc/libvirt/qemu# virsh secret-set-value --secret 1740698e-abb9-4502-b801-1ede074f1ce1 --base64 $(cat client.libvirt.key)
Secret value set
  1. 编辑虚拟机配置文件
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<auth username='libvirt'>
<secret type='ceph' uuid='01a0ba00-f277-48bb-b937-9001ec91f53e'/>
</auth>
<source protocol='rbd' name='libvirt-pool/fw-system'>
<host name='node1' port='6789'/>
<host name='node2' port='6789'/>
<host name='node3' port='6789'/>
</source>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

启动虚拟机

定义并启动虚拟机

virsh define vm.xml
virsh start vm







公众号:运维开发故事

github:https://github.com/orgs/sunsharing-note/dashboard

博客:https://www.devopstory.cn

爱生活,爱运维

我是wanger,《运维开发故事》公众号团队中的一员,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!

关注我,不定期维护优质内容

温馨提示

如果我的文章对你有所帮助,还请帮忙一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新

........................



相关推荐

Github霸榜的SpringBoot全套学习教程,从入门到实战,内容超详细

前言...

SpringBoot+LayUI后台管理系统开发脚手架

源码获取方式:关注,转发之后私信回复【源码】即可免费获取到!项目简介本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础...

探秘Spring Cache:让Java应用飞起来的秘密武器

探秘SpringCache:让Java应用飞起来的秘密武器在当今快节奏的软件开发环境中,性能优化显得尤为重要。SpringCache作为Spring框架的一部分,为我们提供了强大的缓存管理能力,让...

3,从零开始搭建SSHM开发框架(集成Spring MVC)

目录本专题博客已共享在(这个可能会更新的稍微一些)https://code.csdn.net/yangwei19680827/maven_sshm_blog...

Spring Boot中如何使用缓存?超简单

SpringBoot中的缓存可以减少从数据库重复获取数据或执行昂贵计算的需要,从而显著提高应用程序的性能。SpringBoot提供了与各种缓存提供程序的集成,您可以在应用程序中轻松配置和使用缓...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

1,从零开始搭建SSHM开发框架(环境准备)

目录本专题博客已共享在https://code.csdn.net/yangwei19680827/maven_sshm_blog1,从零开始搭建SSHM开发框架(环境准备)...

做一个适合二次开发的低代码平台,把程序员从curd中解脱出来-1

干程序员也有好长时间了,大多数时间都是在做curd。现在想做一个通用的curd平台直接将我们解放出来;把核心放在业务处理中。用过代码生成器,在数据表设计好之后使用它就可以生成需要的controller...

设计一个高性能Java Web框架(java做网站的框架)

设计一个高性能JavaWeb框架在当今互联网高速发展的时代,构建高性能的JavaWeb框架对于提升用户体验至关重要。本文将从多个角度探讨如何设计这样一个框架,让我们一起进入这段充满挑战和乐趣的旅程...

【推荐】强&amp;牛!一款开源免费的功能强大的代码生成器系统!

今天,给大家推荐一个代码生成器系统项目,这个项目目前收获了5.3KStar,个人觉得不错,值得拿出来和大家分享下。这是我目前见过最好的代码生成器系统项目。功能完整,代码结构清晰。...

Java面试题及答案总结(2025版持续更新)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试场景题及答案。...

Java开发网站架构演变过程-从单体应用到微服务架构详解

Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构、集群架构、分布式架构、SOA架构和微服务架构。下面玄武老师来给大家详细介绍下这5种架构模式的发展背景、各自优缺点以及涉及到的...

本地缓存GuavaCache(一)(guava本地缓存原理)

在并发量、吞吐量越来越大的情况下往往是离不开缓存的,使用缓存能减轻数据库的压力,临时存储数据。根据不同的场景选择不同的缓存,分布式缓存有Redis,Memcached、Tair、EVCache、Aer...