O QEMU / KVM usa instruções Intel AES para imagens qcow2 criptografadas se a CPU do host as possuir?

8

O formato do arquivo de imagem qcow2 para o KVM pode usar a criptografia AES . A criptografia é aplicada no nível do cluster :

Each sector within each cluster is independently encrypted using AES Cipher Block Chaining mode, using the sector's offset (relative to the start of the device) in little-endian format as the first 64 bits of the 128 bit initialisation vector.

O tamanho do cluster pode ser definido de 512 bytes para 2M (64K parece ser o padrão).

Um dos principais problemas com o uso da criptografia qcow2 é o desempenho atingido pela CPU - toda gravação em disco ou leitura não armazenada em cache precisa criptografar ou descriptografar.

O que eu gostaria de saber é se o QEMU / KVM usa o instruções Intel AES para atenuar o impacto no desempenho se a CPU host as tiver? Em caso afirmativo, o uso ou o desempenho dependem significativamente do tamanho do cluster?

Intel® AES instructions are a new set of instructions available beginning with the all new 2010 Intel® Core™ processor family based on the 32nm Intel® microarchitecture codename Westmere. These instructions enable fast and secure data encryption and decryption, using the Advanced Encryption Standard (AES) which is defined by FIPS Publication number 197. Since AES is currently the dominant block cipher, and it is used in various protocols, the new instructions are valuable for a wide range of applications.

    
por Jack Douglas 26.11.2014 / 09:26

2 respostas

9

Pelo menos com o pacote Fedora 20 qemu-img (1.6.2, 10.fc20) não usa AES-NI para criptografia AES.

Confirmando

Pode-se verificar da seguinte forma:

  1. A CPU tem AES-NI?

    $ grep aes /proc/cpuinfo  -i
    

    Por exemplo, meu Intel Core 7 tem essa extensão.

  2. Instale os pacotes de depuração necessários:

    # debuginfo-install qemu-img
    
  3. Executar qemu-img em um depurador:

    $ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
    
  4. Defina um ponto de interrupção em uma função de criptografia qemu bem conhecida que não seja otimizada para AES-NI:

    (gdb) b AES_encrypt
    Breakpoint 1 at 0x794b0: file util/aes.c, line 881.
    
  5. Execute o programa:

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

Resultados

No meu teste, ele pára aí:

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];

Significa que, de fato, as instruções do Intel AES não são usadas.

Meu primeiro pensamento foi que qemu-img talvez apenas use libcrypto de forma que o AES-NI seja usado automaticamente, quando disponível. qemu-img até vincula contra libcrypto (cf ldd $(which qemu-img) ) - mas não parece usá-lo para criptografia AES. Hmm.

Eu derivado a localização do ponto de interrupção via grepping o código-fonte do QEMU. No Fedora você pode fazer assim:

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

OBSERVAÇÃO: gdb pode ser encerrado pelo comando q uit.

    
por 26.11.2014 / 13:26
0

Gostaria de compartilhar este tópico sobre o suporte a AES-NI na CPU Westmere na versão 1.7.10.4 do QEMU:

link

A funcionalidade foi revisada e aceita no fluxo de código.

Depois, há outro tópico relacionado a por que a funcionalidade parece estar ausente no 2.2:

link

O encadeamento parece indicar que há um método para ativar esse recurso, mas com possíveis conseqüências negativas devido a incompatibilidades com a libvirt e a detecção de CPU. Pessoalmente, adoraria ver esse recurso reintroduzido.

    
por 20.03.2015 / 23:21