QEMU/KVM은 호스트 CPU에 qcow2 이미지가 있는 경우 Intel AES 지침을 사용하여 qcow2 이미지를 암호화합니까?

QEMU/KVM은 호스트 CPU에 qcow2 이미지가 있는 경우 Intel AES 지침을 사용하여 qcow2 이미지를 암호화합니까?

KVM의 qcow2 이미지 파일 형식AES 암호화를 사용할 수 있습니다. 암호화 적용됨클러스터 수준에서:

각 클러스터 내의 각 섹터는 AES 암호화 블록 체인 모드를 사용하여 독립적으로 암호화되며, 리틀 엔디안 형식의 섹터 오프셋(장치 시작 기준)을 128비트 초기화 벡터의 첫 번째 64비트로 사용합니다.

이것클러스터 크기으로 설정할 수 있습니다512바이트 ~ 2M(64K가 기본값인 것 같습니다).

qcow2 암호화 사용 시 주요 문제 중 하나는 CPU에 대한 성능 영향입니다. 모든 디스크 쓰기 또는 캐시되지 않은 읽기에는 암호화 또는 암호 해독이 필요합니다.

QEMU/KVM이 사용하는지 알고 싶습니다.인텔 AES 지침호스트 CPU에 성능 저하가 있는 경우 성능 저하를 완화할 수 있습니까? 그렇다면 사용량이나 성능이 클러스터 크기에 크게 좌우됩니까?

인텔® AES 지침은 코드명 Westmere인 32nm 인텔® 마이크로아키텍처를 기반으로 하는 새로운 2010 인텔® 코어™ 프로세서 제품군부터 사용할 수 있는 새로운 지침 세트입니다. 이러한 지침을 사용하면 FIPS 발행물 번호 197에 정의된 AES(고급 암호화 표준)를 사용하여 빠르고 안전한 데이터 암호화 및 암호 해독이 가능합니다. AES는 현재 주요 블록 암호이고 다양한 프로토콜에서 사용되기 때문에 새로운 지침은 광범위한 애플리케이션에 유용합니다.

답변1

최소한 Fedora 20 패키지(1.6.2, 10.fc20)에서는 qemu-img사용되지 않습니다 .AES-NIAES 암호화의 경우.

확인하다

이는 다음과 같이 확인할 수 있습니다.

  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것이었습니다 . libcrypto에 대한 링크(cf )도 있지만 AES 암호화에는 사용하지 않는 것 같습니다. 잘.libcryptoqemu-imgldd $(which qemu-img)

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

노트: gdbuit 명령을 통해 종료할 수 있습니다 q.

답변2

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 계측과의 비호환성으로 인해 부정적인 결과를 초래할 수 있습니다. 개인적으로 이 기능이 다시 도입되었으면 좋겠습니다.

관련 정보