Apakah QEMU / KVM menggunakan instruksi Intel AES untuk gambar qcow2 terenkripsi jika CPU host memilikinya?

9

Format file gambar qcow2 untuk KVM dapat menggunakan enkripsi AES . Enkripsi diterapkan di tingkat cluster :

Setiap sektor dalam setiap klaster dienkripsi secara independen menggunakan mode AES Cipher Block Chaining, menggunakan offset sektor (relatif terhadap permulaan perangkat) dalam format little-endian sebagai 64 bit pertama dari vektor inisialisasi 128 bit.

The ukuran cluster dapat diatur dari 512 byte untuk 2M (64K tampaknya menjadi default).

Salah satu masalah utama dengan menggunakan enkripsi qcow2 adalah kinerja yang hebat untuk CPU - setiap disk perlu dibaca atau tidak di-cache untuk mengenkripsi atau tidak mengenkripsi.

Apa yang ingin saya ketahui adalah apakah QEMU / KVM menggunakan instruksi Intel AES untuk mengurangi hit kinerja jika host CPU memilikinya? Jika demikian, apakah penggunaan atau kinerja sangat tergantung pada ukuran cluster?

Instruksi Intel® AES adalah serangkaian instruksi baru yang tersedia yang dimulai dengan keluarga prosesor Intel® Core ™ 2010 baru yang didasarkan pada kode mikroarsitektur Intel® 32nm Westmere. Instruksi ini memungkinkan enkripsi dan dekripsi data yang cepat dan aman, menggunakan Advanced Encryption Standard (AES) yang didefinisikan oleh FIPS Publication number 197. Karena AES saat ini merupakan cipher blok yang dominan, dan digunakan dalam berbagai protokol, instruksi baru ini berharga untuk berbagai aplikasi.


sumber

Jawaban:

8

Setidaknya dengan paket Fedora 20 qemu-img(1.6.2, 10.fc20) tidak menggunakan AES-NI untuk AES crypto.

Mengkonfirmasikan

Seseorang dapat memverifikasinya seperti ini:

  1. Apakah CPU memiliki AES-NI?

    $ grep aes /proc/cpuinfo  -i
    

    Misalnya Intel Core 7 saya memiliki ekstensi ini.

  2. Instal paket debug yang diperlukan:

    # debuginfo-install qemu-img
    
  3. Jalankan qemu-imgdi debugger:

    $ gdb --args qemu-img convert -o encryption -O qcow2 disk1.img enc1.qcow2
    
  4. Atur break-point dalam fungsi enkripsi qemu terkenal yang tidak dioptimalkan untuk AES-NI:

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

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

Hasil

Dalam pengujian saya itu tidak berhenti di situ:

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

Artinya, memang, instruksi Intel AES tidak digunakan.

Pikiran pertama saya adalah bahwa qemu-imgmungkin hanya menggunakan libcryptoAES-NI secara otomatis digunakan, jika tersedia. qemu-imgbahkan tautan terhadap libcrypto (cf ldd $(which qemu-img)) - tetapi sepertinya tidak menggunakannya untuk kripto AES. Hmm.

Saya mendapatkan lokasi breakpoint melalui grepping kode sumber QEMU. Di Fedora Anda bisa mendapatkannya seperti ini:

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

CATATAN: gdb dapat keluar melalui qperintah uit.

maxschlepzig
sumber
Jawaban ini jauh melebihi harapan saya, terima kasih. Apakah QEMU menggunakan kode yang sama saat membaca gambar dalam operasi normal?
0

Saya ingin berbagi utas ini mengenai dukungan AES-NI di CPU Westmere di versi 1.7.10.4 QEMU:

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

Fungsionalitas ditinjau dan diterima ke dalam aliran kode.

Lalu ada utas lain yang terkait dengan mengapa fungsionalitas tampaknya kurang dalam 2.2:

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

Utas tampaknya mengindikasikan ada metode untuk mengaktifkan fitur ini, tetapi dengan konsekuensi negatif yang mungkin terjadi karena tidak kompatibel dengan libvirt dan deteksi CPU. Secara pribadi saya ingin melihat fitur ini diperkenalkan kembali.

FesterCluck
sumber
menarik, meskipun itu tidak ada hubungannya dengan pertanyaan, yang bukan tentang persaingan dan melewati AES-NI ke tamu, tetapi apakah tuan rumah menggunakannya untuk enkripsi (tamu bahkan tidak tahu apakah volume itu dienkripsi, itu transparan) .