Oblíbil jsem si uspávání počítače, tedy režim Suspend-To-RAM. Počítač je možné vypnout i zapnout velice rychle a přitom vydrží poměrně dlouho na baterii. Jediný problém, který mě trochu trápil, je že šifrovací klíč pro oddíl /home
je stále přítomen v paměti, čímž se zvyšuje riziko úspěchu případného cold-boot útoku. Dlouho jsem ten problém ignoroval, nejsem totiž velký paranoik a vím, že kdyby někdo opravdu chtěl, pravděpodobně ze mě beztak heslo vymlátí.
Řešení, které se mi docela líbilo, popisuje Jenda Hrach. Využívá se funkce LUKSu, umožňující zapomenout heslo bez odpojení oddílu, takže všechny pokusy o zápis či čtení šifrovaných dat se zaseknou v kernelu. Nelíbil se mi ale způsob, jakým Jenda získával heslo pro odemčení oddílu po probuzení. Navázání na xscreensaver
s pomocí PAMu a sudo
mi připadalo příliš překombinované. Proto jsem přemýšlel nad způsobem, jak celý proces zjednodušit, získat heslo k disku co nejjednodušeji a pokud možno nezávisle na ostatních částech systému.
Nakonec mě napadlo použít starý dobrý textový terminál. Je vždycky k dispozici, a dá se na něj vždy psát uživatelem root. Nejprve jsem se snažil problém vyřešit jednoduše, přisvojením si virtuálního terminálu číslo 9:
chvt 9 exec </dev/tty9 &>/dev/tty9 TERM=linux clear cryptsetup luksResume crypt-home chvt 7
Toto řešení ale nefungovalo podle očekávání. Cryptsetup totiž standardně nepoužívá standardní vstup a výstup, ale namísto toho komunikuje s uživatelem pomocí řídicího terminálu /dev/tty
. Když jsem hledal, jakým způsobem změnit procesu řídicí terminál, objevil jsem program openvt(1), který dělá přesně to, co jsem chtěl, mnohem elegantněji. S přepínači -s
a -w
program nejprve přepne na volný terminál, spustí daný program s tímto terminálem, počká na jeho ukončení a nakonec přepne zpět na původní virtuální terminál. Přesně to jsem potřeboval!
Takto vypadá můj finální skript, který je spouštěn ve správnou dobu balíkem pm-utils, spouštěným pomocí nástroje UPower, který dostane pokyn od komponenty PowerDevil prostředí KDE. Soubor se jmenuje /etc/pm/sleep.d/97luks.sh
a je spustitelný. Pokud jej chcete použít, pravděpodobně bude potřeba změnit název šifrovaného oddílu crypt-home
na váš název.
#!/bin/sh # Arguments can be: # "suspend suspend" # "resume suspend" # "thaw hibernate" VOLUME="crypt-home" case "$1" in "suspend") sync cryptsetup luksSuspend $VOLUME ;; "resume") sleep 1 openvt -s -w -- bash -c "TERM=linux clear; cryptsetup luksResume $VOLUME" ;; esac
Díky KMS je přepínání mezi X a textovým terminálem doslova bleskové, navíc je i textový terminál konečně v nativním rozlišení. Popsané řešení nijak nezasahuje do běžného uspání a probuzení, takže po zadání hesla k disku bude pravděpodobně potřeba ještě zadat heslo k odemčení relace. To ale není vada, takové bylo zadání :).
Pokud se vám zápisek líbil, můžete zkusit použít tlačítko Flattr!
Když jsem měl ještě T500, dělával jsem to podobně, ale vlastně celé "ručně", přes ioctl se přepnul na tty6, pustil luksSuspend, echo mem > /sys/power/state, apod.
Co jsem ale navíc ošetřil, byla (ne)možnost přepnout na jiný tty terminál. Nenašel jsem na to žádnou utilitku, jen ioctl VT_LOCKSWITCH, takže jsem si napsal malý C prográmek - http://pastebin.com/tC78pBRw - který přepne na daný TTY terminál a zamkne přepínání. To je odemčeno až po správném zadání hesla pro LUKS (až luksResume pouštěný v cyklu uspěje) v rámci přepnutí zpět na tty7.
Stejně to ale není ideální řešení - záleží na tom, co chcete chránit. Pokud je puštěný např. thunderbird a má v paměti cache většiny mailů, je zašifrovaný a zamčený disk nanic. To už raději suspend-to-disk do zašifrovaného swapu a přepsání paměti náhodnými daty před vypnutím systému.
Paranoidní kamarád si udělal boot z USB flashky a má disk zašifrovaný celý (bez MBR, bez LUKS hlavičky, celý disk jako jeden velký šifrovaný PV pro LVM) - taky řešení pro někoho, uspává do swapového LV.
Jak jsem psal, pro mě šlo hlavně o pocit, leta jsem měl uspaný notebook i s klíčem v paměti a taky mi to nevadilo. A ještě předtím jsem neměl disk v notebooku šifrovaný vůbec a ani žádné zálohy :)
Hlavně mým požadavkem bylo, aby stále bylo možné počítač nabootovat a zprovoznit vzdáleně, tedy mít možnost ručně se přihlásit jako root a zadat heslo z toho účtu.
He he, pam_jenda bez PAMu a bez Jendy :).
Nestává se ti, že ti mezi luksSuspendem a samotným uspáním něco zrovna jako napotvoru zapíše na disk a celé uspávání se kvůli tomu zasekne? Mně se to stává, když Firefox zrovna něco dělá a tudíž cachuje.
https://www.abclinuxu.cz/blog/urandom/2012/1/suspend-to-ram-sifrovany-disk-a-coldboot-utok
To, že mi počítač kvůli zamrzlým procesům neusínal, se mi stávalo během vývoje, pomohlo zavolání sync před voláním cryptsetup a taky nastavení čísla skriptu na 97, aby se spouštěl jako jeden z posledních.
Ale samozřejmě je potřeba uspávat v době, kdy je počítač v klidu. Pokud bude nějaká aplikace intenzivně pracovat s diskem, pravděpodobně stihne zamrznout ještě před uspáním a počítač po cca. třiceti sekundách uspávání vzdá.
[6] To určitě ne. Tam bych doporučoval před uspáním swap vypnout a po uspání znovu inicializovat. Tedy za předpokladu, že je dostatek RAM, což u současných počítačů bývá splněno.
Ale podle mě to není třeba řešit. Nedokážu si představit, jak smysluplně zneužit data ze swap oddílu.
[8] Ano, tak jsem to taky na jednom počítači provozoval, abych nemusel zadávat vícero hesel. Na disku byly jen dva oddíly - boot a LUKSovský. Ten měl uvnitř PV a v LVM swap a ostatní oddíly. Hibernace fungovala bez problému, ale při suspend-to-RAM nebylo možné zahodit heslo, protože je potřeba, aby zůstaly přístupné minimálně některé systémové nástroje (jako cryptsetup).
Šlo by to řesit postupem odkazovaným v [3], ale to už je hodně overkill.
Co o sobě napsat? Absolvent ČVUT FEL, linuxák, síťař. Mimo to se zajímám o elektrotechniku, elektroniku a speciálně elektrické pohony.
Přečteno 57 276×
Přečteno 15 946×
Přečteno 15 859×
Přečteno 15 160×
Přečteno 13 129×