Šifrovanie disku v linux debian. Systémy na šifrovanie dát LUKS, EncFS a CryptoFS pre Linux

Šifrovanie disku v linux debian.  Systémy na šifrovanie dát LUKS, EncFS a CryptoFS pre Linux
Šifrovanie disku v linux debian. Systémy na šifrovanie dát LUKS, EncFS a CryptoFS pre Linux

V tomto článku vám poviem, ako vytvoriť skrytý krypto kontajner štandardné prostriedky OS Linux (LUKS a cryptsetup). Vstavané funkcie LUKS (ako je používanie externých hlavičiek a umiestňovanie skutočných údajov s daným posunom) umožňujú používateľovi pristupovať k údajom skrytým v existujúcom kontajneri, ako aj popierať existenciu takýchto údajov.

UPD: Keďže tento príspevok bol pripravený pred mesiacom, nevedel som si ani predstaviť takú zvláštnu a neočakávanú smrť projektu. No áno, možno ešte nie je úplne mŕtvy, uvidíme... V tomto texte som sa však rozhodol ponechať všetky odkazy na TrueCrypt tak, ako sú.

Čo je to „pravdepodobná popierateľnosť“?

Veľmi dlhý a podrobný popis tohto konceptu môžete nájsť na Wikipédii: http://en.wikipedia.org/wiki/Plausible_deniability. V skratke to znamená, že môžete mať niečo (alebo ste mohli niečo urobiť), na prítomnosť čoho nikto nemôže podozrievať ani ho dokázať (pokiaľ si to, samozrejme, sami nepriznáte). A následne môžete poprieť existenciu (alebo fakt spáchania) tohto niečoho, ak vás chce niekto obviniť, keďže (opakujem) túto skutočnosť nemožno dokázať. Ak by napríklad dieťa koplo svojho bračeka do zadku a ten by šiel hľadať spravodlivosť u svojich rodičov, čo by sa stalo v tomto prípade?

No... Akoby sa nič nestalo. Pretože tento frajer to zaprie a jeho rodičia ho formálne nechytia do ruky (keďže po prvé neexistujú hlúpi svedkovia a po druhé, mladší brat môže hrať svoju špinavú hru). Takto nebude nikto potrestaný. No, alebo obaja budú pre každý prípad potrestaní. Toto bol len príklad použitia hodnovernej popierateľnosti dieťaťom so sklonom k ​​agresii. Ale vy a ja sme, samozrejme, bieli a našuchorení a budeme používať skryté kontajnery výlučne na ochranu našich osobných údajov pred zlými ľuďmi. Správny?

Samozrejme, „čo je „dobré“ a čo „zlé“ je samostatná otázka... Avšak bližšie k veci.

Všeobecná myšlienka implementácie Povedzme, že chceme uložiť niektoré dôležité údaje do zašifrovaného súboru. Vo všeobecnosti budeme používať nejaký program na ochranu kryptomien, ktorý za nás urobí všetku špinavú prácu. Možno budeme chcieť zaobchádzať so zašifrovaným súborom ako s virtuálnym diskom, čo značne zužuje počet potenciálnych kandidátov. Je tu však jedno „ale“. Takmer všetky takéto programy pracujú so súborom ako s jedným kusom šifrovaných údajov. Dovoľte mi vysvetliť: používateľ zvyčajne má jeden heslo (a možno aj niekoľko náhradných) pre každý

Aj keď v skutočnosti existuje nádej. :) Napríklad existuje taký program ako, ktorý je celkom šikovný. Používateľ môže vytvoriť dva kontajnery v jednom súbore: jeden „fiktívny“ s určitým počtom „zakázaných“, ale relatívne bezpečných súborov, a druhý skutočný, s údajmi, ktoré by za žiadnych okolností nemali byť zverejnené. TrueCrypt teda žiada dve rôzne heslá, keď chce používateľ vytvoriť takýto „dvojitý“ kontajner. Pri práci používateľ zadá iba jedno heslo pre „skutočnú“ časť a pracuje s ňou. Ak je používateľ pod tlakom vonkajších okolností nútený zverejniť obsah kontajnera tretím stranám, jednoducho zadá iné heslo a TrueCrypt otvorí „faloš“. Zdôrazňujem (a to je naozaj dôležité), že neexistuje spôsob, ako dokázať prítomnosť skrytej časti, ak výskumník nepozná zodpovedajúce heslo.

Teraz poďme rýchlo zistiť, ako tieto veci fungujú... V skutočnosti je to veľmi jednoduché. Softvér rozdelí kontajnerový súbor na dve (všeobecne povedané, nerovnaké) časti. Prvá časť, ktorá môže byť relatívne malá, obsahuje špeciálne pripravené údaje; druhý je skutočný. V súlade s tým musí byť program schopný pracovať s dvoma rôznymi hlavičkami (konfiguráciami) pre dvoch rôzne časti a tiež si môžete vybrať, ktorá časť sa má dešifrovať v závislosti od hesla zadaného používateľom. A musím povedať, že to nie je najtriviálnejšia časť práce. No jednoducho preto, že „oficiálne“ by mala byť viditeľná iba jedna „falošná“ konfigurácia: ak má kontajner štandardnú hlavičku, mala by to byť iba „falošná“ hlavička; ak sú parametre kontajnera uložené v samostatnej konfigurácii, táto konfigurácia by mala umožňovať dešifrovanie iba „falošnej“ časti. A po rozlúštení „falošnej“ časti by sa nemal objaviť jediný náznak prítomnosti skutočnej. Musia byť absolútne nezávislé. Navyše, keď sa otvorí „falošná“ časť, softvér by mal ukázať plnú kapacitu krypto kontajnera, aj keď je objem tejto časti oveľa menší.

Tak čo LUKS?

No, máme tu dobré správy a... ehm... ešte viac dobrých správ.

Dobrou správou je, že cryptsetup dokáže dešifrovať a pripojiť zväzky vytvorené TrueCryptom, ale je to nezmysel, pretože existuje lepšia správa, že môžeme vytvárať „skryté“ kontajnery výhradne pomocou cryptsetup. Okrem toho vám tento nástroj umožňuje vytvárať ľubovoľný počet „skrytých“ častí. Prirodzene, v rozumných medziach. A tu je návod, ako to môžete urobiť.

Ale než budeme pokračovať,

OBROVSKÉ TUČNÉ STRAŠIVÉ VAROVANIE!!!

  • Čokoľvek popísané nižšie môže spôsobiť nezvratnú stratu údajov.
  • Používanie silnej kryptografie môže byť vo vašej krajine zakázané, takže môžete byť uväznení nie za skutočné informácie, ale jednoducho za to, že máte na skrutke krypto kontajner.
  • Kryptografia môže chrániť vaše údaje, ale neochráni vás pred mučením. Skrytý kontajner môže pomôcť zachovať cenné informácie, ale nemôžete poprieť jeho prítomnosť v prípade zrady alebo výpovede.
  • Chlapci, ktorí sa zaujímajú o vaše šifrované údaje, nemusia byť takí hlúpi, ako ste očakávali. Aj keď nevedia dokázať prítomnosť skrytej časti kontajnera, pokojne vás môžu zavrieť do jednej cely s ostrieľanými zločincami a o pár dní si zapamätáte všetky heslá ku všetkým skrytým údajom.
  • Ak máte blízkych ľudí (priateľka/priateľ, príbuzní, priatelia), môžu sa stať terčom tvrdého nátlaku. A to vám určite pomôže zapamätať si všetko oveľa rýchlejšie, vrátane toho, čo ste ani nevedeli.

Preto si radšej dvakrát rozmyslite, o koľko cennejšie sú informácie ako váš život a životy vašich blízkych. A urobte zálohu. Keby niečo.

Takže man cryptsetup nám môže povedať veľa zaujímavých detailov o parametroch príkazového riadku tohto nástroja. Pozrime sa napríklad na možnosť --header:

No dobre. To znamená, že teraz môžeme mať množstvo údajov naplnené náhodným odpadom, úplne bez akýchkoľvek zmysluplných podpisov. Popis tejto možnosti obsahuje trochu viac informácií, upozornení a varovaní, ale v konečnom dôsledku je to všetko, čo sa vyžaduje. Vrelo však odporúčam prečítať si túto skvelú príručku.

Ďalšou veľmi užitočnou možnosťou je --align-payload , ktorá vám umožňuje umiestniť aktuálne údaje v určitom posune vzhľadom na začiatok zväzku:

A to je tiež skvelé, pretože teraz môžeme voľne presúvať naše údaje do ktorejkoľvek časti zväzku. Chápeš nápad, však?

  1. Inicializujeme zväzok na šifrovanie: úplne ho prepíšeme náhodnými údajmi.
  2. Vytvoríme „oficiálny“ zašifrovaný zväzok a vhodíme doň trochu peňazí infikovaný warez, špirálovitá muzla, prona užitočné bezplatné programy, nahrávky vašej amatérskej rockovej skupiny, filmy o láske atď., vo všeobecnosti veci, za ktoré dostanete najviac dva roky podmienečne.
  3. Pomocou vyššie uvedených možností ezoterického šifrovania vytvoríme skrytý zväzok (vo vnútri „oficiálneho“) a jeho hlavičku prenesieme na externé médium. Tu môžete ukladať skutočne nebezpečné informácie (napríklad fotografie zo škôlky alebo plány na dobytie sveta).

Vlastne, ľudia, to je všetko. Žiadna mágia. Prirodzene, nemôžete zaplniť kapacitu „oficiálneho“ šifrovaného disku z jednoduchého dôvodu, že časť jeho priestoru je odovzdaná skrytému kontajneru. A ako som povedal na začiatku, ak chcete, môžete vytvoriť viacero skrytých jednotiek podľa rovnakej logiky.

Tu... A ak ešte potrebujete detaily, tak špeciálne pre vás -

Sprievodca krok za krokom

Pozor!

Nasledujúce príkazy zničia vaše údaje, ak ich vykonáte bez použitia mozgu. Stratené informácie nie je možné obnoviť, pretože nástroje ako dd fungujú na nízkej úrovni (tj pod úrovňou systému súborov). Preto nebude možné vrátiť zmeny alebo vrátiť ich účinok, a to ani v prípade, že vykonávanie prerušíte ihneď po spustení.

Skrátka, nerobte to, pokiaľ neviete prísť so zmysluplným vysvetlením toho, ako jednotlivé kroky súvisia s vašimi cieľmi. A urobte zálohu. Teraz.

Povedzme teda, že máme zariadenie s viacerými oddielmi. Nech je to napríklad /dev/sdb. A nech je /dev/sdb1 relatívne malý (8GB) oddiel určený na šifrovanie. Rozdelíme ho na 5 až 3, pričom 5 GB časť bude „oficiálna“ a časť 3 GB bude skrytá. Predpokladajme tiež, že kľúč pre šifrovaný disk ponecháme v /etc/keys, respektíve hlavičku skrytého kontajnera na externom USB disku, ktorý pripojíme do /media/user/ExtUSBStick. Predpokladám, že už viete, aké povolenia je potrebné nastaviť v úložisku kľúčov, ako nakonfigurovať encfs/ecryptfs na bezpečné ukladanie dôverných údajov na nezabezpečených zariadeniach a tiež, že má zmysel kopírovať skutočné tajné kľúče a ukladať ich do niekoľkých geograficky oddelených trezorov. .

To je všetko, dobre, prestanem mudrovať a prejdem k podstate veci.

    Inicializuje sa zariadenie /dev/sdb1:

    Dd if=/dev/urandom of=/dev/sdb1 bs=16M

    Vytvoríme kľúč pre šifrovaný zväzok. 512 bitov (64 bajtov) je cez strechu pre naše účely:

    Dd if=/dev/urandom bs=64 count=1 >/etc/keys/secret.key 2>/dev/null

    Zväzok zašifrujeme pomocou novo vytvoreného kľúča:

    Cryptsetup luksFormat /dev/sdb1 /etc/keys/secret.key

    Otvorte šifrované zariadenie a nastavte mapovanie v tajných údajoch:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key \ /dev/sdb1 secretdata

    Vytvorte na šifrovanom zväzku systém súborov(napr. btrfs):

    Mkfs.btrfs -L SecretData /dev/mapper/secretdata

    ...a namontovať to:

    Pripojiť /dev/mapper/secretdata /var/secretdata/

    Majte na pamäti limit 5 GB, nastavte kvótu pre čiastkové zväzky:

    Povolenie kvóty Btrfs /var/secretdata/

    Keďže kvóty btrfs sa vzťahujú len na podzväzky, vytvorme jeden takýto:

    Brfs subvolume vytvoriť /var/secretdata/workingvolume

    ... a aplikujte naň zadanú kvótu (všimnite si, že podzväzky btrfs možno pripojiť ako bežné súborové systémy, takže neskôr môže byť pohodlnejšie pripojiť tento konkrétny podzväzok namiesto celého fs):

    Btrfs qgroup limit 5G /var/secretdata/workingvolume

    Vyplníme ho niekoľkými údajmi:

    Debootstrap --variant=buildd testing /var/secretdata/workingvolume

    To je všetko, teraz môžete zabudnúť na túto časť:

    Umount /var/secretdata cryptsetup luksClose secretdata

    Teraz pre názov vytvoríme „rybu“ a vložíme do nej náhodný odpad:

    Dd if=/dev/urandom of=/media/user/ExtUSBStick/hidden.head bs=4M count=1

    Teraz však prichádza práve ten moment, kedy sa začína skutočná mágia. (Čo? Povedal som, že neexistuje žiadna mágia? Tak som klamal.) Používame rovnaký tajný kľúč, nie však celý, ale iba polovicu (z offsetu 32 bajtov). Zvyšných 256 náhodných bitov je však celkom schopných stať sa dobrým kľúčom. Potom oddelíme hlavičku a vložíme ju na flash disk. Nakoniec povieme cryptsetup, že chceme kompenzovať náš skrytý kontajner o 5 GB (t. j. 10485760 512-bajtových blokov) od začiatku zväzku:

    Cryptsetup --keyfile-offset 32 ​​​​--header /media/user/ExtUSBStick/hidden.head \ --align-payload 10485760 luksFormat /dev/sdb1 /etc/keys/secret.key

    Áno, áno, je to také jednoduché. Teraz otvorme nové šifrované zariadenie:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key --keyfile-offset 32 ​​​​\ --header /media/user/ExtUSBStick/hidden.head /dev/sdb1 realsecretdata

    Poďme si stiahnuť ľubovoľný fs, ktorý chceme:

    Mkfs.btrfs /dev/mapper/realsecretdata

užitočné odkazy

Pre tých, ktorí chcú vedieť trochu viac, tu je niekoľko dodatočné zdroje informácie:

  • Šifrovanie disku, všeobecné informácie o šifrovaní disku: https://wiki.archlinux.org/index.php/Disk_encryption
  • Negatívne šifrovanie, pojem o niečo užší ako „pravdepodobná popierateľnosť“, ktorá sa týka iba oblasti kryptografie: https://ru.wikipedia.org/wiki/Deniable_encryption
  • TrueCrypt

V tomto článku sa pokúsim porovnať výkon rôznych šifrovacích systémov pod Linuxom. Teoreticky samozrejme vieme, ktorý systém je produktívnejší, a pokúšame sa vypočítať výkon rôznych systémov boli (). Truecrypt dokonca obsahuje aj vstavaný benchmark (ktorý však ukazuje výkon na RAM; dá sa použiť len na vyhodnotenie rýchlosti rôznych šifrovacích algoritmov). Urobím niečo trochu iné – zmeriam rýchlosť súborového systému zašifrovaného rôznymi prostriedkami v percentách v porovnaní s bežným nešifrovaným súborovým systémom.


Samostatnú oblasť na samostatnom pevnom disku, ktorý neobsahuje koreňový súborový systém, zašifrujeme pomocou predvolene používaného algoritmu v každom konkrétnom prípade. Ako bežný používateľ, nerozumiem nuansám šifrovacích štandardov (napríklad ako sa hash RIPEMD-160 líši od Whirpool, ktorý z týchto režimov je rýchlejší, čo poskytuje lepšiu ochranu), takže sa budeme spoliehať len na to, čo výrobcovia jednotlivých softvérový produkt Zvolili sme pomerne bezpečné predvolené parametre. To nemusí byť úplne správne, pretože výkon rôznych šifrovacích algoritmov nie je rovnaký. Ak chcete, samozrejme môžete zmeniť typ šifrovania, ale nie som si istý, či všetky testované produkty majú úplne identickú sadu algoritmov. Budeme testovať:

3) eCryptfs je predvolený systém ponúkaný používateľom Ubuntu na šifrovanie domovských adresárov, a preto je súčasťou tohto testu. Funguje nad existujúcim súborovým systémom. Šifruje každý súbor samostatne, takže každý môže vidieť práva, dátumy úprav a počet zašifrovaných súborov; V predvolenom nastavení sú viditeľné aj názvy súborov, aj keď existuje možnosť ich šifrovania. Najneefektívnejší produkt zo skupiny.

4) EncFS je približný analóg eCryptfs, ale používa FUSE.

Na testovanie bol teda pridelený samostatný stroj pomerne pokročilého veku v tejto konfigurácii: CPU - Intel Celeron 2000Mhz, RAM - 512 Mb DDR PC2700, systémový HDD - WD Caviar SE 5400 RPM 80Gb, testovací HDD - WD Caviar SE 7200 RPM 80 Gb.
OS - Ubuntu 12.04 LTS, verzie všetkého softvéru aktuálneho pre úložiská tohto OS v čase písania (Truecrypt 7.1a-linux-x86 nie z úložiska).

Otestujeme predvolený súborový systém ext4 pre väčšinu distribúcií. Na testovanie výkonu použijeme nástroj iozone3 a skript shellu napísaný „na kolene“ na meranie percentuálneho rozdielu v testoch.

Scenár na počítanie. Čistote kódu sa nevenovala žiadna zvláštna pozornosť, jediným kritériom pri písaní bola prítomnosť správneho výsledku.

#!/bin/sh gendifffile () ( #tento postup vygeneruje súbor, ktorý je vhodné analyzovať. Po prvé, riadky #nepodliehajúce analýze sú orezané; po druhé, prvé dve čísla v každom riadku sú orezané, čo označuje #veľkosť súboru a veľkosť záznamu, po tretie, celý súbor sa vypíše riadok po riadku - #jeden výsledok testu na riadok kat $1 |. "(pre (i=3;i<=NF;i++) {print $i}}" done > > $2 ) getline () ( #procedure vytlačí riadok $2 súboru $1 head -n $2 "$1" | tail -n 1 ) porovnať () ( #procedure porovnáva súbory $1 a $2 riadok po riadku, pričom vypočíta percentuálny rozdiel každého z nich pár testov #potom vypočíta aritmetický priemer o koľko percent je rýchlejší alebo pomalší # súbor obsahujúci prvú skupinu testov ako súbor obsahujúci druhú skupinu P=0 MAX=0 L1=`cat "$1" # | počet testov v súbore L2=`cat "$2" |. if [ $L1 -ne $L2 ] potom #ak súbory obsahujú rôzne počty testov, potom ich nebudeme porovnávať echo error return fi STEP =$(($L1*5/100)) J=0 pre I v `seq 1 $L1`; 0 echo "$((100*$I/$ L1))% dokončené ($I z $L1)" fi A=`getline "$1" $I` B=`getline "$2" $I` if [ `echo $A \> $B|bc -l` - ekv 1 ]; potom D=`echo "100-($B*100/$A)"|bc -l` ak [ `echo $D \> $MAX| bc -l` -eq "1" ]; MAX=$D spánok 5 fi else D=`echo "100-($A*100/$B)"|bc -l` if [ `echo $D \> $ MAX|. bc -l` -eq "1" ]; potom MAX=$D spánok 5 fi D="-$D" #ak má hodnota znamienko "-", tento test bol vykonaný rýchlejšie #v druhom súbore , nie v prvom fi P=`echo "$P+ $D"| bc -l` hotovo P=`echo $P/$L1| bc -l` #vypočítať aritmetický priemer echo PERCENT=$P MAX_PERCENT=$MAX ) genaverage () ( #postup na generovanie súboru pripraveného na analýzu, ktorého každý riadok je #aritmetický priemer zodpovedajúcich riadkov všetkých súborov prehľadov nachádza v analyzovanom adresári AVG=` mktemp` F=`ls "$1"|wc -l` #počet súborov s prehľadmi v danom adresári #za predpokladu, že sú tam uložené iba takéto súbory a nič iné #nebudeme kontrolovať správnosť tohto predpokladu if [ -d " $1" -o $F -lt 2 ] potom echo error >/dev/stderr #v tomto postupe vypíšeme všetky správy do stderr, pretože #stdout je nahradený inou procedúrou rm -; f $AVG exit fi TMP=` mktemp` nájsť "$1" -typ f| pri čítaní FILE urobte #pre každý súbor správy iozone umiestnený v zadanom adresári I=`mktemp` #vygenerujte dočasný súbor pripravený na analýzu gendifffile "$. FILE" "$I" #names zapisujú všetky takéto súbory do "TMP" riadok po riadku echo "$I">>$TMP hotovo L=`cat \`getline "$TMP" 1\`|wc -l` cat " $TMP"| pri čítaní LINE; urobiť #pár kontrol by neuškodilo L1=`mačka "$LINE"| wc -l` #do všetkých súborov obsahuje rovnaký počet testov, ak [ $L -ne $L1 ]; potom echo error >/dev/stderr exit fi done STEP=$(($L*5/100)) J=0 for I in `seq 1 $L`; do J=$(($J+1)), ak [ $J -eq $KROK ]; potom J=0 echo "$((100*$I/$L))% dokončené ($I z $L)" >/dev/stderr fi SUMFILE=`mktemp` #týmto spôsobom získam hodnotu premennej SUM z vnorenej slučky SUM=0 mačka "$TMP"| pri čítaní LINE; do SUM=$((`getline "$LINE" $I`+$SUM)) echo $SUM > "$SUMFILE" done echo `tail -n 1 "$SUMFILE"`/$F|bc -l >> $ AVG #získajte aritmetický priemer #a zapíšte ho na príslušné miesto v súbore AVG rm -f "$SUMFILE" hotovo mačka "$TMP"| pri čítaní LINE; do #delete dočasné súbory rm -f "$LINE" done rm -f "$TMP" echo $AVG ) printf %b "\\033)