Bezpečný server na GNU/LINUXe
Publikované: 17.05.2021
Vážení návštevníci webovej stránky CSIRT.SK a priaznivci kybernetickej bezpečnosti, sme veľmi radi, že vám smieme predložiť sériu článkov, ktoré vás prevedú od bezpečnej inštalácie servera na operačnom systéme GNU/Linux (ďalej len Linux) až po najrôznejšie nastavenia, ktorých cieľom je čo najlepšie zabezpečiť operačný systém a služby na ňom bežiace. Vopred upozorňujeme, že séria článkov sa bude týkať primárne linuxových distribúcií Debian 10 a Ubuntu 20.04 LTS, avšak vzhľadom na kompatibilitu mnohých softvérových nástrojov využívaných v rôznych linuxových distribúciách, je vysoko pravdepodobné, že v článkoch spomenuté postupy budú aplikovateľné aj v iných než vyššie spomenutých distribúciách.
Dôvod, prečo sme sa rozhodli pripraviť túto sériu článkov je snaha zvýšiť povedomie a potrebu kybernetickej bezpečnosti pri správe serverov založených na operačnom systéme Linux. Veríme preto, že aj jednotlivé postupy uverejnené v týchto článkoch vám pomôžu porozumieť významu a potrebe aplikácie tzv. stratégie „Security In Depth“, ktorá je zameraná na viacvrstvové zabezpečenie výpočtových systémov s cieľom minimalizácie potenciálu kompromitácie týchto systémov v prípade najrôznejších typov kybernetických útokov. Súčasne si však dovoľujeme poprosiť vás, čitateľov, aby ste nám, po prečítaní jednotlivých článkov, vaše eventuálne postrehy posielali na emailovú adresu info@csirt.sk. Vaše podnety nám pomôžu pri príprave ďalších vzdelávacích a inštruktážnych materiálov, ako aj úprave už existujúcich. Rovnako si vás dovoľujeme poprosiť o prípadný návrh tém, ktoré sú pre vás, správcov linuxových serverov, alebo linuxových nadšencov zaujímavé a potešil by vás podrobnejší článok v slovenskom jazyku na určitú tému. A teraz už poďme k obsahu dnešnej témy …
Cieľom tohto a niekoľkých nasledujúcich článkov bude inštalácia plnohodnotného a zabezpečeného operačného systému bez použitia inštalátorov (programových sprievodcov inštalácie) so zámerom pochopenia jednotlivých krokov. Tým sa čitateľovi ponúka priestor pre vlastnú kreativitu, resp. prispôsobenie operačného systému a to nielen počas inštalácie, ale aj následne – už nainštalovaného operačného systému. Eventuálne, vďaka pochopeniu elementárnych princípov fungovania operačného systému, aj rekonštrukciu poškodeného systému.
Pre realizáciu inštalačného postupu popísaného v tomto článku predpokladáme výpočtové zariadenie s procesorom architektúry x86 64bit, operačnou pamäťou aspoň 1GB a dvoma diskami (nezáleží na konštrukčnom prevedení, ani na zhode výrobcov, či modelov jednotlivých diskov) disponujúcimi jednotlivo kapacitou aspoň 15GB.
Úvodné nastavenia
Nastavenie UEFI rozhrania
Prvým krokom pre inštaláciu bezpečného operačného systému je správne nastavenie UEFI rozhrania. Podrobnejší popis, čo je UEFI, jeho nadstavba SecureBoot, alebo TPM modul bude uvedené v nasledujúcom článku, preto na tomto mieste uvádzame aspoň základné informácie. UEFI (Unified Extensible Firmware Interface) je rozhranie, ktoré existuje medzi hardvérom a firmvérom na jednej strane a softvérom (primárne operačným systémom) na strane druhej. UEFI je definované prostredníctvom špecifikácie, ktorú vyvíja a udržiava UEFI konzorcium (fórum). Veľmi zjednodušene môžeme povedať, že UEFI je vylepšený BIOS (Basic Input Output System), ktorý nachádzame v starších počítačoch. Bezpečnostná nadstavba “SecureBoot” bola do špecifikácie UEFI pridaná vo verzii 2.3.1. Táto nadstavba vyžaduje, aby každý binárny súbor (prípadne binárny vykonávateľný dátový blok), ktorý je využitý v procese zavádzania operačného systému, bol verifikovaný pred jeho spustením. Nakoniec TPM modul (Trusted Platform Module) je digitálny integrovaný obvod, ktorý primárne umožňuje bezpečné uchovanie privátnych dát a sledovanie stavu výpočtového zariadenia, v ktorom je implementovaný.
Nakoľko každý výrobca matičnej dosky môže využívať integrovaný obvod špecifického implementátora UEFI, nie je možné presne popísať správne nastavenie UEFI rozhrania. Dôležité je sa zamerať na nasledovné skutočnosti:
- zapnutie podpory SecureBoot,
- v prípade, že je v nastaveniach možné vybrať rôzne módy, je potrebné zvoliť “Standard mode”, eventuálne ak nie je k dispozícii, tak zvoliť predvolený,
- v prípade, že zapnutie SecureBoot umožňuje výber operačného systému, je potrebné zvoliť systém Windows (z dôvodu prítomnosti certifikátov podpísaných Microsoft-om),
- vypnutie kompatibilného zavádzacieho módu (CSM), čím sa následne budú akceptovať len digitálne podpísané binárne súbory
- deaktivácia inštalačných zdrojov (CD, DVD, čítačky pamäťových kariet, USB zariadenie …), ktoré nebudú pre inštaláciu a následný beh operačného systému potrebné
- aktivácia TPM modulu (Secure module), prípadne ak je na výber verzia TPM, je potrebné zvoliť verziu 2.0
Zavedenie inštalačného obrazu
Debian 10 (Buster) – UEFI
V prípade, že nie je dostupný DHCP server, zobrazí sa nasledovná výzva pre manuálne nastavenie počítačovej siete (IP adresa, maska siete, predvolená brána a primárny DNS server):
Nasleduje konfigurácia názvu servera a eventuálne nastavenie DNS domény:
Nakoniec sa zobrazí informácia o nedostupnosti diskových oddielov, v prípade, že disky predtým neboli používané, alebo boli premazané:
Eventuálne, ak realizujeme inštaláciu na výpočtovom zariadení, na ktorého diskoch sa nachádzajú diskové oddiely:
Posledným krokom je vstup do konzoly príkazového interpretátora. Je vhodné sa hneď po vstupe do konzoly číslo 1 prepnúť do konzoly číslo 2 (ev. 3) klávesovou skratkou Alt+F2 (ev. Alt+F3) a stlačiť klávesu Enter, ako zobrazuje obrázok nižšie vpravo:
Ubuntu 20.04 (Focal Fossa) – UEFI
V prípade inštalácie z média Live Server 20.04
je situácia výrazne jednoduchšia. V podstate nie je nutné vykonať žiadnu aktivitu a v momente nábehu inštalátora, postačí stlačiť klávesovú skratku Alt+F2, čím dôjde k prepnutiu do druhej konzoly. Inštaláciu je potrebné vykonávať s privilégiami používateľa root, preto je vhodné po prepnutí zadať príkaz sudo su -
Primárna inštalačná fáza
Docielenie bezpečnosti určitého systému nikdy nie je dokonalé, ale intenzita úsilia o zabezpečenie a vynaložené prostriedky sa vždy odvíjajú od dôležitosti predmetného systému. Cieľom tohto dokumentu je snaha o vyvážený prístup k zabezpečeniu systému, ktorý ponúka bežne dostupné služby v sieti Internet-u. Z tohto dôvodu sme pridali na viacerých miestach poznámky k zabezpečeniu, ktorých realizáciu ponechávame na uvážení implementátora systému a jeho osobných preferenciách. Preto je potrebné v tomto momente podotknúť, že výpočtové zariadenie, ktoré je predmetom inštalácie a má už pridelenú verejnú IP adresu, je vhodné od počítačovej siete fyzicky odpojiť, alebo dočasne deaktivovať sieťové rozhranie:
# ip link set down
Minimálne v prípade distribúcie Ubuntu 20.04 sa odporúča zastaviť systémovú službu openssh
, ktorá je automaticky spustená pri zavádzaní operačného systému z inštalačného média a počúva na štandardnom porte 22.
# systemctl stop ssh
Čistenie diskov
V prvom kroku je potrebné vykonať kontrolu stavu diskov a diskových oddielov. Kontrolu je možné vykonať viacerými príkazmi, napr. parted, sfdisk, fdisk
a podobne. V nasledujúcich príkladoch budeme z hľadiska uniformnosti na analýzu a modifikáciu diskov využívať príkaz fdisk. Kontrola síce nehrá rolu vzhľadom na inštaláciu nového systému. Je skôr dôležitá z dôvodu verifikácie, či disky, na ktoré sa bude inštalovať nový operačný systém, neobsahujú dáta, ktoré je potrebné zálohovať. Príkaz na analýzu aktuálneho stavu diskov:
# fdisk -l
Rovnako je potrebné overiť aktivitu RAID polí:
# cat /proc/mdstat
a v prípade, aktivity, je potrebné všetky aktívne polia zastaviť:
# mdadm --stop /dev/mdX
kde X
je číslo aktívneho poľa. Po zastavení všetkých polí je potrebné overiť činnosť systémovej služby mdadm:
# ps faxu | grep mdadm
a v prípade, že je aktívna, je potrebné ju zastaviť:
# killall mdadm
Následne je potrebné odstrániť metadáta z RAID polí zo všetkých diskov, ktoré mali pri výpise príkazom fdisk
vyššie nastavený príznak RAID poľa:
# mdadm --zero-superblock /dev/sdXY
kde X
je označenie disku a Y
označenie diskového oddielu. Posledným krokom v procese čistenia diskov je tzv. nízkoúrovňové formátovanie, čiže prepísanie celých diskov ASCII 0:
# dd if=/dev/zero of=/dev/sdX bs=<veľkosť sektora>
kde X
je označenie disku. Veľkosť sektora je pri menších diskoch zväčša 512 bajtov, pri väčších 4096 bajtov a tento údaj je možné získať prostredníctvom utilít napr. parted, sfdisk, fdisk
(viď. príklad vyššie). Zadanie veľkosti sektora však nemá funkčný dosah, ale len dosah na rýchlosť operácie a tento parameter (bs) nemusí byť vôbec uvedený. Formátovanie viacerých diskov je možné realizovať aj paralelne vo viacerých konzolách.
Prepísaním celých diskov znakom ASCII 0 sa odstránili všetky diskové oddiely, nakoľko informácie o rozdelení disku sú súčasťou diskového pamäťového priestoru. Pre účely tohto dokumentu bude v nasledovných krokoch vytvorené rozdelenie diskov ako uvádzajú nasledujúce tabuľky. Prvý disk budeme označovať SDA
, druhý disk budeme označovať SDB
. Začiatok a koniec diskových oddielov sú udávané v počte sektorov, pričom veľkosť sektora sa predpokladá 512 bajtov. Veľkosť partície je udávaná v počte bajtov:
Dôležité upozornenie: Názvy diskov v obrázkoch budú pomenované nasledovne: VDA
, čo je v skutočnosti popisovaný disk SDA
a VDB
, čo je v skutočnosti popisovaný disk SDB
. Dôvod rozdielnosti pomenovaní spočíva v tom, že pre účely tohto článku, bol operačný systém inštalovaný pomocou virtualizácie KVM, čím sa vo virtuálnom stroji identifikujú virtuálne disky označením VDx
. Rozdielne pomenovanie diskov sme ponechali aj z dôvodu, aby si čitateľ uvedomil túto skutočnosť v prípade inštalácie operačného systému vo virtuálnom stroji.
Vytvorenie vyššie uvedeného rozdelenia disku prostredníctvom programu fdisk
je možné zrealizovať pre disk SDA
a pre disk SDB
ako ukazujú nasledujúce obrázky. Editovanie rozloženia konkrétneho disku sa zrealizuje príkazom (X
je označenie disku):
# fdisk /dev/sdX
Najprv sa písmenom g
vytvorí GPT disková tabuľka. Písmeno n
vytvára nový diskový oddiel a písmenom t
sa nastavuje typ diskového oddielu.
Dôležité upozornenie: Takto vytvorené diskové oddiely je ešte potrebné natrvalo zapísať na disk, čo sa zrealizuje písmenom w
v programe fdisk
, ako to je zobrazené na nasledujúcich obrázkoch.
Úprava disku SDA v programe fdisk
Úprava disku SDB v programe fdisk
Po úprave diskov je ich rozdelenie ako ukazuje nasledujúci obrázok. Dôležité je podotknúť, že jednoznačný UUID identifikátor disku Disk identifier
je generovaný podľa vopred daných pravidiel a náhodnosti.
Konečný stav po úprave rozdelenia diskov
Ďalším krokom je vytvorenie RAID 1 (zrkadlenie) polí pre BOOT
diskový oddiel, ako aj pre koreňový diskový oddiel operačného systému:
# mdadm --create -n2 -x0 -l1 --metadata 0.90 /dev/md0 /dev/sda2 /dev/sdb2
# mdadm --create -n2 -x0 -l1 /dev/md1 /dev/sda3 /dev/sdb3
Tieto príkazy vytvoria dve polia: /dev/md0, vytvorené z /dev/sda2 a /dev/sdb2, ktoré sa následne použije pre BOOT
diskový oddiel (/boot) a /dev/md1, vytvorené z /dev/sda3 a /dev/sdb3, ktoré je určené pre koreňový diskový oddiel operačného systému (/). BOOT
využíva metadata 0.90
, čo značí ich uloženie v rámci diskového oddielu (na konci) a má vplyv na zavádzač operačného systému. Hoci zavádzač GRUB2, ktorý použijeme pri tejto inštalácii vie pracovať aj s metadátami uloženými na začiatku oddielu, použitie prepínača metadata
je tu uvedené aj z demonštračných dôvodov. Ďalšie použité prepínače majú nasledovný význam:
--create : pole sa vytvara
-n2 : pocet aktivnych diskovych oddielov
-x0 : pocet zaloznych (spare) diskovych oddielov
-l1 : typ diskoveho pola 1=RAID1 (zrkadlenie)
Nasleduje vytvorenie súborových systémov na /dev/sda. Najprv oblasť /dev/sda1, ktorá bude systémovým diskovým oddielom pre UEFI a vyžaduje súborový systém FAT (File Allocation Table). V tomto prípade, ako ukazuje príkaz na riadku 1, vytvorí sa súborový systém FAT32. Ďalej na riadku 2 sa vytvorí súborový systém ext4 na vytvorenom RAID poli /dev/md0 a na riadku 3 sa pripojí (namountuje) tento súborový systém do adresára /mnt, ktorý je dočasným adresárom:
# mkfs.fat -F32 /dev/sda1
# mkfs.ext4 /dev/md0
# mount /dev/md0 /mnt -o nodev,nosuid,noexec
Nakoľko naším cieľom je vytvorenie bezpečného linuxového servera, je potrebné použitie šifrovania diskov. Pre účely tohto dokumentu budeme preto šifrovať koreňový diskový oddiel operačného systému. Z tohto dôvodu sa najprv vygeneruje 256 bitový kľúč za pomoci (pseudo) náhodného generátora, ktorý je reprezentovaný zariadením /dev/urandom. Príkaz na riadku 1 teda vytvorí súbor disk.key umiestnený v priečinku /mnt z náhodne generovaného prúdu bajtov (bs = veľkosť skupiny bajtov, count = počet skupín) o veľkosti presne 32 bajtov, teda 256 bitov. Riadok 2 odstráni akékoľvek oprávnenia prístupu k súboru s generovaným kľúčom. Príkaz cryptsetup
na riadku 3 upraví RAID pole /dev/md1 na šifrovaný diskový oddiel, pričom ako šifrovací kľúč sa využije vygenerovaný obsah súboru disk.key. Následne príkaz na 4. riadku odomkne kľúčom zo súboru disk.key šifrovaný diskový oddiel, ktorý sa vytvoril na diskovom poli /dev/md1, aby mohol byť jeho obsah využívaný v operačnom systéme. Ako identifikátor tohto odomknutého oddielu sa použil index root
. Názov tohto indexu je voliteľný, pričom následne je odomknutý oddiel dostupný cez /dev/mapper/(názov indexu). Riadok 5 vytvára na odomknutom oddiele ext4 súborový systém. Riadok 6 odpojí RAID oddiel /dev/md0, ktorý bol skôr pripojený a ktorý aktuálne obsahuje súbor s kľúčom disk.key. Následne príkaz na riadku 7 pripája do adresára /mnt odomknutý oddiel s indexom root
.
# dd if=/dev/urandom of=/mnt/disk.key bs=32 count=1
# chmod a-rwx /mnt/disk.key
# cryptsetup luksFormat /dev/md1 /mnt/disk.key
# cryptsetup luksOpen /dev/md1 --key-file /mnt/disk.key root
# mkfs.ext4 /dev/mapper/root
# umount /mnt
# mount /dev/mapper/root /mnt
Inštalácia a konfigurácia operačného systému
Úspešnou realizáciou príkazov predchádzajúcej časti sú disky pripravené na inštaláciu základného systému. Nakoľko budeme základný systém inštalovať z Internetu, je potrebné mať aktívne sieťové pripojenie. V prípade, že z dôvodu bezpečnosti bolo sieťové rozhranie v prípravných fázach deaktivované, je potrebné ho opäť aktivovať, ako ukazuje riadok 1 (a prípadne následne preveriť dostupnosť siete Internet, ako ukazujú riadky 2-4):
# ip link set up
# ip address
# ip route
# cat /etc/resolv.conf
V prípade, že počítačová sieť nie je správne nakonfigurovaná, pre úplnosť, jej manuálnu konfiguráciu je možné zrealizovať nasledovnou sériou príkazov. Pre účely demonštratívnej konfigurácie predpokladajme sieťové rozhranie eth0
, IP adresu: 192.168.1.10
, 24
-bitovú masku siete (255.255.255.0
), IP adresu brány 192.168.1.1
a primárny DNS server 1.1.1.1
(verejne dostupný CloudFlare DNS):
# ip link set up eth0
# ip address add 192.168.1.10/24 dev eth0
# ip route add default via 192.168.1.1
# echo 'nameserver 1.1.1.1' > /etc/resolv.conf
Ak je v počítačovej sieti dostupný DHCP server, je možné sieťové parametre vyžiadať automaticky z neho:
Debian 10:
# udhcpc -i eth0
Ubuntu 20.04:
# dhclient eth0
V prípade Ubuntu 20.04 potrebujeme pre pokračovanie naištalovať program debootstrap
. Debian 10 tento program už obsahuje. Pred samotnou inštaláciou programu je ale potrebné obnovenie zoznamu programových balíčkov vzhľadom na distribučný server:
# apt update
# apt install debootstrap
Nasleduje inštalácia základného operačného systému.
Debian 10:
# debootstrap buster /mnt
Ubuntu 20.04:
# debootstrap focal /mnt
Po úspešnej inštalácii je potrebné vykonať niekoľko nastavení pred samotným prepnutím sa
do nového nainštalovaného základného systému. Tieto nastavenia zahŕňajú na riadku 1 pripojenie RAID /dev/md0 do adresára boot/
, ktorý vznikol pri inštalácii základného systému a bude vo finálnom operačnom systéme použitý ako /boot oddiel. Riadok 2 vytvára vo vnútri boot/ adresára adresár efi
, ktorý bude slúžiť vo finálnom operačnom systéme ako systémový UEFI oddiel, na ktorom sa bude nachádzať digitálne podpísaný prvostupňový zavádzač operačného systému. Riadok 3 teda pripája EFI oddiel do adresára boot/efi/. Riadky 4-6 zdieľane (prepínač -o bind) pripájajú virtuálne súborové systémy: DevFS obsahujúci špeciálne súbory zariadení, ProcFS obsahujúci súbory súvisiace s behom operačného systému a SysFS obsahujúci súbory reprezentujúce prevažne dostupné hardvérové komponenty:
# mount /dev/md0 /mnt/boot
# mkdir /mnt/boot/efi
# mount /dev/sda1 /mnt/boot/efi
# mount -o bind /dev /mnt/dev
# mount -o bind /proc /mnt/proc
# mount -o bind /sys /mnt/sys
# mount -o bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
Ak všetky príkazy skončili úspešne, môžeme sa prepnúť do nového operačného systému prostredníctvom systémového volania chroot
, ktoré, ako už názov hovorí, zmení aktuálnu pozíciu koreňového súborového systému do adresára /mnt. Pri Debiane 10 je potrebné predradiť nastavenie jazyka a kódovanie systému:
Debian 10:
# LANG=C.UTF-8 chroot /mnt /bin/bash
Ubuntu 20.04:
# chroot /mnt /bin/bash
Po prepnutí do nového systému je potrebné obnovenie zoznamu programových balíčkov z distribučného servera. Vhodné je tiež nainštalovať obľúbený textový editor, hoci ako Debian, tak aj Ubuntu obsahujú minimalistickú verziu VIM editora a Debian obsahuje v základnej inštalácii aj nano
. Príklad inštalácie plnohodnotného VIM editora:
# apt update
# apt install vim
Následne je potrebné doplniť do konfiguračného súboru balíčkovacieho manažéra APT repozitáre pre inovačné aj bezpečnostné aktualizácie. Nasledovné výpisy sú len príkladom a môžu byť ľubovoľne upravené vzhľadom na dostupnosť serverov s distribučnými zoznamami a balíčkami.
Debian 10: /etc/apt/sources.list
deb http://deb.debian.org/debian buster main non-free contrib
deb http://deb.debian.org/debian buster-updates main non-free contrib
deb http://security.debian.org/debian-security buster/updates main non-free contrib
Ubuntu 20.04: /etc/apt/sources.list
deb http://sk.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://sk.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security main restricted universe multiverse
Po úprave konfiguračného súboru sources.list je potrebné synchronizovať (obnoviť) lokálne distribučné zoznamy a nainštalovať aktualizácie balíčkov základného operačného systému:
# apt update && apt upgrade
Do základného systému je ďalej potrebné nainštalovať programové balíčky pre manažment RAID polí mdadm
, manažment šifrovaných diskových oddielov cryptsetup
, nástroje na manažment SecureBoot mokutil
a efibootmgr
.
# apt install mdadm
# apt install cryptsetup
# apt install mokutil
# apt install efibootmgr
Vzhľadom na skutočnosť, že pred prepnutím sa do nového systému boli “namontované” aj virtuálne súborové systémy, pri inštalácii mdadm
sa automaticky nakonfiguruje už aj konfiguračný súbor RAID polí /etc/mdadm/mdadm.conf. Konfiguračný súbor by mal vyzerať napríklad takto:
ARRAY /dev/md0 UUID=c341d171:faab9fca:afae264f:626723db
ARRAY /dev/md1 metadata=1.2 UUID=290d219d:6f4a11cf:f20d1851:11dcb5ed name=master:1
Unikátne identifikátory diskov UUID môžeme skontrolovať príkazom blkid
. Parameter name
sa vytvára automaticky z názvu hostiteľa a poradového indexu, a je rovnako dostupný cez príkaz blkid
. Detailné informácie o konfiguračnom súbore mdadm.conf
je možné získať prostredníctvom manuálovej stránky man mdadm.conf
# blkid
Ďalším krokom je zabezpečenie automatického dešifrovania koreňového súborového systému pri štarte operačného systému. Informácie o šifrovanom súborovom systéme, ktorý sa nachádza na RAID poli /dev/md1 je možné zobraziť pomocou príkazu cryptsetup
nasledovne:
# cryptsetup luksDump /dev/md1
Dôležitý je unikátny identifikátor UUID, ktorý teraz dočasne uložíme do konfiguračného súboru /etc/crypttab. Ten obsahuje informácie pre správu šifrovaných diskových oddielov pri štarte operačného systému:
# cryptsetup luksDump /dev/md1 | grep UUID >> /etc/crypttab
Spôsobov, ako odomknúť šifrovaný diskový oddiel je viacero. Vzhľadom na demonštračný charakter tohto dokumentu sme zvolili nasledovný postup:
- V adresári /sbin vytvoríme skript
decrypt
, ktorý bude obsahovať ako premennú kľúč k disku kódovaný algoritmom BASE64 a tento skript pri spustení vypíše kľúč k šifrovanému disku v binárnej forme (teda dekódovaný algoritmom BASE64). - Nakoľko sa pri kódovaní a dekódovaní používa program base64, nakonfiguruje sa initramfs aktualizátor, aby pri vytváraní obrazu initramfs (initrd), zahrnul aj tento binárny súbor do tohto obrazu.
- Keďže na dešifrovanie disku sa využije napísaný skript
decrypt
, nakonfiguruje sa initramfs aktualizátor, aby zahrnul aj tento skript do obrazu initramfs. Zahrnutie skriptu zrealizujeme nepriamo editáciou konfiguračného súboru /etc/crypttab. - V poslednom rade sa upraví konfiguračný súbor /etc/fstab, ktorý obsahuje informácie o dostupných a pripájaných diskových oddieloch.
Takže teraz postupne – v prvom rade je potrebné vytvoriť dešifrovací skript, pričom je potrebné do neho vložiť kľúč disku kódovaný algoritmom BASE64 (kľúč disku sa stále nachádza na /dev/md0 pripojenom v boot/ priečinku):
# base64 /boot/disk.key > /sbin/decrypt
Následne potrebujeme upraviť skript /sbin/decrypt
napríklad takto:
#!/bin/sh
KEY="<base64 kluc z predchadzajuceho kroku>"
echo $KEY | base64 -d
Z bezpečnostných dôvodov je potrebné zmeniť prístupové oprávnenia k skriptu:
# chmod 700 /sbin/decrypt
Ďalším krokom je zahrnutie programu base64 do iniramfs. Na tomto mieste je potrebné v krátkosti objasniť proces, ktorým sa vytvára obraz initramfs. Ten jadro Linuxu využíva pri štarte operačného systému na komplexnú konfiguráciu operačného systému.
InitramFS je množina adresárov, konfiguračných súborov a skriptov, ktoré sa rôznym spôsobom v definovaných etapách podieľajú na tvorbe finálneho obrazu operačného systému.
Z pohľadu zamerania tohto dokumentu je potrebné spomenúť zvlášť skripty, ktoré sa nachádzajú v adresároch /usr/share/initramfs-tools/scripts a /usr/share/initramfs-tools/hooks. V prvom prípade ide o skripty, ktoré sú vložené do obrazu initramfs a sekvenčne vykonávané pri štarte operačného systému; v druhom prípade ide o skripty, ktoré sú zodpovedné za vybudovanie obrazu initramfs, nezúčastňujú sa však na štarte operačného systému. K spomínaným adresárom existujú analogické adresáre v /etc, teda /etc/initrams-tools/scripts a /etc/initramfs-tools/hooks, ktoré slúžia pre používateľské prispôsobenie finálneho obrazu. Ak teda požaduje administrátor systému úpravu obrazu initramfs, pohybuje sa výlučne v adresároch pod /etc/initramfs-tools. Detailné informácie o konfigurácii initramfs
je možné získať prostredníctvom manuálovej stránky man initramfs-tools
Pre presun programu base64 je v prvom rade potrebné vedieť, kde sa samotný binárny súbor nachádza (nie symbolická linka na súbor):
# ls -la $(which base64)
Samotný presun binárneho súboru teda docielime nasledovným skriptom, ktorý nech je nazvaný addons
. Skript umiestnime do /etc/initramfs-tools/hooks/.
#!/bin/sh
set -e
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /bin/base64 /bin/
exit 0
Premenná PREREQ
v skriptoch initramfs umožňuje nastaviť poradie spúšťania skriptov. Z pohľadu presunu programu base64 je najdôležitejší riadok 20, ktorý obsahuje funkciu copy_exec
, ktorá je implementovaná v súbore hook-functions, zahrnutom na riadku 18. Funkcia copy_exec
súčasne determinuje dynamické knižnice, ktoré binárny spustiteľný súbor base64 potrebuje pre svoj beh. Nakoľko addons
musí byť spustiteľný skript, je potrebné tiež pridať oprávnenie:
# chmod +x /etc/initramfs-tools/hooks/addons
Nasleduje úprava konfiguračného súboru /etc/crypttab. Do tohto súboru bol už vyššie pridaný unikátny identifikátor reprezentujúci šifrovaný diskový oddiel. Teraz je potrebné správne upraviť súbor crypttab:
root UUID=<ulozene UUID> none luks,keyscript=/sbin/decrypt
Jednotlivé parametre sú v súbore crypttab oddelené medzerami (je možné použiť samozrejme aj tabulátor). Prvý parameter je názov indexu, ktorý, ako sme už uviedli, slúži pre identifikáciu odomknutého diskového oddielu cez /dev/mapper/(názov indexu). Druhým parametrom je samotné UUID, ktoré je bez úvodzoviek. Tretí parameter je šifrovací kľúč, nakoľko však v tomto dokumente sa na dešifrovanie používa skript, kľúč obsahuje slovo none
, čiže nie je používaný. Posledný parameter je zložený z dvoch podparametrov oddelených čiarkou, pričom prvý podparameter luks
hovorí o šifrovacom nástroji, ktorým je disk šifrovaný. Druhý podparameter určuje cestu ku skriptu, ktorým sa zabezpečí získanie dešifrovacieho kľúča. Detailné informácie o konfiguračnom súbore crypttab
je možné získať prostredníctvom manuálovej stránky man ctypttab
Ako posledný potrebujeme modifikovať konfiguračný súbor /etc/fstab, ktorý musí obsahovať informácie o všetkých diskových oddieloch, súborových systémoch a ich parametroch, aby mohli byť použité, teda pripojené v operačnom systéme. Pre správne určenie UUID identifikátorov je možné opäť použiť príkaz blkid
. Jednotlivé záznamy v súbore fstab
sú radené v poradí ako sa jednotlivé diskové oddiely pripájajú. Príklad súboru fstab
(komentáre sú predradené znakom mriežka; UUID je potrebné nahradiť reálnymi hodnotami):
# Root direcory /
/dev/mapper/root / ext4 errors=remount-ro 0 1
# /dev/md0:
UUID=22f32fea-6113-423f-8bbb-d5db2edf3e25 /boot ext4 defaults 0 2
# /dev/sda1:
UUID=A575-62E1 /boot/efi vfat umask=0077 0 1
Detailné informácie o konfiguračnom súbore fstab
je možné získať prostredníctvom manuálovej stránky man fstab
.
Po inštalácii všetkých dôležitých programových balíčkov, a vykonaní nevyhnutnej konfigurácie je potrebné nainštalovať digitálne podpísaný zavádzač operačného systému a rovnako podpísané jadro operačného systému:
Debian 10:
# apt install grub-efi linux-image-amd64
Ubuntu 20.04:
# apt install shim-signed grub-efi-amd64-signed linux-image-generic
Nasleduje automatické nakonfigurovanie UEFI zavádzača operačného systému:
# grub-install
Taktiež je potrebné nainštalovať a nakonfigurovať internacionalizáciu: kódovanie znakov a časové pásmo:
Debian 10:
# apt install locales
# dpkg-reconfigure locales
# ln -sfn /usr/share/zoneinfo/Europe/Bratislava /etc/localtime
Ubuntu 20.04:
# dpkg-reconfigure locales
# ln -sfn /usr/share/zoneinfo/Europe/Bratislava /etc/localtime
Z hľadiska autentifikácie potrebujeme nastaviť heslo pre používateľa root
:
# passwd root
V ďalšom článku pridáme nového neprivilegovaného používateľa a nastavíme autentifikáciu prostredníctvom sudo
, čím sa zvýši bezpečnosť operačného systému ochranou privilegovaného používateľa.
Záverečné nastavenia a verifikácia
Operačný systém je v tomto momente nainštalovaný a nakonfigurovaný na svoje prvé použitie. Napriek tomu sa odporúča vykonať ešte niekoľko krokov. V prípade distribúcie Ubuntu 20.04 je potrebné v konfiguračnom súbore /etc/default/grub odstrániť z premennej GRUB_CMDLINE_LINUX_DEFAULT
slovo splash
, čím sa docieli vypnutie tapety
pri štarte operačného systému. Výsledný riadok v súbore grub
bude teda vyzerať nasledovne:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
Pre obe distribúcie je pre istotu vhodné zavolať príkaz update-initramfs
pre znovuvybudovanie obrazu initramfs a potrebné zavolať príkaz update-grub
, ktorým sa pregeneruje konfigurácia zavádzača operačného systému:
# update-initramfs -k all -u
# update-grub
Posledným krokom je verifikácia zavádzača operačného systému. Príkaz efibootmgr
je manažér pre UEFI rozhranie, čiže prostredníctvom tohto príkazu môžeme upravovať určité konfiguračné parametre UEFI rozhrania priamo bez nutnosti vstupu do neho po štarte počítača. Príkaz efibootmgr
zobrazí jednotlivé zavádzacie záznamy s informáciami o aktívnosti (symbolizovaný znakom hviezdička), poradí zavádzania (Boot Order) ako aj cestách k zavádzačom. V tomto dokumente popisovanej inštalácie by mal byť dostupný prvý v poradí aktívny prvostupňový zavádzač SHIM
, ktorý je digitálne podpísaný súkromným kľúčom Microsoft-u.
# efibootmgr --verbose
Nasledujúce príkazy vypíšu obsah primárneho konfiguračného súboru druhostupňového zavádzača GRUB
. Dôležité je verifikovať, či UUID diskového oddielu správne smeruje na diskový oddiel, ktorý sa má pripojiť do adresára /boot.
Debian 10:
# cat /boot/efi/EFI/debian/grub.cfg
Ubuntu 20.04:
# cat /boot/efi/EFI/ubuntu/grub.cfg
V prípade, že program efibootmgr
zobrazí zavádzacie záznamy, ktoré nie sú požadované, eventuálne sú archaické, tieto je možné odstrániť rovnako prostredníctvom príkazu efibootmgr
nasledovne:
# efibootmgr -b <cislo zaznamu vo formate XXXX> -B
Po úspešnom vykonaní všetkých príkazov z predchádzajúcej časti je možné opustiť prostredie chroot
, čo je možné vykonať klávesovou skratkou Ctrl+d, alebo príkazom exit
.
Posledným krokom je odpojenie (odmontovanie) všetkých pripojených súborových systémov a oddielov. Najprv v riadkoch 1-4 sa odpoja virtuálne súborové systémy. Následne v riadkoch 5-7 sa odpoja diskové oddiely. Riadok 7 uzamkne odomknutý šifrovaný diskový oddiel nazvaný root
. Riadky 8-9 bezpečne zastavia RAID polia a príkaz na riadku 11 reštartuje výpočtový systém a umožní tak zavedenie nového nainštalovaného a nakonfigurovaného základného systému:
# umount /mnt/sys/firmware/efi/efivars
# umount /mnt/sys
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/boot/efi
# umount /mnt/boot
# umount /mnt/
# cryptsetup close root
# mdadm --stop /dev/md1
# mdadm --stop /dev/md0
# reboot
A to je koniec prvého článku. Ak ste sa dostali až na toto miesto, podarilo sa vám od základov nainštalovať operačný systém Linux s podporou RAID-u a šifrovania. V nasledovnom článku sa pozrieme na sekundárnu inštalačnú fázu, ktorá bude okrem iného zahŕňať využitie TPM modulu na bezpečné automatické dešifrovanie diskových oddielov pri štarte operačného systému.