Linux E X P R E S

Facebook

(Ne)upravujte UEFI a Secure Boot

Linux

Již nějaký čas nás startem počítačů doprovází Unified Extensible Firmware Interface (UEFI), který je nástupcem Basic Input-Output System (BIOS). S UEFI se objevily funkce umožňující rychlejší a bezpečnější start operačních systémů (Windows). Právě bezpečnostní funkce Secure Boot se z počátku stala strašákem linuxové komunity. Ukáži vám, že začátkem roku 2014 není Secure Boot pro Linux nepřekonatelný problém. 


Úvodem

Minimálně férové bude zmínit se, že Secure Boot neprovozuji a myš je jediný mnou používaný produkt Microsoftu. Nevykládejte si to špatně. Osobně považuji Secure Boot za přínos do celého procesu zabezpečení, ale tato funkce mne příliš omezuje v mé zábavě (i vrtání se v Linuxu může být pro někoho zábava :-) ) a jak již bylo zmíněno, nepoužívám Windows.

Funkce Secure Boot je nejvíce využitelná právě pro uživatele Windows, neboť je pro útočníky mnohem jednodušší nalézt zranitelnost rozšířeného operačního systému s jedním jádrem a infikovat jeho start malwarem, než hledat zranitelnost v mnoha variacích linuxového jádra. V úplném bezpečí však není ani Linux.

Na Secure Boot jsem narazil až při obnově hardwaru v listopadu 2013. Pouhá zvídavost je zodpovědná za mnohatýdenní studium a testování této funkce. Velkou inspirací se pro mé pokusy stali Matthew Garrett (shim) a Roderick W. Smith (rEFInd).

Cílem tohoto článku je obeznámit vás nejen se základními aplikacemi pro manipulaci s UEFI a Secure Boot, ale i poukázat na možná řešení komplikací spojených s provozem Linuxu pod Secure Boot.

UEFI boot

UEFI po otestování hardwaru nenahlíží do MBR, ale do EFI System Partition, což je samostatný bootovací oddíl, kam operační systémy ukládají EFI aplikace zodpovědné za jejich start. Na tomto systémovém oddílu si každý nainstalovaný operační systém vytvoří vlastní adresář obsahující vše potřebné pro jeho start, a nedochází tak k ovlivňování startu ostatních systémů jako u MBR. EFI aplikací mohou být univerzální zavaděče (ELILO, Grub2 atd.), různé utilitky (např. test paměti, shell), samozřejmě zavaděč daného operačního systému a v případě Linuxu i kernel samotný.

Oproti BIOSu je zde podstatná změna v pořadí bootování (v UEFI např. Startup>Boot). Každý nainstalovaný operační systém vytvoří v NVRAM záznam o umístění spouštěcí efi aplikace na EFI System Partition a tento spouštěcí parametr přidá (alespoň v mém případě) právě do pořadníku bootování. Zde je poté nutno nastavit položku, z jaké chcete bootovat (USB, CD, Fedora, Windows atd.). Umístění nejen tohoto seznamu se liší dle výrobce a zhlédnutí příručky k základní desce vám napomůže.

EFI System Partition

Systémový oddíl typu FAT32 s nastaveným příznakem boot (nikoliv boot_legacy). Nesmí být součástí LVM, raidu nebo být šifrován. V běžném provozu jej Linux připojuje do /boot/efi. Velikost oddílu je diskutabilní, ale v mnoha případech je zmiňována velikost 512MB (kvůli FAT32 formátování ve Windows). Po nainstalování mnoha operačních systémů však objem dat nepřesáhl 50 MB.

Na tomto oddíle můžete nalézt “hlavní adresář” /efi/boot  obsahující soubor bootx64.efi. Selže-li čtení ze všech zařízení (např. kvůli smazání NVRAM), pokusí se UEFI nalézt na EFI System Partition právě tento soubor a spustí jej (pokud existuje). Tohoto chování lze velmi dobře využít (a také zneužít) při tvorbě USB a dalších médií spustitelných pod UEFI.



Funkce Secure Boot

Bezpečnostní rozšíření v UEFI pro start certifikovaných operačních systémů. Se zapnutým Secure Boot nespustíte software, který nemá veřejný klíč tvůrce operačního systému uložený na základní desce v NVRAM. Toto chování zabraňuje spouštět škodlivý kód (vir) před samotným operačním systémem (Windows), ale zároveň znepříjemňuje používání vlastních konfigurací linuxové komunitě. Naštěstí lze ve většině případů tuto funkci na x86 platformě vypnout. Na ARM architektuře však Secure boot vypnout nelze.

Opět však záleží na výrobci hardwaru, jakým způsobem UEFI a Secure Boot implementuje do svého výrobku. Vždyť co výrobce, to jiný BIOS, natož UEFI a Secure Boot. Zakoupíte-li si například nový notebook s Windows 8, bude s největší pravděpodobností Secure Boot aktivní – k jeho vypnutí se sice můžete svobodně rozhodnout, ale provést to lze až po odsouhlasení podmínek používání operačního systému firmy Microsoft (ach ta svoboda).

Provoz operačních systémů

Předpokládám, že většina uživatelů bude chtít provozovat Linux společně s Windows 8. Než však začne vaše cesta úpravou Secure Boot, musíte si nejprve ujasnit, jakou Linuxovou distribuci chcete na počítači provozovat, protože některé kroky nejsou v jistých případech nutné. Pokusím se tedy nastínit vaše možnosti na několika příkladech.

Pro korektnost testů jsem využil nabídky Microsoftu a stáhl devadesátidenní trial verzi Windows 8.1. Z linuxových distribucí bylo nainstalováno openSUSE 13.1, Fedora 19, Ubuntu 13.10, Debian 7.2 a Mint 16.

Příklad č.1
  • Windows 8
  • openSUSE

Za openSUSE si můžete dosadit Fedoru nebo Ubuntu. Tyto tři distribuce jsou schopny startovat pod Secure Boot. Jejich start využívá aplikaci Shim, která kontroluje podpis nejen zavaděče (Grub2), ale i spouštěného linuxového jádra. Důležitá je shoda podpisů jednotlivých kroků zavádění se záznamy v databázi klíčů. Grub2 instalovaný těmito distribucemi by vám neměl činit problémy při spouštění Windows a za určitých podmínek i vlastnoručně kompilovaného jádra.

Příklad č.2
  • Windows
  • Debian

Debian je zde uveden jako zástupce ostatních Linuxových distribucí, které nepodporují start pod Secure Boot. Většinou vám v takové kombinaci operačních systémů selže spouštění pomocí Grub2. Nejjednodušší řešení je nainstalování rEFInd zavaděče, který bude schopen spouštět Windows 8. Provoz Linuxu bude záviset na možnosti jeho podepsání (vlastním certifikátem).

Příklad č.3
  • openSUSE
  • Ubuntu
  • Debian

Hardware obsahující pouze Linuxové distribuce je na tom ohledně spouštění pomocí Grub2 nejlépe. Stačí totiž podepsat svým certifikátem jen Grub2 z Debianu (příp. Mintu a dalších) a ten náhle dokáže (po drobných úpravách v grub.cfg) spouštět i ostatní podepsané distribuce (varianta se zranitelností v podobě spuštění nepodepsaného systému). Nebo podepsat jádro Debianu a spouštět jej Grubem z distribuce podporující Secure Boot (bezpečná varianta).

Z uvedených příkladů je patrné, že se Secure Boot pod Linuxem není až takový problém. Problémy vás čekají jen při kombinaci Windows a Linuxu bez oficiální podpory Secure Boot.

Certifikáty v NVRAM

Někteří výrobci umožňují uživatelům upravovat (mazat, přidávat) podpisy v NVRAM přímo z UEFI. Ostatní uživatelé jsou odkázáni na externí EFI aplikace. Než však přikročíme k úpravám, je vhodné seznámit se s databázemi certifikátů.

  • PK (Platform Key)
    Většinou obsahuje jediný veřejný klíč
  • DB (Signature Database)
    Sada klíčů používaných pro ověřování ovladačů nebo aplikací.
  • DBX (Signature Database Blacklist)
    Nedůvěryhodné klíče a hash podpisy
  • KEK (Key Exchange Keys)
    Sada důvěryhodných klíčů pro aktualizaci DB a DBX seznamů.
  • MOK (Machine Owner Key)
    Klíče tvořené uživatelem umožňující spouštět vlastní aplikace (lokálně kompilovaná jádra). Do této databáze zapisují aplikace MokManager a HashTool.

Tvorba média pro Secure Boot

Vytvoření flash disku s aplikacemi pro manipulaci s certifikáty není nikterak složité. Naprosté minimun je mít na takovém médiu Shell nebo rEFInd pro spouštění KeyTool.efi. S těmito aplikacemi si vystačíte, pokud tvorbu certifikátů a podepisování binárek budete činit ve stávající instalaci linuxové distribuce.

O mnoho těžší však není takový flash disk doplnit o live Linux, který bude zastávat tvorbu certifikátu a následné podepisování. Vyhnete se tak kompilaci potřebných aplikací z gitu (sbsigntool, gnu-efi, efitools), nenachází-li se balíčky pro vaši distribuci v příslušném repozitáři.

  1. Připravte flash disk (1GB verze postačí) vytvořením GPT tabulky oddílů (např. Gparted = Zařízení > Vytvořit tabulku oddílů > Pokročilé > gpt ). Po vytvoření tabulky je vhodné rozdělit flash disk na dva oddíly formátu FAT32. První oddíl o velikosti alespoň 800 MB (jako název zadejte uefiflash) pro Fedoru a základní EFI aplikace. Druhý oddíl (název dataflash) se ve Fedoře lépe používá pro práci s daty. Názvy oddílů můžete použít dle vlastního uvážení, ale použijete-li zde uvedené, ušetříte si práci při zadávání příkazů v terminálu.
  2. Stáhněte obraz Fedory 20 Live LXDE. Máte-li již obraz Fedory 19, můžete použít i tuto verzi, neboť celý postup vznikal ve Fedoře 19 a poté byl odzkoušen v nové verzi. Po stažení rozbale ISO obraz na první oddíl flash disku (např. pomocí Správce archivů) a přejmenujte adresář /EFI/BOOT na /EFI/fedora.
  3. V adresáři /EFI/fedora nahraďte obsah souboru grub.cfgnásledujícím:
    set default="0"
    set timeout=1
    
    search --no-floppy --set=root -l 'uefiflash'
    
    menuentry 'Start Fedora Live' {
          linuxefi /isolinux/vmlinuz0 root=live:LABEL=uefiflash rw rd.live.image quiet rhgb
          initrdefi /isolinux/initrd0.img
    }
    
  4. Stáhněte rEFInd 0.7.7.zip a rozbalte jej na druhý oddíl. Na prvním oddílu vytvořte adresář /EFI/Boot, do kterého překopírujte a přejmenujte soubory refind_x64.efi na bootx64.efirefind.conf-sample na refind.conf

    Chcete-li spouštět jádra nacházející se mimo EFI System Partition zkopírujte obsah adresáře drivers_x64 do /EFI/Boot/drivers_x64. Jedná se o ovladače souborových systémů, které umožní rEFIndu nahlédnout do ostatních oddílů.
  5. Poupravte soubor refind.conf/EFI/Boot – odkomentujte řádky:
    textonly
    textmode 2
  6. Na druhém oddílu flash disku vytvořte adresáře rpm, moje_cert, orig_cert a stáhněte do adresáře rpm tyto balíčky:

    sbsigntools-0.6-4.1.x86_64.rpm
    gnu-efi-3.0q-43.1.x86_64.rpm
    efitools-1.4.2-1.1.x86_64.rpm

  7. Restartujte počítač do UEFI a nastavte Secure Boot na Setup Mode. Po uložení nastavení a restartu, nastartujte Fedoru z flash disku (položka obsahující BOOTX64.efi na uefiflash)

Pokračování příště

To je pro dnešek všechno a příště budeme pokračovat vytvořením klíče a certifikátu, podepsáním souborů a instalací zavaděče

Diskuze (14) Nahoru