TPM2 в qemu с использованием aarch64 alpine linux

Вопрос или проблема

Я хочу запустить виртуальную машину с Alpine Linux и подключить TPM хоста к ВМ. Хост основан на x86_64. Команда для qemu:

qemu-system-aarch64 \
    -m 1024 -cpu cortex-a57 -M virt \
    -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
    -drive file=disk.qcow2,if=virtio,format=qcow2 \
    -cdrom alpine-3.21.3-aarch64.iso \
    -nographic \
    -device virtio-net-device,netdev=n0 \
    -netdev user,id=n0 \
    -tpmdev type=passthrough,id=tpm0,path=/dev/tpmrm0,cancel-path=/dev/tpmrm0 \
    -device tpm-tis-device,tpmdev=tpm0

Что касается установочного диска alpine-3.21.3-aarch64.iso, я пробовал как “стандартную”, так и “virt” версию с этого сайта. Они обе загружаются нормально, установка также проходит успешно, но ни одна из них не позволяет мне получить доступ к tpm хоста. На хосте TPM работает нормально, что я могу проверить, например, с помощью tpm2_getrandom 8 --hex и факта наличия /dev/tpm0 и /dev/tpmrm0.

На ВМ эти два устройства отсутствуют, и я не могу заставить это работать. Вот некий вывод отладки с ВМ:

$ dmesg | grep -i tpm
[    0.000000] efi: SMBIOS 3.0=0x7fed0000 TPMFinalLog=0x7c3e0000 MEMATTR=0x7e227018 ACPI 2.0=0x7c3d0018 TPMEventLog=0x7c3d9098 INITRD=0x7c3c9b18 MEMRESERVE=0x7c3c9b98 
[    0.000000] ACPI: TPM2 0x000000007C3DE898 00004C (v04 BOCHS  BXPC     00000001 BXPC 00000001)

Я уже добавил модуль ядра tpm_tis_spi в /etc/modules. Поэтому я вижу:

$ lsmod | grep -i tpm
tpm_tis_spi            20480  0
tpm_tis_core           28672  1 tpm_tis_spi
tpm                   102400  2 tpm_tis_core,tpm_tis_spi
rng_core               20480  1 tpm

Кажется, имеются некоторые доступные драйверы:

$ find /lib/modules/$(uname -r) -name '*tpm*'
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_tis_spi.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_tis_core.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_atmel.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/xen-tpmfront.ko.gz
/lib/modules/6.12.16-0-lts/kernel/drivers/char/tpm/tpm_infineon.ko.gz

/sys/class/tpm/ и /sys/class/tpmrm/ существуют, но пусты.

На хосте, из tpm2_getcap properties-fixed, я выяснил, что TPM – это Infineon SLB9670. На ВМ это просто выдает сообщение об ошибке (как и ожидалось):

$ tpm2_getcap properties-fixed
ERROR:tcti:src/tss2-tcti/tcti-device.c:455:Tss2_Tcti_Device_Init() Failed to open specified TCTI device file /dev/tpmrm0: No such file or directory 
ERROR:tcti:src/tss2-tcti/tctildr-dl.c:149:tcti_from_file() Could not initialize TCTI file: device 
ERROR:tcti:src/tss2-tcti/tctildr.c:477:tctildr_init_context_data() Failed to instantiate TCTI 
ERROR: Could not load tcti, got: "(null)"

Что я упускаю?

Основываясь на некоторых аналогичных проблемах, с которыми я сталкивался в прошлом, я предполагаю, что существует несоответствие между архитектурой ВМ и эмуляцией устройства TPM.

Вы пытаетесь использовать хост на основе x86_64, но ваша ВМ является ARM:

QEMU может эмулировать как 32-битные, так и 64-битные процессоры Arm. Используйте qemu-system-aarch64 для симуляции 64-битной машины Arm.

Это означает, что passthrough для TPM не такой простой, каким бы он был в противном случае, так как (насколько я помню) -device tpm-tis-device предназначено для машин x86. Эта документация предполагает, что sysbus может быть подходящим вариантом для машины ARM; однако, когда я попытался проверить это на своей машине, это не было доступной опцией:

$ qemu-system-aarch64 -device help | grep tpm
name "tpm-tis-device", bus System
name "tpm-tis-i2c", bus i2c-bus

Так что мое первое предложение, если это возможно, – пробовать запускать Alpine VM, которая не использует ARM. На сайте загрузки, который вы привели, доступны как x86_64, так и x86 опции, и я бы предположил, что они будут работать проще в данном случае.

Если вам нужен ARM, к сожалению, у меня закончились идеи, я тоже уже час ломаю над этим голову.

Ответ или решение

Определение серверной среды и использование технологий виртуализации, таких как QEMU, в сочетании с аппаратными модулями безопасности, например, чипами TPM (модули доверенной платформы), — это современный подход к IT-инфраструктуре, который требует внимательного подхода к настройке и интеграции. Давайте рассмотрим вашу ситуацию более подробно.

Теория

Во-первых, разберемся с основными компонентами. TPM (Trusted Platform Module) служит для выполнения криптографических операций и обеспечивает безопасность на уровне оборудования. Он часто используется для хранения криптографических ключей, которые необходимы для шифрования данных и обеспечения безопасности на уровне операционной системы. QEMU, с другой стороны, — это программное обеспечение с открытым исходным кодом, которое позволяет запускать виртуальные машины. Оно часто используется вместе с KVM (модуль ядра для виртуализации в Linux) для достижения более высокой производительности.

Вашей задачей является запуск виртуальной машины под управлением Alpine Linux на архитектуре ARM64 (aarch64) с подключением хостового чипа TPM, который находится на платформе x86_64. Это поднимает несколько технических вызовов, особенно в связи с различиями архитектур и особенностями эмуляции TPM в QEMU.

Пример

На практике ваш текущий подход включает использование команды следующим образом:

qemu-system-aarch64 \
    -m 1024 -cpu cortex-a57 -M virt \
    -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
    -drive file=disk.qcow2,if=virtio,format=qcow2 \
    -cdrom alpine-3.21.3-aarch64.iso \
    -nographic \
    -device virtio-net-device,netdev=n0 \
    -netdev user,id=n0 \
    -tpmdev type=passthrough,id=tpm0,path=/dev/tpmrm0,cancel-path=/dev/tpmrm0 \
    -device tpm-tis-device,tpmdev=tpm0

Команда создает виртуальную машину с эмуляцией ARM, где используется эллиптическая прошивка UEFI для ARM, и осуществляется попытка сквозного подключения TPM с помощью параметров -tpmdev и -device.

Хотя TPM и доступен на хосте, он не отображается в гостевой системе, что означает, что передача не настраивается надлежащим образом. Должны быть созданы устройства /dev/tpm0 или /dev/tpmrm0 в гостевой системе, но они отсутствуют, что вызывает именно ту ошибку, которую вы наблюдаете:

ERROR:tcti:src/tss2-tcti/tcti-device.c:455:Tss2_Tcti_Device_Init() Failed to open specified TCTI device file /dev/tpmrm0: No such file or directory

Применение

Проблема заключается в потенциальной несовместимости архитектуры QEMU и TPM. tpm-tis-device обычно используется для x86 машин. Для ARM систем лучше подходит использование tpm-tis-i2c или sysbus. Однако нужно учитывать, что ARM-стек поддержки для TPM в qemu может не быть столь же зрелым, как для x86.

Ваша гостевая система загружает модули ядра для поддержки TPM, такие как tpm_tis_spi и tpm_tis_core, но без подключения аппаратного устройства TPM они не смогут создать соответствующие устройства в файловой системе Linux.

Рекомендации

  1. Проверить архитектуру VM:
    Рассмотрите возможность перейти на Alpine Linux с архитектурой x86_64, если это не принципиально — это значительно упростит интеграцию с TPM.

  2. Эмуляция TPM:
    Рассмотрите возможность использования эмуляции TPM, а не сквозного подключения. QEMU поддерживает эмуляцию TPM, что может быть альтернативой:

    -tpmdev emulator,id=tpm0,chardev=chrtpm \
    -chardev socket,id=chrtpm,path=/var/tmp/swtpm-sock

    Это создаст локальное программное обеспечение TPM (swtpm), которое может быть использовано для разработки и тестирования функций, зависящих от TPM.

  3. Проверка версии QEMU:
    Убедитесь, что ваша версия QEMU поддерживает нужный функционал для работы с ARM и TPM. Обновление до последней версии QEMU может содержать исправления и новые функции для ARM эмуляции.

  4. Discussion with TPM specifics:
    При необходимости обратитесь к документации TPM производителя и сообществу QEMU, чтобы узнать о возможных обновлениях и новых методах интеграции для ARM.

Эти шаги могут помочь в решении проблемы и успешной интеграции TPM в виртуальную машину под управлением Alpine Linux на архитектуре aarch64.

Оцените материал
Добавить комментарий

Капча загружается...