如果主机CPU有QEMU / KVM,它们是否对加密的qcow2映像使用Intel AES指令?


9

KVM的qcow2图像文件格式可以使用AES加密。加密在集群级别应用

每个簇中的每个扇区均使用AES密码块链接模式进行独立加密,并使用低字节序格式的扇区偏移量(相对于设备的起始位置)作为128位初始化向量的前64位。

所述簇的大小可以设置从512个字节至2M(64K似乎是默认值)。

使用qcow2加密的主要问题之一是CPU的性能下降-每个磁盘写入或非缓存读取都需要加密或不加密。

我想知道的是,如果主机CPU有QEMU / KVM,它们是否使用Intel AES指令来减轻性能影响?如果是这样,使用率或性能是否很大程度上取决于群集大小?

英特尔®AES指令是一组全新的指令,从基于32纳米英特尔®微体系结构代号Westmere的全新2010英特尔®酷睿™处理器家族开始。这些指令可以使用由FIPS出版物编号197定义的高级加密标准(AES)进行快速,安全的数据加密和解密。由于AES当前是主要的分组密码,并且已在各种协议中使用,因此新指令非常有价值。适用于广泛的应用。

Answers:


8

至少在Fedora 20软件包qemu-img(1.6.2,10.fc20)中不使用AES-NI进行AES加密。

确认中

可以这样验证:

  1. CPU是否具有AES-NI?

    $ grep aes /proc/cpuinfo  -i
    

    例如,我的Intel Core 7具有此扩展名。

  2. 安装必要的调试包:

    # debuginfo-install qemu-img
    
  3. qemu-img在调试器中运行:

    $ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
    
  4. 在未针对AES-NI优化的众所周知的qemu加密功能中设置一个断点:

    (gdb) b AES_encrypt
    Breakpoint 1 at 0x794b0: file util/aes.c, line 881.
    
  5. 运行程序:

    (gdb) r
    Starting program: /usr/bin/qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
    

结果

在我的测试中,它确实停在那里:

Breakpoint 1, AES_encrypt (in=0x7ffff7fabd60 "...", key=0x555555c1b510) at util/aes.c:881
881          const AES_KEY *key) {
(gdb) n
889     assert(in && out && key);
(gdb) n
881          const AES_KEY *key) {
(gdb) n
889     assert(in && out && key);
(gdb) n
896     s0 = GETU32(in     ) ^ rk[0];
(gdb) n
897     s1 = GETU32(in +  4) ^ rk[1];

这意味着确实没有使用英特尔AES指令。

我的第一个想法是,qemu-img也许使用libcrypto时会自动使用AES-NI。qemu-img甚至链接到libcrypto(cf ldd $(which qemu-img))-但似乎没有将其用于AES加密。嗯

我通过greping QEMU源代码得出了断点位置。在Fedora上,您可以这样获得:

$ fedpkg clone -a qemu
$ cd qemu
$ fedpkg source
$ tar xfv qemu-2.2.0-rc1.tar.bz2
$ cd qemu-2.2.0-rc1

注意: gdb可以通过quit命令退出。


这个答案远远超出了我的期望,谢谢。在正常操作下读取图像时,QEMU是否使用相同的代码?

0

我想在1.7.10.4版本的QEMU中共享有关Westmere CPU中AES-NI支持的线程:

http://lists.gnu.org/archive/html/qemu-devel/2013-03/msg05374.html

对该功能进行了审查并被接受到代码流中。

然后还有另一个线程与为什么2.2中似乎缺少该功能有关:

https://www.redhat.com/archives/libvirt-users/2015-February/msg00007.html

该线程似乎表明有一种启用此功能的方法,但是由于与libvirt和CPU检测不兼容而可能产生负面影响。我个人很想重新引入此功能。


有趣的是,尽管与问题无关,这与模拟并通过AES-NI传递给来宾无关,但是主机是否使用它进行加密(来宾甚至不知道其卷是否已加密,都是透明的) 。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.