Piszki Lab

Analiza przypadku w języku przodków…

CloudStack – VM z vTPM i Secure boot UEFI

| 0 comments

Wirtualizacja dostarcza wszelkich możliwych narzędzi wspomagających uruchamianie systemów operacyjnych ze szczególnymi wymaganiami. Jednym z takich wymagań jest zapewnienie możliwego bezpieczeństwa poprzez zastosowanie TPM i UEFI z uruchomieniem typu Secure Boot. Tego typu start systemu gwarantuje, że nic nie zostało zmodyfikowane w programie rozruchowym. O ile w fizycznym hoście jest to łatwe we wdrożeniu, o tyle w rozwiązaniach typ Stack wymaga już to trochę więcej pracy. O tym jak jest to rozwiązane w VMware vSphere pisałej już tutaj. Dzisiaj przetestujemy bardzo podobne rozwiązanie w CloudStack. Należy jednak zwrócić uwagę, że istniejące VM instalowane z BIOS nie będą mogły być wykorzystane, będziecie musieli stworzyć całkowicie nowe, wzorcowe VM z UEFI.

Na tę chwilę nie ma możliwości wykorzystania fizycznego TPM w wersji emulowanej w VM tak jak to ma miejsce w vSphere. Oba rozwiązania, UEFI i TPM, są w VM emulowane. Zaczniemy od UEFI, w CloudStack w wersji 4.15 wprowadzono możliwość uruchamiania VM z UEFI jako ustawienie zaawansowane, standardowo nadal jest wykorzystywany BIOS. Konfiguracja całości jest bardzo prosta, wymaga zainstalowanie w systemie operacyjnym hosta pakietu edk2-ovmf (lub po prostu OVMF) . Pakiet ten zawiera wszystkie potrzebne pliki do emulowania UEFI w obu trybach, legacy i secure. CloudStack integruje się z tym pakietem poprzez stworzenie pliku:

/etc/cloudstack/agent/uefi.properties (ścieżki należy dostosować, zależnie od pakietu w danym OS) :

CentOS 8:

guest.nvram.template.secure=/usr/share/edk2/ovmf/OVMF_VARS.secboot.fd
guest.nvram.template.legacy=/usr/share/edk2/ovmf/OVMF_VARS.fd
guest.loader.secure=/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd
guest.nvram.path=/var/lib/libvirt/qemu/nvram/
guest.loader.legacy=/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd

CentOS 7:

guest.nvram.template.secure=/usr/share/edk2.git/ovmf-x64/OVMF_VARS-with-csm.fd
guest.nvram.template.legacy=/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd
guest.loader.secure=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-with-csm.fd
guest.loader.legacy=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd
guest.nvram.path=/var/lib/libvirt/qemu/nvram/

Włączenie wymaga restartu cloudstack-agent, sam host musi być dodatkowo oznaczony w DB CloudStack że wspiera UEFI. Nie jest to problem dla nowych instalacji, dla starszych po migracji należy tę flagę ustawić ręcznie w DB (na tę chwilę). Bez tego spotkamy się od razu z komunikatem: Cannot deploy to specified host as host does n’t support uefi vm deployment, returning.

host

Uruchomienie vTPM wymaga zainstalowania w systemie operacyjnym hosta pakietu swtpm swtpm-tools. Nie wymaga on dodatkowej konfiguracji, do VM dodajemy TPM dokładnie tak jak to robiliśmy w przypadku GPU, poprzez konfigurację XML dodaną jako ExtraConfig. Definicja urządzenia wygląda tak:

<devices>
<tpm model=’tpm-tis’>
<backend type=’emulator’ version=’2.0’/>
</tpm>
</devices>

Nową VM tworzymy standardowo, w opcjach zaawansowanych ustawiamy UEFI/Secure, maszyny nie uruchamiamy (fajna opcja dodana w 4.15.1):

vm1vm2

Dodajemy w ustawieniach wirtualnej maszyny vTPM jako extraconfig (i dopiero wtedy uruchamiamy i instalujemy OS):

vm5Poniżej screen pokazujący że UEFI zostało poprawnie rozpoznane przez Windows Instalator:

partMożemy też sprawdzić czy tworzą się pliki nvram:

nvramOstateczny rezultat wygląda tak:

vm6

I na koniec bonus, jak dodać do KVM/VM (CloudStack) urządzenia USB? Odpowiedź jest prosta, tak jak każde inne, po jego wcześniejszym zidentyfikowaniu. Na poniższym przykładzie dodam kabel USB<—>Serial do mojej VM pełniącej rolę administracyjną. Szukamy urządzenia poleceniem lsusb –v :

Następnie preparujemy plik XML i dodajemy go do VM jako extraconfig:

<devices>
<hostdev mode=’subsystem’ type=’usb’ managed=’yes’>
<source>
<vendor id=’0x0403’/>
<product id=’0x6001’/>
</source>
</hostdev>
</device>

Uruchamiamy VM i sprawdzamy rezultat, w tym wypadku kable USB<—>Serial dodaje się jako wirtualny port COM3:usb2

 

Oceń ten artykuł:

Dodaj komentarz

Required fields are marked *.