Cryptohome, alebo aby slidili neslidili

23.07.2006 17:10 | blackhole_ventYl

Nasledujuce MiniHOWTO zhrnuje niekolko zkladnych krokov, ktore je vhodne spravit, ak chceme docielit aspon ciastocne sukromie v ramci svojho vlastneho systemu. Popisovane bude vytvorenie cryptoloopoveho domovskeho adresara, skripty na jeho pohodlne pripojenie po prihlaseni a niekolko dalsich preventivnych opatreni.

Zrejme nikoho nelaka predstava, ze by sa mal niekto iny hrabat v jeho vlastnych logoch komunikacie, mailoch, dokumentoch, projektoch, alebo inych osobnych datach. Za predpokladu, ze sa system nachadza na bezpecnom mieste, bootovanie je patricne osetrene a system je dobre zaheslovany, je dost tazke sa k tymto datam dostat. V momente, ked ma tretia strana moznost spustit na pocitaci svoj vlastny operacny system, sa data stavaju absolutne nechranene. Rovnako tak k moznej kompromitacii dat moze dojst v pripade, ze dojde ku kradezi pocitaca. V tomto pripade nepomoze ani najdlhsie heslo, pretoze tokolvek je schopny data z pocitaca vykradnut, vzhladom k tomu, ze su ulozene v plain forme. V tomto pripade je jedinym riesenim kryptovanie. Linux za ucelom kryptovania ponuka niekolko moznosti, ktore mozno v zasade rozdelit na dve kategorie:

  • cryptodevices
  • cryptofilesystemy

Cryptodevices su zariadenia, ktore vacsinou na baze loop-u vytvaraju blokove zariadenie, ktore kryptuje data pri zapise na zariadenie a dekryptuje pri citani zo zariadenia. Na takomto kryptozariadeni je mozne nasledne vytvorit filesystem a pripojit ho do VFS ako by sa nechumelilo. V pripade cryptodevices je teda komprimovany cely filesystem ako celok vratane metadat, struktur adresarov a masterbloku.

Cryptofilesystemy pracuju na principe parazitovania na inych filesystemoch. Zvacsa sa jedna o NFS klienty, alebo o FUSE medzivrstvu k niektoremu uz existujucemu filesystemu, ktoremu poskytuju schopnost kryptovania. V pripade NFS klientskych filesystemov je nevyhodou filesystemu nutnost narabat s NFS exportami, avsak vyhodou priama sietova transparentnot filesystemu. V pripade FUSE filesystemov je nevyhodou nutnost pritomnosti FUSE modulu v kerneli, avsak je to vyvazene tym, ze k mountovaniu a umountovaniu filesystemu nie su potrebne rootovske prava, ani zasahy do fstab-u. Cryptofilesystemy vacsinou funguju na principe toho, ze premapuju obsah niektoreho uz existujuceho adresara do obsahu noveho filesystemu, pricom pri zapise do suborov v tomto adresari je obsah suborov a ich nazov kryptovany a pri citani dekryptovany. Kryptofilesystemy vsak z dovodu nutnej kompatibility s VFS Linuxu a nutnostou spoluprace s nadradenym filesystemom nemozu kryptovat metadata (prava, cas vytvorenia, modifikacie, pristupu, velkost), preto tieto informacie spolu so strukturou adresarov ostavaju utocnikovi odhalene.

Dalsim podstatnym rozdielom medzi cryptodevices a cryptofilesystemami je to, ze cryptodevices vyzaduju alokaciu miesta, ktore budu vyuzivat ako kryptozvazok dopredu, pricom neskor je pomerne komplikovane toto pridelene miesto resiznut. Teda ak najprv naalokujeme 1 GB dat a neskor zistime, ze je tento kryptozvazok pre nase potreby prilis maly, je nutne podstupit niekolko riskantnych krokov, aby sa zvazok zvacsil. Cryptofilesystemy v tomto maju vyhodu, nakolko pouzivaju pre svoj beh nadradenu vrstvu filesystemu, v pripade, ze by na nadradenom filesysteme doslo miesto, staci kryptovane data presunut na ine miesto (vacsi filesystem) a zmenit mountovaci prikaz (popripade vytvorit symlink).

Pri zavadzani kryptovaneho filesystemu je nutne si uvedomit, ze filesystem, ktory je zakryptovany, sa neda pred jeho odomknutim (zadanie passfrazy a/alebo vlozenie kluca) pouzit. Zavedenie kryptofilesystemu je mozne na niekolkych urovniach. Je mozne kryptovat cely filesystem vratane dat binarnych programov, logov a zvysneho smetia. Pri takto vysokej urovni paranoye sa este obvykle pristupuje ku kryptovaniu swap oblasti (ak je pouzita). Poskytuje maximalnu uroven sukromia, avsak znamena velku uroven rezie pri kryptovani a dekryptovani vsetkych dat a programov pri ich spustani a pristupovani k nim. Druhou moznostou je kryptovanie domovskeho adresara uzivatela, kedy sa kryptuje len adresar /home/`whoami`/. Tato moznost poskytuje pomerne solidnu uroven sukromia, pretoze vacsina programov uklada svoje data len do domovskeho adresara, avsak odkryva binarne programy, skripty, logy a docasne subory zvedavcom. Tretou moznostou je explicitne kryptovanie niektorych datovych adresarov (ako je k videniu na niektorych serveroch, ktore si kryptuju adresare s citlivymi datami).

V zavislosti od zvoleneho sposobu kryptovania sa potom odlisuje sposob zadavania passphrase / kluca. V pripade kryptovania celeho filesystemu (cryptoroot), je nutne zadavat pristupovy kluc jednorazovo pri spusteni systemu. To ma nevyhodu v tom, ze kluc musi mat kazdy, kto eventuelne pravoplatne spusta pocitac. Ak uvazujeme bezny desktop, v pripade cryptorootu by museli poznat pristupove heslo / mat kluc vsetci, ktori na desktope pracuju. To zvysuje moznost jeho uniku, eventuelne znizuje moznost nasadenia tejto metody (nie kazdemu sa chce zadavat pri starte systemu 25 miestnu passphrase ku klucu, ktory navyse musi strkat do USBcka).

V pripade kryptovania domovskeho adresara musi dojst k zadaniu passphrase niekedy po prihlaseni usera (bolo by nelogicke sa pred loginom pytat, ktory user sa nam prihlasi a podla toho montovat jeho domovsky adresar). V tomto pripade je vyhodou /home/`whoami` na samostatnej particii. Pri tomto sposobe je nutne upravovat login a logout skripty tak, aby umoznili primontovanie / odmontovaie cryptoloopu pri prihlaseni a odhlaseni, idealne tak, aby sa pri prvom prihlaseni do systemu cryptoloop namontoval a pri poslednom odhlaseni zo systemu odmontoval. Existuje niekolko moznosti, akym klucom kryptovat cryptodevice. Budto mozno pouzit niektory z dostupnych patchov pre login / PAM a vyuzit ako passphrase ku cryptodevice uzivatelsky login, alebo mozno pouzit separatnu passphrase, ktora sa vyziada po prihlaseni. Prva moznost je menej bezpecna, pretoze hash hesla sa na disku nachadza v nechranenej forme a je mozne voci nemu podniknut utok a ziskat nejaku koliziu k heslu, popripade i samotne heslo.

V pripade explicitneho kryptovania obsahu niektorych adresarov je situacia jednoducha: heslo sa zada v momente, ked sa bude chciet kryptovany adresar namontovat. Tu je mozne vyuzit efektneho spojenia automountom a skriptami k dosiahnutiu maximalnej pohodlnosti (uvazujeme desktopovy system).

Vzhladom k dosiahnutiu maximalnej moznej bezpecnosti pri zachovani pohodlnosti je zrejme najlepsim riesenim pre desktopove systemy kryptovanie domovskeho adresara. Pri kryptovani domovskeho adresara mozeme vyuzit budto cryptodevice, ktore bude ulozene niekde inde (budto v subore, kvoli zvyseniu vykonu vsak lepsie na samostatnej particii).

Cryptoloop je mozne vytvorit jednoduchym postupom:

dd if=/dev/urandom of=/mnt/local/cryptohome/ventyl bs=1M count=1024

Vyssie uvedeny prikaz naalokuje subor o velkosti 1 GB a naplni ho nahodnymi datami. To je dolezite z toho dovodu, aby nebolo mozne vidiet, kolko z filesystemu je uz zaplnene (bezne by clovek pouzil /dev/zero, takze by bolo pekne vidiet, kam sa uz zapisovalo a kam uz nie). Eventuelne by mohlo byt riesenim aj to, ze by sa cryptoloop naplnil z /dev/zero a po inicializacii by sa prepisal nulami este raz, co by uz ale v spojeni s kryptovacim algoritmom vytvorilo patricny srot. Potom je treba tento filesystem inicializovat.

losetup -e aes /dev/loop0 /mnt/local/cryptohome/ventyl

Nasledne system od nas vyziada heslo. Toto heslo by malo byt co najdlhsie (pri pouziti AES algoritmu idealne viac ako 20 znakov, aby bol utok voci AES algoritmu menej casovo narocny, ako utok voci heslu). Heslo sa nikam neuklada, pouzije sa len pre inicializaciu kryptovacieho algoritmu AES. Nasledne je nutne cryptloop sformatovat

mkfs.ext2 /dev/loop0 -m 0

Flag -m 0 urci, aby oblast vyhradena rootovi mala velkost 0 %, pretoze root s tymto zvazkom pracovat bezne nebude.

Nasledne mozno cryptoloop zrusit a zacat normalne pouzivat.

Pri kryptovani domovskeho adresara treba v tom spravnom case tym spravnym sposobom tento adresar pripojit. Pri pouzivani desktopu existuje niekolko ciest, ako sa prihlasit. V zasade moze k prihlaseniu dojst cez terminal, alebo X terminal, pricom X terminal moze k prihlaseniu pouzit xdm, kdm alebo gdm. Predpokladam, ze bezny desktpovy uzivatel pouziva najcastejsie X sedenie, v ktorom ma pospustanych niekolko terminalovych okien, nejake xmms, alebo spusta niektory window manager / desktopove prostredie.

V zavislosti od pouziteho DM (xdm/kdm/gdm) sa mierne lisi proces zadavania passphrase pre kryptozvazok. Zatial, co XDM pouziva standardne Xsession a .xprofile subory, KDM tieto subory viacmenej ignoruje a je nutne montovanie kryptozvazku zavesit na ine miesto.

Pri pouziti KDM (ja ho pouzivam v spojeni s XFCE na notebooku) je mozne na Slackware Linuxe (je mozne, ze riesenie bude fungovat aj u inych distribucii), vytvorit v domovskom adresari uzivatela subor .xprofile. Tento subor sa bezprostredne po prihlaseni vykona. Donho je mozne vlozit prikazy k vyziadaniu passphrase a zamontovaniu zvazku. Pri montovani zvazku vsak treba postupovat opatrne. Vacsina implementacii X servera je nastavena tak, ze pri prihlaseni uzivatela vygeneruje novy subor .Xauthority. Po zamontovani domovskeho adresara je preto nutne .Xauthority skopirovat do kryptovaneho domovskeho adresara, inac dojde k padu X servera.

Vzhladom k tomu, ze sa bude montovat cryptoloop, ktory nie je uvedeny v /etc/fstab, je nutne mat pri montovani rootovske prava, ktore ale uz zrejme v case pustania .xprofile mat nebudeme, preto je nutne cely proces prihlasovania zabalit do suda. Je preto vhodne vytvorit si skript, ktory sa postara o vyziadanie passphrase, zamontovanie zvazku a vsetko okolo.

/usr/bin/cryptohome:

#!/bin/sh
# skript na startovanie a vypinanie crypto domovskych adresarov
function cryptohomedir_start() {
    DEVICE=`/sbin/losetup -f`
"Crypto-AES Passphrase" 0 0 | /sbin/losetup -e aes $DEVICE /mnt/local/cryptohome/$1 -p 0
    Xdialog --stdout --password --inputbox "Crypto-AES Passphrase" 0 0 | /bin/mount /mnt/local/cryptohome/$1 /home/$1 -oencryption=aes -p 0
    CD=`pwd`
    cd ..
    cd /home/$1
    cd $CD
    echo "$DEVICE" > /home/$1/.mycryptoloop
}
function cryptohomedir_stop() {
    DEVICE=`cat /home/$1/.mycryptoloop`
    CD=`pwd`
    cd /
    /bin/umount -l -d /mnt/local/cryptohome/$1
    nohup /usr/bin/cryptohome.helper $DEVICE &
    cd $CD
}
case $1 in
start)
    cryptohomedir_start $2 ;;
stop)
    cryptohomedir_stop $2 ;;
*)
    echo "Dajaky bullshit";
esac

Uvedeny skript za pomoci Xmessage vyziada heslo a pokusi sa primontovat domovsky adresar. Skript je navrhnuty tak, aby heslo nezostalo v prikazovom riadku montovacieho prikazu a nemohlo byt evidentne odchytene v cistej forme.

Treba si uvedomit, ze pre uzivatela, ktory vyuziva takyto cryptohome, vznikaju defakto 2 domovske adresare (kryptovany a nekryptovany). V nekryptovanom domovskom adresari sa obvykle nachadza len .xprofile a .Xauthority, popripade nejake smetie, ako napriklad .xsession-errors. Jeho obsah je volne citatelny pre cely svet, preto nesmie obsahovat ziadne citlive udaje. V konecnom dosledku sam uzivatel nebude mat k obsahu tohto adresara za idealnych podmienok nikdy pristup (bude pretazeny obsahom kryptovaneho domovskeho adresara). Kryptovany domovsky adresar obsahuje vsetky subory bezne sa vyskytujuce v domovskych adresaroch, avsak je nutne z neho .xprofile zmazat, aby nedochadzalo k pokusu o opatovne zamontovanie cryptoloopu vtedy, ked cryptoloop uz raz zamontovany je (napriklad pad X servera a pod.).

Po skonceni X sedenia je nutne tento cryptohome odpojit. Avsak tu nastava niekolko problemov. Kam dat prikaz na odpojenie cryptohome? Je nutne editovat xinitrc prave pouziteho window managera / desktop managera a najst miesto tesne pred ukoncenim behu xinitrc skriptu (xinitrc pre XFCE 4.2+ je v tomto zaludne nakolko obsahuje koncov viac). V tomto mieste uz spravca prostredia nebezi, je velka sanca, ze su povypinane aj vsetky programy beziace v X sedeni a X sedenie sa vypina. Sem mozno dat prikaz na odmontovanie, avsak umount musi mat prava roota, preto je nutne sudo (ak nie kvoli umountu, tak kvoli losetupu urcite). Pri odmontovavani vsak narazime na dalsi problem, ktorym je to, ze v tomto bode je este domovsky adresar busy. Jedinym riesenim, ako tento adresar odmountovat, je teda pouzit lazy unmount, co sa ale vylucuje so sucasnym dealokovanim cryptoloop device. Treba pri tom pamatat, ze odmontovanie filesystemu nic neriesi, pokial zostane alokovany loop device, nakolko prave loop device je nositelom kryptovacieho procesu (filesystem, ktory tam byva, o kryptovani nic netusi). Vyuzil som preto tzv. cryptohome.helper, co je pseudodemon, ktory je spusteny tesne pred skoncenim X sedenia a snazi sa dealokovat cryptoloop. V pripade, ze sa domovsky adresar nepouziva, bude cryptoloop dealokovany do 1 sekundy po skonceni X sedenia.

/usr/bin/cryptohome.helper:

#!/bin/sh
cd /
while [[ "`/sbin/losetup $1 2>/dev/null | usr/bin/wc -l`" = "1" ]]; do
    /sbin/losetup -d $1
    sleep 1
done

Polozky sudoers nutne pre spustanie cryptohome:
/etc/sudoers | grep cryptohome:

ventyl ALL=NOPASSWD:/usr/bin/cryptohome start ventyl,/usr/bin/cryptohome stop ventyl

Xinitrc pre XFCE 4.2.2 v Slackware Linuxe s podporou cryptohome:
/etc/X11/xinit/xinitrc:
(pre velky rozsah listing neuvadzam priamo, ale subor je k stiahnutiu TU)

StartKDE pre KDE 3.4.2 v Slackware Linuxe s podporou cryptohome:
/opt/kde/bin/startkde:
(pre velky rozsah listing neuvadzam priamo, ale subor je k stiahnutiu startkde)

.xprofile pre inicializaciu cryptohome:
~/.xprofile:

#! /bin/sh
sudo /usr/bin/cryptohome start ventyl
cd ..
cd ventyl

Tym by bolo samotne montovanie a odmontovanie domovskeho adresara hotove, avsak to nie je ani zdaleka vsetko. Po zinicializovani cryptohome adresara zrejme uzivatel presunie vsetky svoje data z nekryptovaneho home-u cez nejaky temporary adresar (kedze nekryptovany a kryptovany home nemozu byt pripojene sucasne) do kryptovaneho home-u. To znamena, ze kopia dat v nekryptovanej podobe sa povaluje niekde na disku a aj ked uz nie je nikde alokovana v suboroch, nie je necitatelna. Preto je najspolahlivejsim (ak ked nie forenzne definitivnym) riesenim spustit po ukonceni vsetkeho cleanupu disku prikaz dd if=/dev/urandom of=/cleaner. To sposobi uplne zaplnenie disku nahodnymi datami a prepisanie vsetkych odalokovanych, ale nezmazanych dat. Tento subor potom mozno vymazat.

Dalsimi miestami, kde ostali po uzivatelovi stopy, su okrem ineho systemove logy, spool, maily a v neposlednom rade docasny adresar /tmp. V pripade logov je vhodne proste logovanie vypnut, alebo obmedzit na maximalnu moznu mieru, v pripade docasneho adresara je zrejme najlepsim riesenim zavedenie tmpfs, ktory vytvara docasny filesystem v RAM, ktoreho obsah bude zniceny po restarte (okrem ineho to odstrani potrebu casteho premazavania /tmp). Jednym z poslednych miest, kde este mozno najst citlive udaje, zostava swap, u ktoreho je cisto na uzivatelovi, ci pristupi k jeho kryptovaniu, alebo nie, avsak pri nekryptovani swap filesystemu hrozi riziko, ze sa v nom ocitnu v nekryptovanej podobe citlive udaje.

Ak sa popri X sedeni vyuziva aj terminalovy shell, treba si uvedomit, co vsetko po uzivatelovi ostane po odhlaseni sa z teminalu na obrazovke. Casto su to prikazy, kusy dat, listingy suborov, posta, alebo dokonca remote data (a bohvie, co vsetko sa nachadza na obrazovke po odscrollovani). Preto je vhodne vytvorit subor .bash_logou a umiestnit donho prikaz clear. To sposobi vycistenie obrazovky po odhlaseni.

Na zaver treba pripomenut, ze cryptoloop poskytuje iba offline security, teda chrani data pred tym, aby boli kompromitovane, kym nie su pouzivane. Ked uzivatel pripoji svoj kryptovany domovsky adresar, neexistuje ziadny sposob, ako zabranit napriklad rootovi v pristupe k tomuto adresaru, kym je pripojeny. Jedinym riesenim je zavedenie opatreni, ako napriklad SELinux, ktore rootovi pristup obmedzia (ak je to mozne). Cryptoloop ochrani data tym sposobom, ze pokial clovek po starte systemu nepozna passphrase, nedokaze sa dostat k datam obsiahnutym vo filesysteme, rovnako, ak by chcel niekto kompromitovat beziaci system, musi to spravit prelomenim uzivatelskeho hesla, pretoze v momente vytiahnutia pocitaca zo zasuvky straca moznost pristupu ku kryptozvazku, teda je kradez systemu bezcielna.

Uvadzane skripty nie su v ziadom pripade stabilne a nemaju osetrene specialne vynimky, pripad prvotneho prihlasenia sa z ineho, nez X terminalu a samozrejme, su poskytovane AS-IS bez akejkolvek zaruky (aj bez zaruky stanovenej zakonom - v pripade, ze sa o svoje data bojite, cryptohome nepouzivajte). Taktiez je mozne, ze som ako autor v tomto MiniHOWTO vynechal niektore podstatne detaily, alebo skripty nebudu schopne fungovat vobec.
VAROVANIE: Kryptovanie dat je pre data samotne velmi nebezpecna operacia. Pri kryptovani je treba pouzit rozum a nepanikarit. V pripade, ze sa data zakryptuju nejakym neznamym klucom, je velmi obtiazne ich dostat spat do dekryptovanej podoby, ak to nie je uplne nemozne. Taktiez hrozi uplna strata dat.

    • hmm bonus 24.07.2006 | 00:38
      Avatar blackhole   Návštevník

      neviem ale uz dlhsie som uzivatel tejto vkusne halusky
      luks

    • No podobne urobeny home maj 09.08.2006 | 20:13
      Avatar blackhole   Návštevník

      No podobne urobeny home maj aj ja , pouzivam taky nejake vlastne skrypty a uz mi to pohodlne slape viac ako dva roky.Akorat , to home si vzdy pripajam na /home/ja/crypto douvod je jednoduchy , pouzivam vice dister najednou a zo zacatku se mi v takomto home byly ruzna nastaveni v ~/.neco snazzil sem se to ressit , ale nakonec sem prisel na to tak mam proste svoje /home/ja/ a /home/ja/crypto ktery je krypto, k tomu dialogu na montovanie a odmontovanie /home v grafice , pouzivam skrypt ktery na mne hodi pri starte klasicke dialog okno a spusta sa /etc/init.d/ je to lepsie , ponevac grafika nabehne uz s cryptoadresarom a nemusim este neco sposutet.
      Jinak uvedenej postup sa stava uz pomaly standardom , pri instalacy opensuse , si mouzete takovej subor vytvorit.Jinak moje skryptiky ohladne cryptohome atd sidlej na adrese
      http://projekt-dvp.s.cz/download.php?soubor=2

      • rozdielne riesenie 10.08.2006 | 23:47
        Avatar blackhole_ventYl   Používateľ

        Riesit sa to da aj cestou montovania cryptohomu z init skriptov, ale vzhladom k tomu, ze tento pocitac nepouzivam len ja, preto bolo hlavnou podmienkou, aby ti, ktori cryptohome nepouzivaju, neboli nuteni pri starte cancelovat dialog na zadanie passphrase. Takto sa passphrase pyta len od toho, kto cryptohome ma a zvysni useri nie su tymto nijako ovplyvneni. Toto je rydzo home desktopove riesenie.

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.