Bezpečné uspání s šifrovaným diskem

11. 5. 2012 20:55 (aktualizováno) Ondřej Caletka

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!

Sdílet