Linux: duomenų šifravimas

Posted: 2014-04-22 in Pezalai
Žymos:,

Taigi truputuką nušviečiau apie tai, kaip viskas Linux sistemoje slypi failuose. Tos įžangos reikėjo šiam įrašui, nes su juo papasakosiu keletą įdomybių.

Ar verta šifruoti duomenis kompiuterio standžiajame diske? Priklauso nuo požiūrio, nuo aplinkybių ir nuo atsakingumo. Šeimyninio kompiuterio galbūt užšifruoti ir neverta, galbūt tik turėti vieną kitą šifruotą laikmenėlę su kokiais nors svarbiais duomenimis, kad ir slaptažodžiais ar šeimyninės pornografijos nuotraukomis (hehe). Jei netyčia kas nors pavogtų kompiuterį, bent jau būtumėte ramūs, kad nekuklios nuotraukėlės neatsiras internete. Nors dažniausiai vagys nesidomi, kas yra diskuose, jiems svarbu kompiuterį perparduoti kuo greičiau, o toliau jis sėkmingai išvalomas. Tad kaip ir nėra čia didelės paranojos. Bet dalį informacijos gali būti verta saugoti kad ir nuo vaikų.

Hello, World! duomenų šifravimas | Darau, blė

Kitas dalykas — darbo kompiuteris. Paprastai darbiniuose kompiuteriuose glūdi krūva konfidencialios informacijos ir ją saugoti būtina kur kas labiau, nei asmenines nuotraukėles ar kažką panašaus. Rimtos korporacijos kartais išduoda visaip kaip užšifruotus kompiuterius net ir kontraktoriams ir tokiu kompiuteriu nepasinaudosi be specialios raktinės kortelės. Tokie kompiuteriai naudojami bankuose, valstybinėse įstaigose ir dar kai kur.

Tokiam programuotojui, kaip aš, duomenų šifravimas atrodo būtinas dalykas. Elementariai kodo saugykla yra svarbus konfidencialus informacijos rinkinys. Abejoju, ar kada nors kam nors jo prireiks, bet, kaip sakoma, atsargų ir dievulis saugo. Juk į savo senus laužus (automobilius turiu omeny) ir tai signalizacijas dedamės, ar ne? O darbinis kompiuteris su konkurencinga informacija gali kainuoti penkiasdešimt tokių automobilių. Tad ir saugoti tuos duomenis visgi verta.

Tad aš trumpai papasakosiu, kaip šifruoti duomenis Linux sistemoje. Vėliau pateiksiu įrašų ir apie Mac bei Windows galimybes, bet pradėsiu nuo Linux. Linux galimybės šifruoti yra geros dar ir dėl to, kad algoritmai yra atviro kodo ir juose nėra slaptų variantų duomenims atkapstyti. Yra buvę atvejų, kad komerciniuose šifravimo algoritmuose buvo naudojami dvigubi raktai — vartotojo ir „gimtasis“ — ir to „gimtojo“ užtekdavo duomenims atkoduoti. Nemalonu kažkaip pagalvoti, kad svarbūs duomenys gali būti lengvai iškapstomi kokių nors tarnybų vos pirštu mostelėjus. Nors ne nuo tarnybų saugojamės, o tie kiti vis tiek turės sunkųjį kelią praeiti. Taigi Linux šifravimo galimybės tikrai geros, kokybiškos ir pakankamai patikimos.

Sakykime, parsisiunčiate naują šviežią Ubuntu Linux distribuciją ir diegiate į šviežią kompiuterį. Jums bus pasiūlyta užšifruoti visą diską, jei tik norėsite. Galite rinktis šį kelią ir tada būsite absoliučiai ramūs, kad visas diskas yra pilnai šifruotas ir nesuksite sau galvos. O ir daryti kaip ir nieko nereikės, diegimo programa ir Linux toliau padarys viską už jus — efektyviai ir paprastai.

Deja, joks rimtesnis žmogus tokio varianto nenorės. Na, nebent norės būti labai labai apsisaugojęs. Tačiau reikia turėti omenyje, kad šifravimas turi ir trūkumų: lėtėja duomenų įrašymas ir nuskaitymas. Su šiuolaikiniais procesoriais, be abejo, tas sulėtėjimas yra nežymus, bet jis yra. Taip pat pagalvokime: o kam užšifruoti sisteminį skirsnį, kuriame yra pati OS ir visokios ten programos, tėkmės registrai ir kita beveik nekintanti informacija? Programa užsikraus greičiau, jei ją bus galima tiesiogiai nuskaityti iš disko praleidžiant šifravimą.

Taigi protingiau atskirti vartotojo duomenis nuo sistemos. Sakykime, root skirsnis yra nešifruotas, o vartotojų „naminiai“ katalogai — šifruoti. Na, dar verta pagalvoti apie swap šifravimą, nes ten įrašinėjami duomenys tiesiai iš kompiuterio atminties ir jie būna nešifruoti — įskaitant ir šifravimo raktus. Taip pat swap skirsnis naudojamas giliajam kompiuterio užmigdymui (hibernacijai). Todėl ir swap rekomenduotina užšifruoti.

Tiek teorijos. Dabar praktika. Iš praktinės pusės yra vienas trūkumas: neįmanoma užšifruoti jau esamų skirsnių — čia Linux trūkumas. Turite pasidėti duomenukus kažkur kitur, skirsnį perkurti iš naujo su šifravimu ir supilti duomenukus atgal. Jei neturite atsarginės vietos — užšifruoti jau turimų skirsnių nepavyks. Gaila, bet taip jau yra.

Sakykime, kad norime užšifruoti atskirą skirsnį, kuriame guli vartotojų naminiai katalogai. Arba vieno vartotojo, kaip paprastai būna. Tebūnie tai skirsnis /dev/sda3. Paprastai skirsniai fstab lentukėje prijungiami tiesiogiai. T.y. /dev/sda3 bus su failų sistema, greičiausiai ext4. T.y. šiame skirsnyje failų sistema bus įrašyta tiesiogiai. Tuo tarpu šifravimas pridės papildomą loginį sluoksnį. /dev/sda3 gulės iš pažiūros atsitiktinis baitukų kratinys, o tame kratinyje bus paslėpta ext4 failų sistema. Tad tiesiogiai užšifruoto /dev/sda3 į fstab įrašyti negalėsime. Ten reikės įrašyti tarpinį atšifruotą virtualų įrenginį.

Dar vienas niuansas. Jei iš anksto pasirūpinote, kad vartotojų katalogai būtų atskirame skrisnyje, prieš pradėdami to skirsnio šifravimą laikinai susikurkite vartotoją, kurio naminis katalogas bus sisteminiame ar kuriame kitame prieinamame nešifruotame skirsnyje. O tai kitaip pradėsite naikinti naminį katalogą prieš jį užšifruodami, tai gali sistema ir supykti. Na, čia tik dėl to, kad dauguma sistemų neleidžia prisijungti root vartotoju tiesiai, reikia per kokius nors sudo išsidirbinėti. Bet kokiu atveju, visas operacijas patogiausia daryti prisijungus root vartotoju, nereikia tada to sudo prie kiekvienos komandos lipdyti.

Taigi prisijungėte kaip root ir jau esate pasiruošę darkyti /dev/sda3. Pirmiausia su komanda umount reikia šį skirsnį atjungti. Jei tai buvo home katalogas, tai reikia parašyti umount home.

Toliau ruošiame šį skirsnį. Kaip minėjau, šifravimas užpildo skirsnį iš pažiūros atsitiktiniais duomenimis. Bet pildo juos tik ten, kur tie duomenys rašomi, į tam tikrus sektorius. Todėl prieš šifruojant skirsnį jį verta tiesiog užpildyti atsitiktiniais bitukais. Paprasčiausia pasinaudoti /dev/urandom:

dd if=/dev/urandom of=/dev/sda3

Dabar jūsų /dev/sda3 skirsnis pilnas šiukšlių. Galima jį paruošti užšifravimui.

Šifravimui naudojama cryptsetup programa su LUKS raktų valdymu. Ją, be abejo, reikia įsidiegti, jei dar nėra įdiegta. Pirmiausia nustatom norimus šifravimo parametrus:

cryptsetup --verify-passphrase --hash=sha512 --cipher=aes-xts-plain:sha256 --key-size=512 luksFormat /dev/sda3

Jei netyčia jūsų skirsnis didesnis, nei 2 TiB, tai šifravimui turite naudoti aes-xts-plain64. Su mažesniais gerai ir aes-xts-plain — iki 2 TiB vis tiek jokio skirtumo.

Trumpai apie šitos komandos parametrus:

–hash=sha512 — čia nurodoma, kaip bus užšifruojamas slaptažodis. Manau, kad jam dera naudoti ilgiausią užšifravimo variant, t.y. 512 bitų. Galima ir sha256 naudoti, bet našumui įtakos jokios, o saugumas su 512 — didesnis.

–verify-passphrase — tiesiog paprašys įvesti slaptažodį jūsų skirsnio šifravimui. Slaptažodį pasistenkite sugalvoti tikrai nuoširdžiai kuo ilgesnį ir bjauresnį. Na, bet ne tokį, kad užmirštumėt, aišku 🙂

–cipher=aes-xts-plain:sha256 — užšifravimo metodas. Jų šiaip yra keletas. XTS yra naujausias ir, tarkim, gudriausias. Gero šifravimo mechanizmo esmė tokia, kad kaskart šifruojant tokį patį turinį būtų gaunamas skirtingas rezultatas. Taip su šifruotu turiniu sunkiau kovoti visokiems plėšikams. XTS tuo ir pasižymi.

–key-size=512 — šifravimo rakto ilgis. Jis yra skeliamas per pusę, dėl to aukščiau paminėtam šifravimui reikia dvigubai ilgesnio rakto.

Tai tiek maždaug, nėra dėl ko sukti galvą daugiau. Galite nesidomėti kitokiais nustatymais, aš jums išrinkau geriausius 😀

Paleidus šitokią komandą ji gali užduoti kokį nors provokuojantį klausimą iš serijos „ar tikrai tikrai norite šitą reikalą padaryti“. Reikės būtinai didžiosiomis raidukėmis jai atsakyti YES, o tada jau būsite paprašyti įvesti ir užšifravimo slaptažodį. Po to komanda kiek pabirbs ir jūsų skirsnis bus paruoštas naudoti slaptiems duomenukams saugoti. Na, beveik. Reikės tą skirsnį atidaryti, po to suformatuoti ir jau tada naudotis.

Skirsnis atveriamas nurodant patį skirsnį ir jam suteikiamą kokį nors pavadinimą. Pavadinimas parenkamas laisvai, šiuo atveju aš jį parinkau „namai“:

cryptsetup luksOpen /dev/sda3 namai

Būsite paprašyti įvesti savo slaptąjį slaptažodį ir cryptsetup prijungs skirsnį į /dev/mapper katalogą. Jis turėtų būti pasiekiamas kaip /dev/mapper/namai. Su juo derėtų elgtis, kaip su paprastu disko skirsniu: jį dabar pradžiai reikia suformatuoti, o paskui, norui ir reikalui esant, įdėti į fstab failiuką. Formatuoti turbūt mokate, o jei ne — tai daroma šitaip:

mkfs.ext4 -q /dev/mapper/namai

Va ir viskas. Dabar galite šį įrenginį įsirašyti į fstab failiuką. GNOME apskritai jį prijungs automagiškai greičiausiai. GNOME netgi leidžia prijungtą „namai“ skirsnį atidaryti ir uždaryti, kaip šifruotą dalyką ir prašinėja slaptažodžio.

Norėdami užverti užšifruotą skirsnį pirmiausia jį turite atjungti (umount), o paskui užverti ir /dev/mapper įrenginį:

cryptsetup luksClose namai

Jūs jau turbūt pastebėjote, kad atvėrimas ir užvėrimas vykdomi rankutėmis įvedamomis komandomis. Sakysite, nu, ok, užsikrauna kompas, įvedu savo vardą ir slaptažodį, o mano naminio skirsnio dar nėr? Neprijungtas? Na, tuo atveju, jei užšifravote savo naminį katalogą. Taip, tikra teisybė. Jei, tarkime, diegsite Linux šviežiai ir užšifruosite visą diską, tai disko šifravimo slaptažodžio būsite paprašyti įkrovos metu. O jei terliojatės su skirsniais patys, tai ir slaptažodžio paprašymu turėsite pasirūpinti patys.

Paprasčiausia tai padaryti pasinaudojus crypttab priemonėmis. Taigi į failą /etc/crypttab įrašome tokią eilutę:

namai /dev/sda3 none luks

Ir viskas — įkrovos metu iš jūsų bus pareikalauta slaptažodžio. Parinktis „none“ nurodo, kad nebus naudojamas šifravimo failas. Taip, galima šifruoti ne tik slaptažodžiais, bet ir raktais (key file). Taip galima įjungti užšifruotą skirsnį visiškai automatiškai… tik kokia prasmė? Nebent raktas nuskaitomas, sakykime, iš įkištos SD kortelės, kurią su savimi visada nešiojatės, ar iš kokios kitos USB laikmenos. Taip pat tam gali būti panaudojamas ir smartcardas.

Dar kartą pabrėžiu: neįmanoma užšifruoti jau egzistuojančio skirsnio su duomenimis. Duomenis reikia pasidėti kitur, skirsnį „perskrosti“ ir tada supūsti juos atgal.

Na, o dabar, kai crypttab suderintas, galime įrašyti ir eilutę į /etc/fstab failą:

/dev/mapper/namai   /home   ext4   noatime,nodiratime,errors=remount-ro     0   1

Tiesa, jei turite SSD diską, tai šifravimas kels papildomų problemų. O jei susitvarkysite, kad problemų nekeltų, saugumas bus mažesnis.

Jei turite SSD diską ar bent jau domėjotės tokiais, tai turėtumėte jau žinoti, kad tiesiog vietoj HDD įkišti SSD nėra geriausia išeitis. Dėl atmintinės ypatybių šiems diskams OS turi pranešti, kurie sektoriai yra išlaisvinti nuo duomenų. Be to, SSD diskai duomenis įrašinėja didesniais gabalais, nei HDD. Nuskaityti gali ir mažesniais, po 4 KB, bet įrašinėja dideliais gabalais, net ir 512 KB. Jei vietos SSD diske mažoka, jis turi nuskaityti visą 512 KB bloką į savo vidinę atmintį, jį „papildyti“, bloką išvalyt ir vėl įrašyti. Dėl šios priežasties SSD diskus laikyti kiek apytuščius. Taip pat jiems būtina „pranešti“, kurie ištrinti failai atlaisvina sektorius iš tikro — diskas pats juos „pasižymi“, kaip laisvus. Esmė tame, kad laisvi blokai gali būti įrašomi iš karto, sutaupoma nuskaitymo-modifikavimo-trynimo-įrašymo operacijų. Tam yra naudojama speciali TRIM (arba discard) funkcija. T.y. OS ištrina failą, o po to dar „pasako“ diskui „nuo tokio tai failo atliko laisvi šitie ir anie sektoriai“. TRIM operacija kiek sulėtina failų trynimą, tačiau atlaisvina sektorius. Gera žinia yra ta, kad galima TRIM nevykdyti po kiekvieno failo ištrynimo ar modifikavimo, o, pavyzdžiui, suplanuoti masinį TRIMinimą nakčiai — jei kompiuterį paliekate neišjungtą. Arba paleisti TRIMinimą per pietų pertrauką — kaip patogiau. Be abejo, OS gali tokius darbelius daryti automatizuotai.

Kokia čia yra bėda su šifravimu? Ogi tokia: šifruotas skirsnis įprastame standžiajame diske užpildomas atsitiktiniais krekulais, o paskui ten įrašomi duomenys taip pat užšifruojami. Tad kokiam nors niekadėjui visas skirsnis taip ir atrodys, kaip kažkoks bitukų kratinys. O štai SSD diske su TRIM pažymėti „laisvi“ sektoriai ir blokai yra užpildyti vienetukais (nuliukai gali būti įrašomi, vienetukus reikia „pertrinti“ — čia yra tokia NAND atmintinės savybė). Taigi norėdami maksimaliai išnaudoti SSD disko efektyvumą net ir šifruotiems duomenims turėtumėte įgalinti TRIM funkciją — o tokį skirsnį gavęs niekadėjas jau aiškiai matys, kur yra duomenys, o kur tuščia vieta. Teoriškai tai sumažina laiką, per kurį galima būtų parinkti iššifravimo raktą… na, bet galvokime blaiviai: spec. tarnybos norėdamos iškrapštys duomenis iš bet kokio kratinio, nes jos turi pinigų įrangai, o visokie paprasti niekadėjai greitai praras norą terliotis radę šifruotą skirsnį. Nebent pats esate kokios nors ypač svarbios tarnybos atstovas, bet gal tada naudosite ir kitokius šifravimo metodus 🙂

Taigi va… tęsiant toliau. SSD diskui įgalinti TRIM funkciją su šifruotais duomenimis reikia per du sluoksnius. Visų pirma, TRIM funkciją reikia įgalinti arba failsų sistemos tvarkyklei, arba susiplanuoti automatinius TRIMinimus, o antra — TRIM reikia įgalinti ir šifravimo lygyje. Jei įgalinsite TRIM tik failų sistemai, tai LUKS TRIM komandas blokuos — dėl saugumo. Reikia nurodyti LUKS šifratoriui, kad jis būtų geras ir leistų pažymėti akivaizdžiai tuščius blokus.

Jei norite savo ext4 skirsniui įgalinti automatinį TRIM po kiekvieno failo ištrynimo (aš tai daryčiau masinius planinius TRIMinimus, o tai ant kiekvienos rimtesnės failų operacijos tie pirsčiojimai nepadeda), į ext4 prijungimo nuostatas įdėkite discard nuorodėlę:

/dev/mapper/namai   /home   ext4   discard,noatime,nodiratime,errors=remount-ro     0   1

O /etc/crypttab failee reikia nurodyti tokią pačią nuostatą ir šifruojamam skirsniui:

namai /dev/sda3 none luks,discard

Tai va tiek su diskais. Kaip jau minėjau viename nesename įraše, Linux sistemoje viskas yra tarsi failai (arba baitų srautai, jei jau labai priekabūs būsime). Mes šifravome skirsnį /dev/sda3, kuris kaip ir irgi yra failas. Tai va jums ir panaudos atvejis: galite susikurti virtualų diską. T.y. susikurti failą, jį suformuoti su LUKS, prijungti jį, kaip šifruotą skirsnį ir jame susikurti failų sistemą! Tiesiog vietoj /dev/sda3 reikėtų naudoti bet kokį failą. Toks šifruotas failas labai patogus, nes jį galite naudoti tik tada, kada jums reikia. Jį taip pat galite pakavoti kokiame nors nuotoliniame serveryje ir prisijungti per atstumą. Ypač, jei norit daryti asmeninių duomenų kopijas kažkur, kur gaunate pigiai vietos (ar net kokiame nors debesyje), bet nenorite ten dėti duomenų atvirai. Nu, o gal tiekėjo darbuotojai smalsūs… o va padėsite tokį šifruotą failą — nieks į jį neįlįs.

Pradžiai, aišku, reikėtų susikurti norimo dydžio failą. Na, gal kokių 500 MB — susikavoti visokiems dokumentams ar kažkokiems kitiems duomenukams. Tai su dd komanda galime tokį failą susikurti:

dd if=/dev/urandom of=slapti-duomenai.luks count=1024000

dd pagal nutylėjimą kuria diskų atvaizdus 512 baitų sektoriais, tai viršuje panaudotas skaičiukas kaip tik ir sukuria maždaug 500 MB failą.

Šitą failą, kaip ir disko skirsnį, paprasčiausiai užšifruojame:

cryptsetup --verify-passphrase --hash=sha512 --cipher=aes-xts-plain:sha256 --key-size=512 luksFormat slapti-duomenai.luks

Failas užšifruojamas. Dabar jį galime prijungti su kokiu nors pavadinimu:

cryptsetup luksOpen slapti-duomenai.luks paslaptis

Ir tame slaptame faile sukuriam failų sistemą. Tiesa, failų sistemos kūrimo (formatavimo) programėlė jus perspės, kad čia ne disko skirsnis ir pasitikslins, ar tikrai ten norite sukurti failų sistemą:

mkfs.ext4 -q /dev/mapper/paslaptis

O toliau… reikia susikurti katalogą, pavyzdžiui, slaptizmai ir į jį prijungti šitą naują failų sistemą:

mount  -o noatime,nodiratime /dev/mapper/paslaptis slaptizmai

Va ir viskas. Galite į tą failą, kaip į bet kokį skirsnį, rašinėti duomenis. Turėkite omeny, kad tas failas gali būti ir kur nors tinklo serveryje ar debesyje. Tiesa, ne visi debesinių paslaugų tiekėjai leidžia modifikuoti failų dalis, paprastai pakeitus failą jis visas iš naujo įkeliamas. Kol kas vieninteliai Dropbox leidžia modifikuoti failų gabaliukus, bet jų ir paslaugos brangiausios. Suprantama, kad kas kartą kažką padarius kilnoti 500 MB failą pirmyn-atgal paprasčiausiai neparanku, tad rinkdamiesi tiekėją šifruotų duomenų laikymui turėkite šį reikalą omenyje.

Šiam kartui tiek.

Reklama
Komentarai
  1. Mantas parašė:

    O gi naujausiam cryptsetup (pvz. Arch) tai yra “reencrypt” komanda, su kuria galima gyvai užšifruot. (Tik bandyt nebandžiau, procesorius be AES-NI tai ką ten prasidėsi.)

    • Darau, Blė parašė:

      Dėkui už atnaujinimą, buvau pražiopsojęs šitą reikalą. Nors be atsarginės kopijos tokio dalyko vis tiek nerizikuočiau daryti, o kai turi kopiją, tai koks skirtumas — galima ir iš naujo viską permest…

  2. filosoffas parašė:

    Labas,
    kuo būtu blogai jei šifruočiau ne iš komandinės eilutės, bet per “Disks“ programėle ubuntuose? Tiesiog sukurčiau koduotą skirsnį tuščioje disko vietoje ir viskas. prieš kuriant skirsnį diskas buvo užpildytas nereikalinga informacija. diskas išorinis ssd, turėtu du skirsnius – ntfs ir koduotą ext4.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s