Plokkseadme LUKS formaadis krüptimine

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Plokkseadme krüptimine

Kõvakettal olevaid andmeid saab krüptida mitmes kihis, alates plokkseadme plokkidest (need tavaliselt 512 baidi suurused tükid) kuni failisüsteemis asuvate üksikute failide krüptimiseni. Järgnev käsitleb plokkseadme (nt partitsiooni, tarkvaralise RAID lülituse või LVM voluumi) krüptimist.

Plokkseadme krüptimine on üks andmekandja füüsilise turvalisusega seotud instrument. St kui nt krüptitud ja parasjagu kasutuses mitte olev kõvaketas kaotsi läheb või ära varastatakse, siis ei saa seda kasutada ilma vastava parooli või võtmeta. Kui aga krüptitud plokkseadmelt on failisüsteem külge ühendatud, siis ei paku asjaolu, et plokkseade on krüptitud mingit täiendavat kaitset nt parasjagu töötavasse süsteemi sisse murdnud pahalase eest. Kõvaketta krüptimine on samuti asjakohane kõvaketta laenutamise või remonti saatmise juhtumil.

Andmekandjal asuvate andmete sh plokkseadme krüptimiseks on konstrueeritud mitmesuguseid tehnikaid, käesolevas palas tutvustatakse Linuxi tuuma dm-crypt alamsüsteemi abil LUKS (ingl. k. Linux Unified Key Setup) formaadis andmete krüptimist. Kerneli vastavate funktsioonide juhtimiseks kasutatakse tarkvara cryptsetup. Sama tehnikat kasutatakse ka siis, kui Debiani paigaldamisel teha valik, et kasutatakse krüptitud plokkseadmeid.

LUKS'ile on iseloomulik

  • väidetavalt eeskujulikult dokumenteeritud ja standardne lahendus
  • LUKSi saab portida erinevatele platvormidele (osalt järeldub eelmisest), nt http://en.wikipedia.org/wiki/FreeOTFE
  • haldusprotseduure saab paindlikult sooritada (nt võtmete vahetamine)

Muud tuntud Linux tuuma DM (device mapper) infrastruktuuri kasutavad alamsüsteemid on nt LVM2 (Logical Volume Management) ja multipath. DM võimaldab moodustada füüsilistele plokkseadmetele nn virtuaalseid kihte.

Krüptitud plokkseadme kasutamist võiks ette kujutada selliselt

      /home                /dev/mapper/c_home                 /dev/sdb1
  failisüsteem   <--->    loogiline      liides    <--->    füüsiline plokkseade
     nt ext3                encrypt/decrypt
  • füüsilisel plokkseadmed on andmed krüptitud
  • selleks, et füüsilisel plokkseadmed olevaid andmed saaks operatsioonisüsteem kasutada moodustatakse loogiline liides, mis on iseenesest samuti plokkseade ja mis töötab vahendajana füüsilise plokkseadme ja nö muu arvuti vahel ja mille ülesanne on ühes suunas liikuvaid andmeid krüptida ja teises suunas lahti krüptida
  • failisüsteemi kiht (ja seda kasutavad rakendusprogrammid) kasutab nö tavalist plokkseadet ja ei pea midagi teadma seal taga toimuvast krüptimisest
  • cryptsetup tarkvara abil juhitakse skeemil kujutatud loogilise liidese tööd (määratakse krüptoalgoritmid, võtmete pikkused jms)

Lihtne katse näitab, et krüptimise kasutamine vähendab ca 30% andmekandja kasutamise kiirust ning samal ajal kasutatakse arvuti arvutusressurssi.

Ettevalmistused

Selleks, et sissejuhatuses kirjeldatud moel krüptimist korraldada peab olema operatsioonisüsteemi tuumas vajalik tugi ning olemas olema vajalik haldustarkvara. Moodsates Linuxi distributsioonides sisaldub üldiselt kõik vajalik ja midagi ei ole kompileerida tarvis. Debian GNU/Linuxi kasutamisel piisab kui öelda

 # apt-get install cryptsetup

Lisaks peab olema kasutada mõni plokkseade, mida saab hakata krüptitud kasutuseks ettevalmistama, nt olgu fdisk abil moodustatud partitsioon /dev/hdb1 ning kavatsus seda kasutada süsteemi kasutajate kodukataloogide jaoks. Lisaks soovitatakse see seade ennem kasutamist kirjutada üle juhuslike andmetega, nt piisavalt kvaliteetse tulemuse võiks saada nii, arusaadavalt hävivad seejuures partitsioonil olnud andmed (enam-vähem moodsa arvuti puhul saab kiiruseks ca 4 MBait/s)

 # dd if=/dev/urandom of=/dev/sdb1

dd niisama oma edenemise progressi ei näita, kuid saates talle USR1 signaali ütleb ta kaugel on. Nii tuleks vaadata õige protsessi PID

 # ps aux | grep dd

ning saata USR1 signaal

 # kill -USR1 PID

Plokkseadmele LUKS formaadi moodustamine

Krüptimisel on oluline kasutatav võti, cryptsetup võimaldab kasutada kas failis asuvat võtit või klaviatuurilt sisestatavat parooli. Järgnevas on eelistatud võtme kasutamist failist, kuna sel moel on võtme materjal kvaliteetsem ning praktiliseks kasutamiseks ehk ka mugavam, nt saab bootimisel võtme anda arvutile ette USB pulgalt. Vajadusel saab LUKS võtme omakorda krüptida nt parooliga. Failipõhise võtme kasutamisel on oluline arvestada, et kui see võti peaks riknema/kaduma/vms ja see on ainuke nö slot mille abil saab krüptitud materjalile ligi, siis enam sinna ligi ei saagi (tõenäoliselt järgmise mõnesaja aasta jooksul).

Moodustame 256 baidi pikkuse võtme

 # dd if=/dev/random of=/root/cryptsetup-hdb1.key bs=1 count=256

ning hoolitseme, et see ei oleks teistele kasutajatele ligipääsetav

 # chmod 0600 /root/cryptsetup-hdb1.key

Plokkseadme krüptimiseks tuleb esmalt plokkseadmele vastav LUKS formaat tekitada öeldes

 # cryptsetup --key-size=256 luksFormat /dev/hdb1 /root/cryptsetup-hdb1.key
 
 WARNING!
 ========
 This will overwrite data on /dev/hdb1 irrevocably.
 
 Are you sure? (Type uppercase yes): YES
 Command successful.

Parooli kasutamisel tuleks öelda, st lihtsalt viimasel kohal olev võti ära jätta

# cryptsetup --key-size=256 luksFormat /dev/hdb1

Tulemus saab vaadata öeldes

 # cryptsetup luksDump /dev/hdb1
 LUKS header information for /dev/hdb1
 
 Version:        1
 Cipher name:    aes
 Cipher mode:    cbc-essiv:sha256
 Hash spec:      sha1
 Payload offset: 2056
 MK bits:        256
 MK digest:      69 84 d4 bb 3f 67 0b ac f3 8f 84 b3 4c f7 08 2e 9c 9a c2 ca 
 MK salt:        ab e9 db 52 73 54 62 0a 2d bb a3 0e 6b c1 f6 fe 
                 6b 42 c7 bb f2 41 4b 2e 12 61 33 ac 5b ff 82 f6 
 MK iterations:  10
 UUID:           0a9ca3d6-7e86-4fc6-999c-153b0fd0d266
 
 Key Slot 0: ENABLED
         Iterations:             424787
         Salt:                   87 7b 1c da 55 bb 0f d2 cc ef a3 a9 f5 e1 ed fa 
                                 8b 16 05 53 66 29 ae bf f5 3e e9 b7 d3 fc 39 5e 
         Key material offset:    8
         AF stripes:             4000
 Key Slot 1: DISABLED
 Key Slot 2: DISABLED
 Key Slot 3: DISABLED
 Key Slot 4: DISABLED
 Key Slot 5: DISABLED
 Key Slot 6: DISABLED
 Key Slot 7: DISABLED

Siinjuures on näha, et selle ühe ja sama plokkseadme puhul saab kasutada kuni kaheksat erinevat võtit/parooli.

Kõik krüptoseadet puudutavad andmed sisalduvad formaaditud seadmes endas va ligipääsuks vajalik võti/parool. Kuna nende andmete hoidmiseks on tarvis krüptitud seadmel natuke ruumi, siis kasutatav krüptitud seadmele vastava loogilise seadme maht on pisut väiksem vastava füüsilise seadme mahust.

Lisaks füüsilisele seadmele saab krüptida ka nt tarkvaralise RAID seadmeid või LVM voluume.

Krüptitud plokkseadme kasutamine

Krüptitud plokkseadme kasutamiseks tuleb seade avada, mille tulemusena moodustatakse operatsioonisüsteemi ja krüptitud plokkseadme vahele device mapperit kasutades loogiline liides, nt nimega /dev/mapper/c_home. Selle liidese poole pöördudes paistavad andmed krüptimata kujul ning /dev/mapper/c_home seadet saab kasutada nagu tavalist plokkseadet. Antud juhul on nimeks valitud c_home, aga see võib olla ka samahästi midagi muud.

 # cryptsetup --key-file /root/cryptsetup-hdb1.key luksOpen /dev/hdb1 c_home
 key slot 0 unlocked.
 Command successful.

Avatud seadme kohta saab küsida tema andmeid nii

 # cryptsetup status c_home
 /dev/mapper/c_home is active:
 cipher:  aes-cbc-essiv:sha256
 keysize: 256 bits
 device:  /dev/dm-43
 offset:  2056 sectors
 size:    100661240 sectors
 mode:    read/write

Failisüsteem

Üheks otsekoheseks krüptitud plokkseadme kasutuseks oleks moodustada sinna failisüsteem

 # mke2fs -j /dev/mapper/c_home

ning seejärel saab ta külge ühendada ning kasutama asuda, andmete krüptimisega eest hoolitseb Linuxi tuum

 # mount /dev/mapper/c_home /home

Kasutamise lõpetamiseks tuleb ühendada failisüsteem lahti

 # umount /dev/mapper/c_home

ja sulgeda loogiline liides, sulgemisel pole vaja võtit/parooli näidata

 # cryptsetup luksClose c_home

Selleks, et failisüsteemi külgeühendamine toimuks arvuti alglaadimisel automaatselt sobib kasutada faili /etc/crypttab sisuga kusjuures võtme loabittide väärtuseks on 0600

 c_home /dev/hdb1 /root/cryptsetup-hdb1.key luks

ja /etc/fstab

 /dev/mapper/c_home /home ext3 defaults 0 2

Arvuti töötamise ajal saab /etc/crypttab'iga töötamist esile kutsuda öeldes

 # /etc/init.d/cryptdisks start | stop

LVM

Krüptitud plokkseadet saab kasutada ka LVM PV seadmena, selleks sobib öelda

 # pvcreate /dev/mapper/c_home

Ja kasutada edasi nagu tavalisel LVM puhul plokkseadet kasutatakse.

Krüptitud seadme haldamine

Kõige levinumaks haldusprotseduuriks on krüptitud seadmega seotud paroolide/võtmetega tegelemine. Nt saab võtme lisada öeldes

 # cryptsetup --key-file /root/cryptsetup-hdb1.key luksAddKey /dev/hdb1 /root/cryptsetup-hdb1-teine.key

Seejuures tuleb tähele panna, et nüüd saab kasutada sama krüptitud seadet nende mõlema võtmega. Lisaks saab kasutada ka parooli kujul olevat võtit jättes viimase positsiooni lisamata

# cryptsetup --key-file /root/cryptsetup-hdb1.key luksAddKey /dev/hdb1

Võtme eemaldamiseks tuleb öelda

 # cryptsetup --key-file /root/cryptsetup-hdb1.key luksKillSlot /dev/hdb1 1
 key slot 1 verified.
 Command successful.

Oluline on mitte kõiki võtmeid/paroole eemaldada, vastasel korral ei pääse enam andmetele juurde.

Krüptitud seadme kasutamise lõpetamiseks tuleb seadme kasutamine lõpetada, kõik võtmed hävitada ja küptitud seadmele vastav seade võtta uude kasutusse.

Plokkseadme krüptimine koos tarkvaralise RAID ja LVM lahendusega

Kuna plokkseadme krüptimisel on nö sisendiks ja väljundiks samuti plokkseade, siis saab seda teha RAID ja LVM lahenduse puhul põhimõtteliselt kolmes kohas

  • failsüsteem -> LVM -> RAID -> loogiline liides -> krüptitud füüsiline seade (nt /dev/hdb1)
  • failsüsteem -> LVM -> loogiline liides -> krüptitud RAID seade (nt /dev/md0)-> füüsiline seade
  • failsüsteem -> loogiline liides -> krüptitud LVM voluum (nt /dev/system/home) -> RAID -> füüsiline seade

Valiku tegemisel peab arvestama, millised asjaolud on olulised

  • Krüptida LVM voluume, siis saab igale voluumile omistada erineva parooli/võtmega; kui krüptida kiht madalamal, siis on kõik voluumid plokkseadme krüptimise mõttes kaitstud sama LUKS parooli/võtmega.
  • Krüptides RAID skeemi koosseisu kuuluvat füüsilist seadet tuleb arvutil kõnealust RAID skeemi kasutades teha asjatult mitmekordset krüptimist (nt kui RAID skeemi koosseisu kuulub 5 füüsilist seadet).

Tundub, et nö keskmisel kasutusjuhul on kõige mõistlikum krüptida RAID seadet.

Jõudlus

Arusaadavalt vähendab krüptimine failisüsteemi kasutamise kiirust. Muidu samades tingimustes pöördumisel otse krüptitud seadme ja vastava loogilise seadme poole on erinevus nii lugemisel kui kirutamisel ca 30%

Füüsilise seadme kasutamine, nb! kirjutades otse loogilisele seadmele vastavale füüsilisele seadmele hävineb loogiline seade

 # dd if=/dev/hdb1 of=/dev/null bs=1024x1024 count=10240
 10737418240 bytes (11 GB) copied, 98.8812 s, 109 MB/s
 # dd if=/dev/zero of=/dev/hdb1 bs=1024x1024 count=10240
 10737418240 bytes (11 GB) copied, 109.111 s, 98.4 MB/s

Läbi vastava loogilise liidese kasutamine

 # dd if=/dev/mapper/c_home of=/dev/null bs=1024x1024 count=10240
 10737418240 bytes (11 GB) copied, 135.59 s, 79.2 MB/s
 # dd if=/dev/zero of=/dev/mapper/c_home bs=1024x1024 count=10240
 10737418240 bytes (11 GB) copied, 156.887 s, 68.4 MB/s

Failisüsteemi suurendamine LUKS formaadis plokkseadmel

Tööpõhimõte

  • sulgeda luks voluum (ja kõik mis selle peal enne)
  • luks all olev plokkseade suurendada
  • kehtestada vajadusel partitsioonitabeli muudatused arvuti mälus (nt rebootida)
  • avalda luks voluum
  • suurendada cryptsetup abil
# cryptsetup --verbose resize c_sda4
  • suuredada c_sda4 peal olevaid asju (nt lvm pv, ext4 failisüsteem jne (ehk online olekus et poleks vajalik fsck kasutamine)
  • kasutada

Kasulikud lisamaterjalid

Märkused

  • Mitme protsessoriga arvutil mdadm ja cryptsetup koos kasutamisel tekib idee krüptida igat seadet eraldi ja ühendada krüptitud plokkseadmed kokku tarkvaraliseks raid lülituseks kuna nii krüptimise töö jaotub ühe asemel mitme kcryptd protsessi. Sisulist kasu sellest siiski ei tõuse kuna krüptitavate andmete maht mitmekordistub samuti.
  • Kui on väga suured plokkseadmed ning aega napib, siis üks variant oleks genereerida nt 1/4 kõvakettale juhuslikud andmed ning seda muudele osadele edasi kopeerida.

2018

Tundub, et 2018 aastal on sobiv öelda

# cryptsetup -c aes-xts-plain64 -s 512 -h sha256 luksFormat /dev/sdb1

ja tulemuseks on

# cryptsetup luksDump /dev/sdb1
LUKS header information for /dev/sdb1

Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	512
MK digest:     	8f 9c e5 7d 9b e5 27 ec 93 1b 58 fc 7b f1 c8 1f c0 9c f2 f8 
MK salt:       	20 63 e1 6e dd 05 f4 92 3f ed ef 54 d7 7b db ef 
               	bd e7 d0 43 3d e0 e7 35 92 23 84 6c 73 9e fb 8c 
MK iterations: 	100250
UUID:          	b9c16237-1924-41ab-ae77-de93e279cf21

Key Slot 0: ENABLED
	Iterations:         	403149
	Salt:               	37 5c 48 1b 5f 3f a9 65 95 77 d4 de 10 b2 ee 3d 
	                      	94 70 21 51 e7 f8 eb 4e e2 1b 5e 93 00 a8 41 6f 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Selleks, et initramfs sees kindlasti cryptsetup utiliit oleks sobib kasutada faili

# cat /etc/initramfs-tools/conf.d/cryptsetup
export CRYPTSETUP=y

ning öelda

# update-initramfs -u

Kasulikud lisamaterjalid