Članki » Zasebnost » Vzpostavitev v celoti šifriranega sistema
Vzpostavitev v celoti šifriranega sistema
Priporočamo, da si najprej preberete članek z naslovom: Šifriranje nosilcev podatkov v okolju Linux in Windows.Opozorilo: Uporaba spodaj opisanih postopkov lahko privede do resne izgube podatkov ali do okvare sistema. V nekaterih nedemokratičnih državah je osebna uporaba močnega šifriranja nezakonita. Uporaba na lastno odgovornost.
15. junija 2004 je italijanska policija vstopila v prostore ponudnika internetnih storitev in spletnega gostovanja Aruba, kjer so se nahajali strežniki aktivističnih organizacij Autistici in Inventati. Organizaciji sta različnim nevladnim organizacijam in političnim aktivistom ponujali brezplačno spletno gostovanje, elektronsko pošto ter poštne sezname. Preiskovalci so od ponudnika internetnih storitev zahtevali, da strežnik ugasnejo. Nato so trdi disk iz strežnika priključili na svoj računalnik ter iz njega prekopirali šifrirne ključe za dostop do elektronske pošte. Strežnik so nato ponovno zagnali. Predstavnik organizacij Autistici in Inventati je seveda opazil, da strežnik nekaj časa ni deloval, zato je poklical ponudnika spletnega gostovanja kaj je narobe. Dobil je odgovor, da je šlo za krajši izpad elektrike. Administratorji sistema so incident odkrili šele čez leto dni - ves ta čas pa je policija imela nešifriran dostop do elektronske pošte vseh njihovih uporabnikov.
...
12. marca 2007 sta dva odvisnika vlomila v stanovanje članu ter administratorju spletne strani Gibanja za pravičnost in razvoj in ukradla prenosni računalnik. V računalniku so bili shranjeni različni dokumenti, med drugim tudi seznam članov gibanja z njihovimi osebnimi podatki. V kasnejši policijski preiskavi so računalnik našli, ugotovili pa so tudi, da naj podatki iz njega ne bi bili prekopirani drugam.
...
Konec avgusta 2006 je CNN poročal, da so sudanske varnostne sile na letališčih pričele zasegati in pregledovati prenosne računalnike, s katerimi potniki vstopajo v to državo. Lastniki računalnike po približno enodnevnem pregledu sicer dobijo nazaj, uradno pa računalnike pregledujejo zato, da kakšen tujec v državo ne bi vnesel pornografije.
Neuradno pa sudanske oblasti verjetno zanimajo povsem druge stvari. Poleg velikega števila osebnih podatkov in gesel za dostop do elektronske pošte ter on-line storitev (tudi bančnih računov), se oblasti verjetno najbolj zanimajo za informacije poslovnih uporabnikov, mirovnih aktivistov in humanitarnih organizacij, ki so objavljale poročila o množičnih kršitvah človekovih pravic v tej državi.
Zasegov in pregledovanja prenosnih računalnikov na mejah ne izvaja samo nedemokratični Sudan, pač pa tudi najbolj ZDA. Ameriški mejni organi so januarja 2004 zasegli in preiskali prenosni računalnik nekega potnika. Računalnik so forenzično obdelali in v izbrisanem brskalnikovem medpomnilniku našli slike z otroško pornografijo.
Po pritožbi pa je Zvezno prizivno sodišče 24. julija letos presodilo, da so naključni zasegi prenosnih računalnikov in pregledovanja s pomočjo forenzičnih programov v ZDA zakoniti. ( Slo-Tech, 16. 9. 2006)
Pri varnosti potrebno odločati med udobjem in varnostjo. Treba se je pač odločiti ali nam več pomeni varnost naših podatkov, ali pa udobje brezbrižnosti. 8-) Šifriranje diskov nekoliko upočasni delovanje sistema (čeprav je to pri običajni rabi na običajnem računalniku povsem neopazno). Uporaba šifriranja pa lahko v primeru napake oziroma okvare trdega diska privede do resne izgube podatkov. V primeru uporabe šifriranja zato poskrbite za ustrezne varnostne kopije. Podatki naj se nikoli ne nahajajo samo na enem (šifriranem) nosilcu.
Zakaj?
Ena izmed možnosti napada na računalniške sisteme je tudi tim. offline napad, torej napad, ko napadalec pridobi fizični dostop do računalnika medtem, ko je le-ta ugasnjen. V primeru fizičnega dostopa do (ugasnjenega) računalnika - lahko gre tudi za izgubo, krajo ali pa lastnik računalnik nese na servis - napadalec lahko dostopa do trdega diska in podatkov na njem.
Nevarnost obstaja tudi, če imamo nekatere kritične podatke šifrirane. Nešifrirani lahko ostanejo podatki v medpomnilniku (tim. cache in swap), v raznih začasnih datotekah (tmp) ali v raznih datotekah beleženja aktivnosti (tim. log datoteke). Izbrisane podatke je mogoče tudi rekonstruirati s pomočjo različnih forenzičnih tehnik. Šifriranje samo nekaterih datotek ali samo nekaterih particij zato včasih ni dovolj. Rešitev proti takšnim napadom je šifriranje celotnega sistema. Izraz pravzaprav ni povsem natančen, saj ne šifriramo čisto vsega (npr. RAM pomnilnika), pač pa "samo" podatke na trdem disku. Ker moramo sistem vseeno nekako zagnati, mora ostati vsaj delček sistema (zagonski razdelek) nešifriran.
V nadaljevanju si bomo ogledali kako vzpostaviti šifriranje celotnega operacijskega sistema Ubuntu Linux (različica 7.04 Feisty Fawn). Nešifriran ostane samo zagonski razdelek (/boot), korenski imenik (tim. root), domači imenik (/home) in izmenljivi prostor (tim. swap), pa so šifrirani z uporabo LUKS modula programskega paketa cryptsetup. LUKS oz. Linux Unified Key Setup podpora omogoča uporabo več gesel, ki jih je mogoče tudi spreminjati, predvsem pa zagotavlja standardni vmesnik za delo s šifriranimi nosilci podatkov. Cryptsetup z LUKS podporo uporablja tudi nekatere mehanizme s katerimi otežuje napade z grobo silo (tim. brute force attacks) v primeru uporabe šibkih gesel.
Tako postavljen sistem bo mogoče zagnati (oz. dostopati do diskov) samo s pomočjo gesla, ki ga vnesemo ob zagonu sistema, sicer pa tako postavljen sistem deluje povsem običajno.
Šifriranje diskov: Debian way
Eden prvih, če ne povsem prvi operacijski sistem, ki je v namestitveni proces uvedel šifriranje trdih diskov je Debian Linux, ki ima podporo za šifrirane diske od različice Echt dalje.
Debianov namestilnik namreč uporabnikom omogoča, da ustvarjajo šifrirane razdelke že med samim namestitvenim procesom:
Pri Debianu je uporaba šifriranih razdelkov dobro integrirana v sam sistem, težava je le v tem, da je Debian Linux uporabniško precej neprijazen in večinoma namenjen strežnikom. Po drugi strani pa na Debianu temeljijo številne druge distribucije Linuxa, med drugim tudi Ubuntu, poleg tega je Debian pogosto postavljal standarde razvoja Linuxa, zato lahko pričakujemo, da bo vgrajena podpora za šifrirane razdelke počasi postala sestavni del ostalih Linux distribucij.
Prenos in namestitev strežniške različice Ubuntu 7.04
Po drugi strani pa z nekoliko več dela lahko šifriran sistem vzpostavimo tudi pod Ubuntu Linuxom, ki velja za enega bolj uporabniško prijaznih. Za razliko od Debiana, ki pri vzpostavitvi šifriranega sistema uporablja osnovni cryptsetup, pa lahko pri v nadaljevanju opisanem postopku uporabimo cryptsetup z LUKS podporo, kar nam omogoča enostavno menjavanje šifrirnih gesel in ključev.
Ker podpora za šifriranje sistema žal v Ubuntu še ni privzeto vgrajena, se je potrebno poslužiti nekaterih trikov. Tako na računalnik najprej namestimo strežniško različico Ubuntu Linuxa, vzpostavimo šifrirane razdelke, nato pa nanje namestimo namizno različico Ubuntu Linuxa in strežniško odstranimo.
Iz interneta si najprej prenesemo strežniško različico Ubuntu Linuxa - Ubuntu 7.04 Server Edition (ubuntu-7.04-server-i386.iso) in jo zapečemo na CD. Računalnik zaženemo iz CD-ja in pričnemo z namestitvenim postopkom.
Prepis diska z naključnimi podatki
Preden se lotimo šifriranja podatkovnih nosilcev je dobro razmisliti o uničenju starih podatkov na njih oziroma prepis nosilcev podatkov z naključnimi podatki. Prepisovanje diska z naključnimi podatki sicer ni nujno potrebno, je pa priporočljivo.
Stare podatke je namreč z nekaterimi programsko forenzičnimi tehnikami (npr. z orodji kot so Autopsy Forensic Browser, Testdisk, Photo Rec, in drugi) mogoče precej enostavno obnoviti, poleg tega pa je prepisovanje diska z naključnimi podatki koristno tudi zato, ker na tako prepisanem disku ni mogoče (oz. je to izredno težko) ugotoviti koliko pravih šifriranih podatkov je na disku in koliko je praznega prostora.
Po drugi strani pa je prepisovanje diska z naključnimi podatki precej dolgotrajen postopek. Več o prepisovanju diska z naklljučnimi podatki si preberite v članku o šifriranju nosilcev podatkov v okolju Linux in Windows, poglavje "Prepis diska ali razdelkov z naključnimi podatki", najbolj optimalno pa je če iz live CDja uporabimo ukaz dd. V primeru prepisovanja trdega diska hda, to izgleda takole:
dd if=/dev/urandom of=/dev/hda bs=16M
Postopek namestitve Ubuntu strežnika
OPOZORILO: zaradi napake v jedru operacijskega sistema Feisty strežniške različice, le-te ni mogoče namestiti v nekatere virtualne stroje (npr. Vmware in VirtualBox), oziroma je namestitev potrebno kasneje ročno popravljati.
Če nameščamo na obstoječi disk, je potrebno razmisliti ali ni smiselno disk prepisati z naključnimi podatki. Ko je disk pripravljen, pričnemo z namestitvijo. Najprej izberemo Install to the hard disk.
V naslednjem koraku izberemo slovenski jezik.
Na vprašanje "Detect keyboard layout?" odgovorimo Ne.
Zaradi napake v Ubuntujevem namestilniku izberemo tip tipkovnice U.S. English. POZOR: ker imamo vključeno angleško tipkovnico je treba biti pri vpisovanju gesel pozoren na to, da so črke na slovenski in angleški tipkovnici drugače razporejene!
Če imamo DHCP, bo namestilnik sam zaznal omrežne nastavitve, sicer je potrebno IP naslov vpisati ročno.
Določimo ime računalnika (npr. cryptobox).
Pri razdeljevanju diska izberemo Priročnik.
Razdeljevanje diska
Predpostavka je, da imamo trdi disk /hda. Disk razdelimo na štiri razdelke:
- razdelek /boot, velikosti 100 Mb - /hda1
- razdelek / (začasni korenski imenik) (bodoči cswap), velikosti 2 Gb - /hda2
- neuporabljeni razdelek (bodoči korenski imenik croot), velikosti 10 Gb - /hda3
- neuporabljeni razdelek (bodoči domači imenik chome), izberemo vso velikost, ki ostane - /hda4
Še priporočilo: če se lotimo nameščanja šifrianja na sistem z več operacijskimi sistemi, si pred začetkom postopka naredimo načrt diska - izpišimo si seznam vseh razdelkov (v Linuxu uporabimo ukaz sudo sfdisk -l) in si za vsakega označimo kateremu delu sistema (/home, /, in ostali razdelki) bo namenjen. Previdnost pri delu nikakor ni odveč, saj z izbiro napačnega razdelka uničimo podatke na njem.
Ko bo namestitev končana, bomo imeli na disku štiri razdelke: /boot, /dev/mapper/cswap (šifrirani izmenljivi prostor (tim. swap)), /dev/mapper/croot (šifrirani korenski razdelek) in /dev/mapper/chome (šifrirani domači razdelek).
Najprej izberemo prazen prostor in na njem ustvarimo nov razdelek.
Določimo njegovo velikost (npr. 100 MB, 2 GB, itd.), vrsto ter mesto.
Določimo priklopno točko (pri prvem /boot, pri zadnjih dveh Ne priklopi) ter datotečni sistem (npr. ext3).
Ko končamo ustvarjanje prvega razdelka se lotimo naslednjega, ki ga ustvarimo na preostalem praznem prostoru, dokler ne končamo z zadnjim razdelkom. Nato izberemo Končaj razdeljevanje in zapiši spremembe na disk.
Namestilnik bo zaznal, da tretjemu in četrtemu razdelku ni dodeljena priklopna točna in nas vpraša, ali se želimo vrniti nazaj na razdeljevanje. Odgovorimo Ne.
Prav tako nas opozori, da nismo namenili razdelka izmenljivemu prostoru (swap) in nas vpraša, če se želimo vrniti nazaj. Odgovorimo Ne.
Izberemo, da se spremembe zapišejo na disk in namestitev se nadaljuje...
Dokončanje namestitve
Nastavimo uro (ali je sistemski čas nastavljen na UTC).
Izberemo polno ime za novega uporabnika.
Izberemo uporabniško ime...
...in geslo (vpišemo ga dvakrat).
Sledi nameščanje osnovnega sistema.
Nameščanja DNS in LAMP strežnika ne izberemo.
V nekaterih primerih se lahko zgodi, da namestitev obstane oz. namestitveni program "zamrzne". Navadno se to zgodi na 85% namestitve pri nameščanju paketa update-manager-core. Gre še za eno precej nepotrebno napako, ki je na srečo rešljiva povsem enostavno. Če nameč pritisnemo Ctrl-Alt-F4 in si ogledamo zapis o postopku namestitve (tim. installation log), se namreč izkaže, da se je obesil programski paket apt, ki skrbi za prenos in nameščanje programskih paketov. Rešitev je razmeroma enostavna. Najprej odpremo drugo konzolo s pritiskom na Ctrl-Alt-F2, nato pa pogledamo ID številko procesa programskega paketa apt (tim. process ID ali PID):
ps grep -i apt
PID številka je številka v prvem stolpcu v vrstici, kjer se pojavi niz apt-get update. Proces sedaj ubijemo z ukazom (namesto PID vnesemo to številko):
kill PID
Namestitev se potem brez težav nadaljuje naprej. Čez nekaj časa se namestitev zaključi in sledi prvi zagon sistema.
Namestitev šifriranja
Po prvem zagonu sistema bo računalnik najprej našel napak v datotečnem sistemu in pognal program fsck ter napake samodejno odpravil. Računalnik se nato ponovno zažene brez težav. To se žal ponovi tudi kasneje, ob prvem zagonu sistema iz šifriranega razdelka. Napaka se kasneje ne pojavlja več, edina težava je, da se ob prvem zagonu sistema računalnik dvakrat zažene. Ko se torej računalnik zbudi, se prijavimo vanj ter vstopimo v administratorski način:
sudo su
Naložimo potrebne module:
modprobe dm-crypt
modprobe dm-mod
modprobe aes
modprobe sha256
Dodamo module v datoteko /etc/modules, da se ob ponovnem zagonu sistema samodejno naložijo:
echo dm-crypt >> /etc/modules
echo dm-mod >> /etc/modules
echo aes >> /etc/modules
echo sha256 >> /etc/modules
Namestimo program cryptsetup:
apt-get install cryptsetup
Priprava šifriranega korenskega razdelka
Sedaj formatiramo tretji razdelek (v danem primeru z datotečnim sistemom ext3) - bodoči šifrirani korenski imenik (naprej vpišemo YES, s čimer se strinjamo s formatiranjem, nato pa dvakrat vpišemo LUKS geslo):
luksformat -t ext3 /dev/hda3
Če želimo uporabiti večji šifrirni ključ (256-bitno AES šifriranje) uporabimo ukaz (tako ustvarjen razdelek bomo morali kasneje ročno formatirati z ukazom sudo mkfs.ext3):
cryptsetup --key-size 256 luksFormat /dev/hda3
Dobimo približno takle izpis:
Creating encrypted device on /dev/hda3...
WARNING!
========
This will overwrite data on /dev/hda3 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.
Please enter your passphrase again to verify it
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.
mke2fs 1.40-WIP (14-Nov-2006)
...
...
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Formatirani razdelek priklopimo kot croot:
cryptsetup luksOpen /dev/hda3 croot
Vnesemo geslo in razdelek je priključen:
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.
Če ga nismo formatirali z luksformatom, to storimo sedaj:
mkfs.ext3 /dev/mapper/croot
Razdelek priklopimo na /mnt:
mount /dev/mapper/croot /mnt
Nanj prekopiramo datoteke iz korenskega razdelka (to traja nekaj časa, med parametri lahko dodamo -v (verbose), da dobimo natančen izpis kaj se trenutno kopira):
cd /mnt
cp -xa / .
Priprava zagonskih skript in okolja šifriranega korenskega imenika
Z ukazom chroot zamenjamo korenski imenik v bodoči šifrirani korenski imenik (POZOR: potrebno je paziti na poti!):
cd /
mount --bind proc mnt/proc
mount --bind sys mnt/sys
mount --bind dev mnt/dev
chroot /mnt
Priklopimo zagonski (/boot) razdelek:
mount /dev/hda1 boot
Popravimo datoteko /etc/crypttab (zadnji vnos zaenkrat še zakomentiramo!):
nano etc/crypttab
# <target name> <source device> <key file> <options>
croot /dev/hda3 none luks
# cswap /dev/hda2 /dev/urandom swap
# chome /dev/hda4 /etc/keys/home.key luks
Popravimo datoteko /etc/fstab (vnosa za cswap in chome zaenkrat še zakomentiramo!):
nano /etc/fstab
Zakomentiramo trenutni korenski imenik (pomembno, tega ne smemo pozabiti) in dodamo vnos za croot, cswap in chome razdelke (slednja dva sta zaenkrat še zakomentirana):
/dev/mapper/croot / ext3 defaults,errors=remount-ro 0 1
# /dev/mapper/cswap none swap sw 0 0
# /dev/mapper/chome /home ext3 defaults 0 2
Datoteka /etc/fstab sedaj izgleda približno takole (UUID-ji so simbolični):
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
# /dev/hda2
#UUID=e8363198-819b-44e0-bba5-7b4dd58eef4e / ext3 defaults,errors=remount-ro 0 1
/dev/mapper/croot / ext3 defaults,errors=remount-ro 0 1
# /dev/mapper/cswap none swap sw 0 0
# /dev/mapper/chome /home ext3 defaults 0 2
# /dev/hda1
UUID=2fca8417-07de-4a7b-a8cb-4cfeddc89c7d /boot ext3 defaults 0 2
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Naredimo ključ za bodoči chome:
cd etc/keys
dd if=/dev/urandom of=home.key bs=1k count=1
Šifrirni ključ za chome se bo nahajal na korenskem razdelku, zato sistem med zagonom izpiše opozorilo, da to ni najbolj varno (izpiše se: INSECURE MODE FOR /etc/home/key - zagon sicer poteka povsem normalno in možno je, da nepozorni opazovalci opozorila sploh ne bodo opazili). To sicer drži, vendar se ključ nahaja na šifriranem razdelku. Če želimo, pa lahko za razdelek /home določimo priklop z geslom (in to vnesemo v crypttab), vendar bomo potem ob zagonu morali vpisati dve gesli.
Naredimo novo zagonsko skripto initrd:
cd /boot
update-initramfs -u
Popravimo Grub vnos (v vrstico kernel dodamo /dev/mapper/croot):
nano /boot/grub/menu.lst
title Ubuntu, kernel 2.6.20-15-server
root (hd0,0)
kernel /vmlinuz-2.6.20-15-server root=/dev/mapper/croot ro quiet nosplash
initrd /initrd.img-2.6.20-15-server
quiet
savedefault
Žal je potrebno omenjeni Grub vnos ročno popravljati ob vsaki menjavi jedra operacijskega sistema. Problem lahko delno rešimo tako, da v datoteki /boot/grub/menu.lst poiščemo vrstico, ki vsebuje niz # kopt=root=.
Vrstica se nahaja bolj na začetku datoteke in sicer v oddelku:
## ## Start Default Options ##
## default kernel options
## default kernel options for automagic boot options
Izgleda približno takole (UUID je simboličen):
# kopt=root=UUID=56161a45-6963-463f-b2a6-b2a47f48bac7 ro
Vrstico spremenimo takole (pozor, vrstica naj ostane enojno zakomentirana (#)!):
# kopt=root=/dev/mapper/croot ro
Ob vsaki nadgradnji ali menjavi jedra oziroma vsakič, ko bomo z administratorskimi privilegiji ročno pognali ukaz update-grub, se bo kernel vrstica v Grub vnosu spremenila v:
kernel /vmlinuz-2.6.20-15-server root=/dev/mapper/croot ro quiet splash
S tem smo rešili težavo pri določanju korenskega imenika, žal pa se v Grub vnosu še vedno pojavi predstavitveno okno (splash screen), ki ne omogoča vnosa LUKS gesla in bo zato potrebno pri omenjeni vrstici splash ročno spremeniti v nosplash!
Zapustimo spremenjeni korenski imenik (croot):
- pritisnemo Ctrl-D
Sledi ponoven zagon sistema:
reboot
Priprava šifriranega izmenjalnega prostora (swap) in domačega razdelka (/home)
Sedaj se zbudimo v šifriranem sistemu (zaenkrat je šifriran samo korenski imenik). Na začetku (preden se sistem naloži), nas le-ta vpraša za LUKS geslo, brez katerega ni mogoče zagnati sistema:
Starting up ...
Loading, please wait...
Setting up cryptographic volume croot (based on /dev/hda3)
Enter LUKS passphrase:
Ko se sistem naloži, ponovno vstopimo v administratorski način:
sudo su
Če želimo, lahko prepišemo stari korenski imenik z naključnimi podatki:
dd if=/dev/urandom of=/dev/hda2 bs=16M
Če tega ne storimo pa je potrebno formatirati razdelek, kjer bo v bodoče šifrirani izmenjalni prostor (tim. swap - aktiven bo postal ob naslednjem zagonu sistema), sicer se naprava /dev/mapper/cswap ob zagonu noče priklopiti:
mkswap /dev/hda2
Dobimo približno takle izpis:
Setting up swapspace version 1, size = 1998737 kB
no label, UUID=59a4dbb5-913c-4d9f-9a06-76dc232cd5af
Naredimo podimenik na /dev (rešitev za napako št. 105266):
mkdir /dev/.static/dev/mapper
Formatiramo bodoči domači (/home) razdelek (trenutno nastavimo navadno geslo, kasneje pa bomo dodali datoteko s ključem). Tudi v tem primeru lahko uporabimo večji ključ, na podoben način kot zgoraj:
luksformat -t ext3 /dev/hda4
Priključimo šifrirani domači razdelek (vnesti je potrebno njegovo LUKS geslo) in ga priklopimo na /mnt:
cryptsetup luksOpen /dev/hda4 chome
mount /dev/mapper/chome /mnt
Na bodočem šifriranem domačem razdelku ustvarimo uporabniški imenik za trenutnega uporabnika (npr. za uporabnika matej)
cd /mnt
mkdir matej
chown matej.matej matej
Sedaj razdelku chome dodamo datoteko s ključem (razdelek bo sedaj dostopen z geslom in datoteko s ključem, ki se nahaja na /etc/keys/home.key):
cryptsetup luksAddKey /dev/hda4 /etc/keys/home.key
Vnesemo trenutno LUKS geslo:
Enter any LUKS passphrase:
key slot 0 unlocked.
Command successful.
Če želimo, lahko LUKS geslo sedaj odstranimo (razdelek pa ostane dostopen samo z datoteko s ključem).
Odkomentiramo cswap in chome vnos v /etc/crypttab:
nano /etc/crypttab
Odkomentiramo cswap in chome vnos v /etc/fstab.
nano /etc/fstab
Ponovno zaženemo sistem:
reboot
Vstop v šifrirani sistem in namestitev namiznega okolja
Po ponovnem zagonu preverimo, če so šifrirani razdelki priključeni:
ls /dev/mapper
Dobimo približno takle izpis, iz katerega sledi, da so priključeni vsi trije šifrirani razdelki:
chome control croot cswap
Preverimo tudi, če je izmenjalni prostor (swap) aktiven na cswap razdelku:
cat /proc/swaps
Dobimo približno takle izpis:
Filename Type Size Used Priority
/dev/mapper/cswap partition 1951888 0 -1
Sedaj je trdi disk od koder se sistem zažene v celoti (razen /boot razdelka) šifriran. Sledi namestitev namiznega okolja Ubuntu Desktop. Najprej je potrebno v seznamu skladišč programskih paketov zakomentirati vnos, ki kot enega izmed skladišč uporablja namestitveni CD-ROM:
sudo nano /etc/apt/sources.list
Zakomentiramo vrstico:
# deb cdrom:[Ubuntu-Server 7.04 _Feisty Fawn_ - Release i386 (20070415)]/ feisty main restricted
Sledi osvežtev seznama programskih paketov in namestitev paketa ubuntu-desktop:
sudo apt-get update
sudo apt-get install ubuntu-desktop
Namesto klasičnega Ubuntujevskega namizja Gnome (ubuntu-desktop) lahko namestimo KDE (kubuntu-desktop) ali Xfce (xubntu-desktop), slednji je primeren predvsem za počasnejše računalnike in računalnike z manj pomnilnika RAM.
Namestitev namiznega okolja je lahko precej dolgotrajna, saj sistem iz skladišč programskih paketov na internetu na naš računalnik prenese več kot 450 Mb programskih paketov. Pritisnemo enter in prenos ter nameščanje se prične:
Potrebno je dobiti 470MB/484MB arhivov.
Po odpakiranju bo uporabljenega 1649MB dodatnega prostora na disku.
Ali želite nadaljevati [Y/n]?
Proti koncu namestitve je bo potrebno še ročno označiti katere resolucije zaslona naj podpira grafični strežnik (praviloma so pravilne resolucije že označene in se s tipko tab samo pomaknemo na gumb "V redu" ter pritisnemo enter ali preslednico):
Nastavitve grafičnega strežnika lahko kasneje ročno spremenimo z ukazom, kjer izberemo gonilnik grafične kartice, monitor, resolucijo in ostale podatke potrebne za delovanje grafičnega strežnika:
sudo dpkg-reconfigure xserver-xorg
Namestitev namiznega jedra operacijskega sistema ter odstranjevanje strežniškega jedra
Nato namestimo namizno različico jedra operacijskega sistema (to sicer ni nujno potrebno, saj sistem deluje tudi s strežniško različico jedra, namestitev generične različice sicer iz interneta prenese okrog 24 Mb programskih paketov):
sudo apt-get install linux-image-generic
Pred ponovnim zagonom sistema moramo ročno popraviti Grub menu: v vrstico kernel namesto splash napišemo nosplash (vnos določa, da sistem zaženemo brez tim. predstavitvenega okna (ang. splash screen), saj z njim vnos LUKS gesla ne deluje), kot korenski imenik nastavimo /dev/mapper/croot Torej:
sudo nano /boot/grub/menu.lst
Poiščemo Grub vnos (UUID je simboličen oziroma ga ni, če smo predhodno nastavili kopt=root parameter):
title Ubuntu, kernel 2.6.20-16-generic
root (hd0,0)
kernel /vmlinuz-2.6.20-16-generic root=/dev/mapper/croot ro quiet splash
initrd /initrd.img-2.6.20-16-generic
quiet
savedefault
In popravimo:
kernel /vmlinuz-2.6.20-16-generic root=/dev/mapper/croot ro quiet nosplash
Sistem ponovno zaženemo:
sudo reboot
Sistem se bo sedaj zbudil v grafičnem načinu.
Ko se ponovno prijavimo v sistem v konzoli preverimo v katero jedro operacijskega sistema je aktivno:
uname -a
Dobimo približno takle izpis, pri izpisu je pomembno, da dobimo -generic in ne -server:
Linux cryptobox 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686 GNU/Linux
Sedaj pogledamo katere strežniške različice jedra imamo nameščene...
sudo dpkg --get-selections grep linux-
...ter jih odstranimo:
sudo apt-get remove --purge linux-image-2.6.20-15-server linux-image-server linux-server
Še enkrat popravimo še Grub menu (namesto splash vpišemo nosplash)...
sudo nano /boot/grub/menu.lst
kernel /vmlinuz-2.6.20-16-generic root=/dev/mapper/croot ro quiet nosplash
Popraviti je potrebno Ubuntu, kernel 2.6.20-16-generic vnos, lahko pa tudi tudi Ubuntu, kernel 2.6.20-16-generic (recovery mode) vnos, če nismo nastavili kopt=root parametra.
Uporaba sistema in priprava za nadaljne delo
Postopek namestitve je s tem končan. Iz menija System - Administracija - Language Support lahko vključimo še podporo za slovenski jezik in sistem prenese najnovejše jezikovne pakete za slovenščino. Ne pozabimo tudi namestiti požarnega zidu. Če želimo, si lahko namestimo tudi programski paket ubuntu-restricted-extras, ki poskrbi za namestitev dodatnih pisav, Jave, predvajalnika Flash in Gstreamer priključne module ter dodatne kodeke, ki se nahajajo na skladišču programskih paketov Medibuntu:
echo "deb http://packages.medibuntu.org/ feisty free non-free" sudo tee -a /etc/apt/sources.list
wget -q http://packages.medibuntu.org/medibuntu... -O- sudo apt-key add - && sudo apt-get update
sudo apt-get install ubuntu-restricted-extras libxine-extracodecs gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-pitfdll
sudo apt-get install w32codecs
sudo apt-get install libdvdnav4 libdvdplay0 libdvdread3 libdvdcss2
sudo /usr/share/doc/libdvdread3/install-css.sh
Več o nameščanju uporabnih paketov si lahko preberete v prihodnjem članku o nameščanju uporabne programske opreme na Ubuntu Feisty.
Ob vsakem zagonu sistema bo sedaj potrebno vpisati LUKS geslo:
Starting up ...
Loading, please wait...
Setting up cryptographic volume croot (based on /dev/hda3)
Enter LUKS passphrase:
V primeru napačnega gesla, dobimo obvestilo:
Command failed.
cryptsetup: cryptsetup failed, bad password or options?
Po treh vnosih napačnega gesla pa dobimo obvestilo:
cryptsetup: maximum number of tries exceeded
Tako postavljen sistem deluje povsem normalno, težava nastopi le ob namestitvi popravkov jedra ali namestitvi novega jedra operacijskega sistema. Takrat je namreč potrebno ročno popraviti Grub menu. Na srečo do popravkov ne prihaja pogosto.
Dodajanje in spreminjanje LUKS gesel
LUKS šifriranim razdelkom lahko enostavno dodajamo ali spreminjamo gesla. OPOZORILO: ker je ob zagonu sistema aktivna angleška tipkovnica, ki ima drugačno razporeditev znakov, je treba pri vpisovanju gesel to upoštevati!
V našem primeru za izmenjalni prostor uporabljamo naključen ključ, za domači razdelek pa je ključ shranjen v datoteki s ključem /etc/keys/home.key. Ker ob zagonu vpisujemo le LUKS geslo za dostop do korenskega razdelka, je smiselna le menjava tega gesla. Le-ta je mogoča tudi pri priključenem oz. aktivnem razdelku. Gesla se shranjujejo na posebna mesta (ang. slot) v šifriranem razdelku, ki se štejejo od nič dalje. Prvo geslo se torej nahaja na mestu 0, drugo na mestu 1, itd. Če želimo, lahko najprej pogledamo koliko prostih mest imamo še na voljo:
cryptsetup luksDump /dev/hda3
Dodajanje gesla je sedaj mogoče z naslednjim ukazom (kot parameter ukazu podamo razdelek, torej /dev/sdc3):
sudo cryptsetup luksAddKey /dev/hda3
Najprej je treba vnesti enega izmed obstoječih gesel, nato pa novo geslo, ki ga še potrdimo. Izpis je približno takle:
Enter any LUKS passphrase:
key slot 0 unlocked.
Enter new passphrase for key slot:
Verify passphrase:
Command successful.
Brisanje gesla iz mesta 1 (kot parameter ukazu podamo razdelek, torej /dev/hda3 in številko mesta, torej 1:
sudo cryptsetup luksDelKey /dev/hda3 1
Najprej je potrebno vnesti enega izmed obstoječih gesel (vendar pa ne tistega, ki ga želimo odstraniti). Še opozorilo: če odstranimo vsa gesla, je dostop do šifriranega razdelka za vedno onemogočen. Izpis je približno takle:
Enter any remaining LUKS passphrase:
key slot 0 unlocked.
Command successful.
Sprememba gesla je mogoča tako, da najprej dodamo novo geslo, nato pa izbrišemo starega.
Ali deluje...?
V nadaljevanju si poglejmo nekaj preiskusov delovanja v celoti šifriranega sistema.
Hibernacija ter odloženi izklop
Preiskus pokaže, da izbiri Zaspi (Hibernate) ter Odložen izklop (Suspend) normalno delujeta. Ko računalnik ponovno zaženemo, se normalno zbudi.
Priklapljanje dodatnih šifriranih nosilcev podatkov
Prav tako v tak sistem lahko normalno priklapljamo dodatne šifrirane nosilce podatkov. Smiselno je, da redno ustvarjamo varnostne kopije in to na zunanje šifrirane nosilce podatkov.
Nameščanje novega jedra ali popravkov obstoječega jedra operacijskega sistema
Žal nameščanje nameščanje novega jedra ali popravkov obstoječega jedra operacijskega sistema ne deluje brez težav. Ob namestitvi jedra se sicer samodejno zažene posodabljanje initrd skript, žal pa sistem napačno popravi vnose v Grub meniju. Pri vnosu kernel je potrebno namesto splash dodati nosplash.
Če Grub vnos pozabimo popraviti, se ob ponovnem zagonu sistem enw bo več zagnal, na srečo pa je napako tudi v tem primeru mogoče odpraviti brez večjih težav. Grub vnos namreč lahko začasno popravimo med zagonom sistema. Ob zagonu sistema pritisnemo Esc, da vstopimo v Grub menu, izberemo željeni vnos, nato pa pritisnemo e (edit - uredi). Izberemo željeno vrstico vnosa (npr. vrstico kernel) in ponovno pritisnemo e (edit - uredi) in popravimo vnos. Ko je vnos popravljen, pritisnemo tipko enter nato pa b (boot - zaženi). Ker se spremembe ne shranijo, moramo po zagonu sistema spremembe ponovno vnesti in shraniti v /boot/grub/menu.lst.
Nadgradnja sistema
Nadgradnja sistema še ni bila preiskušena, predvideva pa se da ob nadgradnji na Gutsy (naslednja različica Ubuntuja, ki izide predvidoma oktobra 2007) ne bo težav, razen tistih, ki so povezane z nadgradnjo jedra operacijskega sistema in so opisane zgoraj.
Forenzična analiza sistema
Forenzična analiza diska na v celoti šifriranem sistemu pokaže, da je mogoče do zagonskega razdelka normalno dostopati, korenski in domači razdelek pa sta šifrirana:
root@ubuntu:/home/ubuntu# mount /dev/hda3 /mnt/
mount: unknown filesystem type 'crypto_LUKS'
root@ubuntu:/home/ubuntu# mount /dev/hda4 /mnt/
mount: unknown filesystem type 'crypto_LUKS'
Prav tako ni mogoče priključiti razdelka z izmenjalnim prostorom:
root@ubuntu:/home/ubuntu# mount /dev/hda2 /mnt/
mount: you must specify the filesystem type
Forenzična analiza z orodjem Autopsy Forensic Browser pokaže, da razen iz zagonskega razdelka od ostalih razdelkov ni mogoče dobiti nikakršnih uporabnih podatkov.
Kaj pa hitrost?
Za primerjavo hitrosti šifriranega in nešifriranega sistema smo uporabili test Bonnie++, ki meri hitrost pisanja na trdi disk in branja iz njega. Uporablja več metod. Primerjava je bila opravljena na dveh računalnikih. Hitra analiza pokaže, da je padec hitrosti zaradi uporabe šifriranja precej odvisen od hitrosti računalnika. Pri hitrejšem iz s pomnilnikom RAM bolj založenim računalniku (Pentium 4, 3 GHz, 1 Mb RAM) se pri nekaterih operacijah padec hitrosti praktično ne pozna, pri počasnejšem računalniku (Pentioum 3, 733 MHz 378 Mb RAM) pa je lahko precej občuten. Pri vsakdanjem delu na povprečnem, ne preveč starem računalniku padca hitrosti povprečen uporabnik praktično ne bi smel opaziti:
Kljub vsemu je potrebno povedati, da je testiranje zgolj osnovno, saj dela testov zaradi premalo natančnih meritev ni bilo mogoče izvesti. Za bolj relevantno testiranje bo potrebno metodologijo testiranja še dodelati in testiranje izvesti v bolj kontroliranih okoliščinah.
Končno varna Okna
Na v celoti šifrirani sistemu lahko sedaj namestimo požarni zid temelječ na iptables, nato pa virtualizacijski program Vmware ali VirtualBox, znotraj katerega naložimo operacijski sistem Windows, dostop do omrežja pa je preko NAT vmesnika.
VirtualBox je na voljo v odprtokodni ali "osebni" različici (pod licenco VirtualBox Personal Use and Evaluation License), omogoča pa tudi izdelavo posnetkov sistema (tim. snapshots). Če želimo, si lahko naredimo rezervno kopijo Kopijo sveže naloženega Windows sistema, ki jo po potrebi obnovimo.
Če imamo dva monitorja, lahko virtualni stroj teče v drugem zaslonu. Poganjanje operacijskega sistema MS Windows znotraj šifriranega Linux računalnika z dovolj pomnilnika RAM (1,5 - 2 Gb ali več) deluje brez težav in opaznejših zakasnitev.
Napad na popolnoma šifrirani sistem
Kot rečeno, opisano šifriranje varuje samo pred tim. offline napadom. Sistem, ki je priključen, je na druge vrste napadov še vedno ranljiv, zato je potrebno uporabljati ustrezne zaščitne mehanizme (predvsem požarni zid, ustrezna gesla, redne nadgradnje z varnostnimi popravki, itd.).
Napadalec, ki uspe vstopiti v aktiven sistem lahko v primeru pridobitve administratorskega dostopa do računalnika dostopa vseh podatkov. Lahko pa napadalec namesti tudi strojni prestreznik tipkanja. Programsko pa je možen tudi napad na nešifrirani zagonski razdelek. Nanj lahko napadalec namesti programsko opremo, ki prestreže vnos LUKS gesla ob zagonu.
Ena izmed rešitev v tem primeru je preverjanje integritete zagonskega razdelka s kakšnim od programskih orodij za preverjanje integritete, npr. orodjem Tripwire. Kljub temu, da orodje Tripwire velja za eno boljših orodij za preverjanje integritete sistema, pa bi izurjeni napadalec lahko zagonski rezdelek računalnika popravil tako, da bi najprej prestregel geslo, ga preko interneta odposlal na oddaljeni strežnik, nato pa zagonski sektor popravil v prvotno stanje. V tem primeru preverjanje integritete sistema ne bi zaznalo napada.
Rešitev?
Rešitev v tem primeru je obnova zagonskega razdelka pred vsakim zagonom računalnika oziroma zagon računalnika iz CD-ROM enote ali USB ključa. Opisani postopki so za pogosto uporabo (npr. vsakodnevni zagon računalnika) precej nepriročni, smiselni pa so za zagon kakšnega strežnika ali podobnega računalnika, kjer je potrebno poskrbeti za visoko stopnjo varnosti, zagoni sistema pa niso prav pogosti. Seveda je potrebno tudi paziti, da kopije zagonskega razdelka ne izgubimo, ali da nam je "pomotoma" ne ukradejo.
Ustvarjanje rezervne kopije zagonskega razdelka
Najprej preverimo če je zagonski razdelek ustrezno pripravljen (popravljen Grub menu, itd. - torej, da se sistem normalno zažene). Nato v konzoli vnesemo ukaz:
sudo dd if=/dev/hda1 of=zagonski_razdelek.img bs=16M
Če želimo, lahko kopijo zagonskega razdelka stisnemo s programom gzip (podamo mu parameter -9, za najvišjo stopnjo kompresije):
sudo dd if=/dev/hda1 bs=16M gzip –9 > zagonski_razdelek.img
Dobimo približno takle izpis:
6+1 zapisov na vhodu
6+1 zapisov na izhodu
106896384 bytes (107 MB) copied, 2,57393 sekunde, 41,5 MB/s
S tem smo naredili natančno kopijo zagonskega razdelka v datoteko z imenom zagonski_razdelek.img. To datoteko sedaj shranimo na USB ključ ali zapišemo na CD (nestisnjena bo velika toliko kot zagonski razdelek, torej okrog 100 Mb, stisnjena pa približno pol manjša).
Mimogrede, ne pozabimo narediti zagonske kopije ob vsaki nadgradnji jedra operacijskega sistema oziroma ob vsakem generiranju novih zagonskih (initrd) skript!
Če želimo, lahko naredimo tudi kopijo zagonskega sektorja (tim. MBR - Master Boot Record), ki ga tudi shranimo na USB ključ ali zapečemo na CD nosilec:
sudo dd if=/dev/hda bs=512 count=1 cat - > MBR.img
Obnavljanje rezervne kopije zagonskega razdelka
Če želimo obnoviti zagonski razdelek, moramo računalnik najprej zagnati s pomočjo živega CDja, npr. namestitvenega CDja namizne različice Ubuntuja. Nato priključimo USB ključ s kopijo zagonskega razdelka (npr. na mesto /media/USBbackup) in vnesemo ukaz - v primeru, da smo ustvarili nestisnjeno kopijo zagonskega razdelka:
sudo dd if=/media/USBbackup/zagonski_razdelek.img of=/dev/hda1 bs=16M
V primeru, da smo ustvarili stisnjeno kopijo zagonskega razdelka, pa vnesemo ukaz:
sudo su
gunzip –c /media/USBbackup/zagonski_razdelek.img dd of=/dev/hda1 bs=16M
Pa še obnavljanje zagonskega (MBR) sektorja:
sudo su
cat /media/USBbackup/MBR.img dd of=/dev/hda
"High-tech" napadi
S temi postopki smo varnost našega sistema občutno izboljšali, žal pa to niso edini možni napadi na sistem. Napadalec namreč lahko izvede tudi napad na strojno opremo, kjer na njo namesti svojo ("popravljeno") različico strojne programske opreme (tim. firmwarea). Tak napad je sicer razmeroma težko izvedljiv in malo verjeten, kot zanimivost pa je na voljo nekaj člankov na to tematiko:
- Physical Access Attacks with Firewire
- Implementing And Detecting A PCI Rootkit
- Copilot - a Coprocessor-based Kernel Runtime Integrity Monitor
- Attack of the iPods!
- Hardware is secure (false)
- Attacks on and Countermeasures for USB Hardware Token Devices
Napad je mogoče izvesti tudi če ima napadalec dostop do pomnilnika sistema (npr. kot prijavljeni uporabnik sistema, ki lahko shrani vsebino pomnilnika v datoteko). Več o tem v predavanju Torbjörna Petterssona na CCC 2007:
Težave in njihovo reševanje
Ob zagonu sistema (ko je treba vpisati LUKS geslo) imamo vključeno angleško tipkovnico. Pri vpisovanju gesel je treba biti pozoren na to, da so črke na slovenski in angleški tipkovnici drugače razporejene!
Če smo pozabili popraviti Grub meni, ga lahko ob zagonu sistema popravimo ročno. Pomembno je da nastavimo ustrezen korenski imenik (/dev/mapper/croot) in izključimo predstavitveno okno (nosplash).
V primeru, da se nam zaradi napake na datotečnem sistemu samodejno požene orodje fsck (npr. če imamo ob ponovnem zagonu v računalnik priključen zunanji USB disk brez razdelkov), se v nekaterih primerih chome razdelek ne bo priključil, pač pa se bo ustvaril navidezni domači /home podimenik, ki bo prazen. Sistem bo potrebno ponovno zagnati in ko se chome razdelek priključi sistem normalno deluje kot prej.
Šifrirane razdelke lahko priključimo tudi s pomočjo živega CD-ja, pri čemer je potrebno najprej naložiti ustrezne module ter namestiti cryptsetup (shranimo in namestimo ga lahko tudi iz USB ključa, če nimamo dostopa do interneta), nato pa šifrirane razdelke priključimo z ukazom iz konzole ter vnosom LUKS gesla. Šifrirane razdelke lahko priklopimo tudi v okolju Windows, in sicer s pomočjo programa FreeOTFE, kar je podrobneje opisano v članku o šifriranju nosilcev podatkov v okolju Linux in Windows, poglavje "Uporaba LUKS šifriranih razdelkov v okolju Windows".
Ob nadgradnji jedra operacijskega sistema se lahko zgodi, da bo HAL (Hardware Abstraction Layer) zamenjal poimenovanja diskov iz hda v sda. V tem primeru je potrebno popraviti datoteko /etc/crypttab, do katere lahko dostopamo preko zagona starega jedra ali živega CDja.
Zaključek
Čeprav uporaba šifriranja celotnega operacijskega sistema še ni dovolj uporabniško prijazno integrirana v sistem, se premiki kažejo tudi na tem področju. Z nekaj truda je že danes mogoče vzpostaviti delujoč šifriran sistem. Izbira distribucije Ubuntu Linux (ki velja za eno najbolj uporabniško prijaznih) v kombinaciji z LUKS šifriranjem, daje takemu sistemu visoko stopnjo uporabnosti tudi pri vsakdanji namizni uporabi.
Ker ima uporaba šifriranja celotnega sistema zaradi čedalje pogostejše uporabe prenosnih računalnikov v poslovnih okoljih, pa tudi drugod, velik tržni potencial, lahko v prihodnosti pričakujemo razvoj tudi na tem področju. Tehnologija je že razvita, sledi le še razvoj na področju uporabniške prijaznosti.
Trajno brisanje podatkov
Opozorilo: Uporaba spodaj opisanih postopkov lahko privede do resne izgube podatkov ali do okvare sistema. Uporaba na lastno odgovornost. Dedek Mraz vam je prinesel nov računalnik in čas je, da se znebite starega. Ni problema, porečete in se s staro “škatlico” odpravite proti najbližjemu ...
Šifriranje nosilcev podatkov v okolju Linux in Windows
Cryptography is a data-protection technology just as gloves are a hand-protection technology. Cryptography protects data from hackers, corporate spies and con artists, whereas gloves protect hands from cuts, scrapes, heat, cold and infection. The former can frustrate FBI wiretapping, and the latter can ...
Uvod v Linux
Več dejavnikov je vplivalo na nastanek kratkega pregleda osnov Linuxa, ki ste ga pravkar položili pred oči, zato bi težko jedrnato povedal, zakaj sem se odločil, da ga napišem, je pa res, da so glavni razlogi za njegovo rojstvo samo trije, in sicer čedalje pogostejše ...
Intervju z Dustinom Kirklandom, glavnim razvijalcem sistemov za šifriranje v Ubuntuju
English version Dustin Kirkland je Ubuntu Core razvijalec, zaposlen pri podjetju Canonical. Preden je začel delati na razvoju Ubuntu serverja, je preživel 8 let pri IBM-u. Trenutno je osredotočen na razvoj Ubuntu Enterprise oblaka za prihajajočo različico Ubuntuja, 10.04 LTS, pred tem pa je delal na ...
Napadi na delovni pomnilnik
Delovni pomnilnik ali RAM (Random Access Memory) je del računalnika, v katerem se začasno shranjujejo podatki. Podatki v RAM pomnilniku naj bi se po izključitvi računalnika iz napajanja izgubili, vendar bomo v nadaljevanju videli, da to ne drži povsem. Poleg tim. "običajnega" delovnega pomnilnika, ...