Před časem jsem v článku popisoval, jak mít šifrovaný celý disk na serveru a odemykat ho vzdáleně pomocí SSH. Tato metoda úspěšně chrání data na discích, pokud by byl například server odpojen a někým neznámým odvezen. Vyžaduje ovšem aktivitu správce po každém startu. Server totiž pak není schopen nastartovat sám, ale je třeba se přihlásit k jeho dočasnému SSH serveru, který běží v ramdisku, a disky odemknout. Teprve pak celý systém nastartuje.
Takové řešení nám stačí na jeden server, ale příliš neškáluje. Jeho výhodou naopak je, že nevyžaduje žádnou další podporu a vystačíme si právě s jedním strojem se zašifrovaným diskem. Pokud bychom ale chtěli více, budeme muset sáhnout po sofistikovanějším nástroji. Ten by nám měl umožnit automatický start bez uživatelského zásahu.
Tang a Clevis
Network Bound Disc Encryption (NBDE) umožňuje získat klíč ke svazku, který je zašifrovaný pomocí linuxového nástroje LUKS. Místo manuálního zadávání hesla se náš stroj automaticky spojí se serverem a vyžádá si od něj klíč. Ten je pak zkombinován s místním tajemstvím a použit k výpočtu dešifrovacího klíče k našemu disku. Dokud je nám zmíněný server k dispozici, můžeme dešifrovat bez zadávání hesla.
Implementace serverové části se jmenuje Tang, klienta pak zajistí nástroj Clevis. Nejprve je potřeba použít Clevis a provést úvodní propojení šifrovaného svazku se serverem Tang. Na klientské straně přitom vznikne tajný klíč označovaný jako klientský JSON Web Key (cJWK), který je zkombinován se serverovým veřejným klíčem (sJWK), čímž vznikne výsledný dešifrovací klíč (dJWK), který může být přidán do klíčenky v šifrovaném svazku.
Pokud pak chceme svazek použít, můžeme v budoucnu kdykoliv stejné informace použít k novému vygenerování dešifrovacího klíče. Klient nejprve vytvoří dočasný klíč (eJWK), který zkombinuje se svým klientským tajemstvím (cJWK) a vytvoří tím autentizační zprávu pro server (xJWK). Server tuto zprávu zkombinuje s se soukromou částí svého klíče (sJWK) a vytvoří odpověď (yJWK). Klient pak tuto informaci zkombinuje se serverovým veřejným klíčem (sJWK) a dočasným klíčem (eJWK) a vznikne konečný dešifrovací klíč (dJWK). S ním může přistoupit k rozhraní LUKS a požádat o připojení svazku.
Podstatné je, že Clevis je schopen automaticky získat a použít tajemství pro dešifrování disku, pokud je připojen do sítě se správným serverem. Tang je proti tomu jednoduchý bezestavový software, který pomocí svého API přijímá požadavky od klientů, kombinuje správně klíče a posílá je zpět.
Instalujeme server Tang
Tahle část je velmi jednoduchá, vlastně stačí jen nainstalovat balíček tang
. Já jsem celý postup vyzkoušel se dvěma instalacemi distribuce Debian, ale to podstatné by mělo být stejné na všech distribucích.
# apt install tang
Tang po instalaci vygeneruje své klíče do adresáře /vat/db/tang/
. Pokud by to na vaší distribuci neudělal, použijte k tomu utilitu v /usr/lib/x86_64-linux-gnu/tangd-keygen
.
Po instalaci se také služba rovnou spustí a začne poslouchat na portu 80, což můžete ověřit pomocí utility ss (socket statistics). Pokud byste chtěli port změnit, provedete to pomocí příkazu systemctl edit tangd.socket
, kam zapíšete například:
[Socket] ListenStream= ListenStream=8880
Poté byste museli znovu načíst konfiguraci a socket restartovat:
# systemctl daemon-reload # systemctl restart tangd.socket
Můžeme ještě ověřit, že Tang má k dispozici klíče a odpovídá na požadavky přes API:
# tang-show-keys QpIrKdVFZPEuAF-lj4UGMTdVT3E # curl localhost/adv {"payload":eyJrZXlzIjpbeyJhbGciOiJFUzUxMiIsIm…
Tím jsme dokončili a ověřili jednoduchou instalaci serveru. Zbývá to podstatné: naučit klienty v síti odemykat disky automaticky.
Instalujeme klient Clevis
Na začátku máme k dispozici čistou instalaci operačního systému, která používá šifrované disky. Instalátor Debianu umožňuje šifrovat celý systémový disk nebo je možné například zašifrovat jen svazek s uživatelskými daty. Já jsem použil kompletně šifrovaný disk, ale stejný postup bude fungovat i v jiném režimu.
Při bootu se nejprve načte linuxové jádro a inicializační ramdisk a poté je uživatel na konzoli dotázán na heslo k šifrovanému svazku, který se připojuje pomocí údajů uložených v tabulce /etc/crypttab
. Ta je při generování zkopírována do ramdisku, takže systém v rané fázi startu ví, co je třeba kam připojit. Pokud zadáme správně heslo, obsah disku je k dispozici, mohou se z něj připojit souborové systémy a start pokračuje. Takový je tedy výchozí stav.
Nyní musíme na klienta nainstalovat Clevis a s ním i nástroje potřebné pro spojení s šifrovacím systémem LUKS. Protože budeme chtít disky odemykat automaticky při startu, rovnou přidáme i příslušný balíček pro integraci do ramdisku.
# apt install clevis clevis-luks clevis-initramfs
Nyní musíme zjistit, který disk máme šifrovaný. Nejjednodušší je použít utilitu lsblk
, která nám přehledně zobrazí rozložení disků v našem systému. V mém případě je šifrovaný svazek na /dev/sda5
. Je čas ho propojit s utilitou Clevis. Budeme k tomu potřebovat znát zmíněné označení svazku a adresu místního serveru Tang. Můžeme použít IP adresu nebo doménové jméno.
# clevis luks bind -d /dev/sda5 tang '{"url":"192.168.1.184"}' Enter existing LUKS password: The advertisement contains the following signing keys: QpIrKdVFZPEuAF-lj4UGMTdVT3E Do you wish to trust these keys? [ynYN] Y
Nejprve se nás utilita zeptá na heslo ke svazku, aby s ním mohla vůbec pracovat. Poté kontaktuje server a vypíše nám otisk jeho veřejného klíče. Ten jsme už viděli po spuštění utility tang-show-keys
. Potvrdíme shodu obou klíčů a vše je dokončeno.
Stalo se několik věcí:
- byl vytvořen nový klíč se stejnou entropií jako měl ten původní
- klíč byl zašifrován a přidán do klíčenky ve svazku
- klientský objekt cJWE byl uložen do hlavičky svazku
Od této chvíle můžeme svůj disk dešifrovat pomocí původního klíče (hesla), ale navíc to může stejně dobře udělat Clevis, protože má v klíčence přidaný svůj sekundární klíč. Detaily z hlaviček svazku přečteme pomocí nástroje cryptsetup
.
# cryptsetup luksDump /dev/sda5
Ve výpisu uvidíte dva klíče, jeden z nich má v metainformacích uvedeno clevis
.
Reboot
Nyní stačí rebootovat. Systém začne startovat a zeptá se nás na heslo k šifrovanému svazku. Zároveň ale paralelně získá adresu ze sítě, sám provede komunikaci se serverem Tang a přestože žádné heslo nezadáme, vše se rozeběhne a dobootuje. V serverovém žurnále přitom můžete vidět záznamy o tom, jak služba tangd
dostala požadavek a jak na něj úspěšně odpověděla.
Pokud by nebyl v síti k dispozici server se správným tajemstvím a nebylo by možné získat klíč k připojení svazku, stále máme možnost manuálně zadat heslo a systém naběhne standardním způsobem.