QEMU / KVMは、ホストCPUにある場合、暗号化されたqcow2イメージにIntel AES命令を使用しますか?


9

KVMのqcow2イメージファイル形式は、AES暗号化を使用できます。暗号化はクラスターレベルで適用されます

各クラスター内の各セクターは、AES暗号ブロックチェーンモードを使用して独立して暗号化され、128ビットの初期化ベクトルの最初の64ビットとしてリトルエンディアン形式のセクターのオフセット(デバイスの先頭を基準)を使用します。

クラスタサイズがから設定することができ2Mに512バイト(64Kがデフォルトのように見えます)。

qcow2暗号化の使用に関する主な問題の1つは、CPUのパフォーマンスヒットです。すべてのディスク書き込みまたは非キャッシュ読み取りは、暗号化または暗号化解除する必要があります。

私が知りたいのは、QEMU / KVMがIntel AES命令を使用して、ホストCPUにパフォーマンスの影響を軽減できるかどうかです。その場合、使用量またはパフォーマンスはクラスターサイズに大きく依存しますか?

インテル®AES命令は、32 nmインテル®マイクロアーキテクチャーコードネームWestmereに基づくまったく新しい2010インテル®Core™プロセッサーファミリーから利用できる新しい一連の命令です。これらの命令は、FIPS Publication number 197で定義されているAdvanced Encryption Standard(AES)を使用して、高速で安全なデータの暗号化と復号化を可能にします。AESは現在主要なブロック暗号であり、さまざまなプロトコルで使用されているため、新しい命令は貴重です幅広い用途向け。

回答:


8

少なくともFedora 20パッケージqemu-img(1.6.2、10.fc20)では、AES暗号にAES-NIを使用しません。

確認しています

次のように確認できます。

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

実際、Intel AES命令は使用されていません。

私が最初に思ったのは、AES-NIが利用可能な場合は自動的に使用されるようにqemu-img使用しているだけだと思いましたlibcryptoqemu-imglibcrypto(cf ldd $(which qemu-img))にもリンクしますが、AES暗号には使用しないようです。うーん。

QEMUソースコードをgreppingして、ブレークポイントの場所を取得しました。Fedoraでは、次のように取得できます。

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

注: uitコマンドgdbを使用して終了できますq


この回答は私の期待をはるかに超えています。ありがとうございます。QEMUは通常の操作で画像を読み取るときに同じコードを使用しますか?

0

QEMU 1.7.10.4バージョンの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を介したゲストへのパスではなく、ホストが暗号化に使用するかどうか(ゲストがボリュームが暗号化されているかどうかをゲストが認識していないため、透過的です)とは関係ありません。 。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.