Hlavní navigace

Šifrované disky na serveru: automatické odemykání pomocí Tang a Clevis

18. 1. 2022
Doba čtení: 5 minut

Sdílet

 Autor: Depositphotos
Šifrování disku je užitečná věc a Linux ji má v základu zabudovanou. Co když ale chceme šifrovat disk na serveru a zároveň nechceme přijít o možnost automatického startu. Řešení nabízí duo Tang a Clevis.

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.

Cloud 22 temata

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.

Odkazy

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.