FreeBSD telepítése titkosított fájlrendszerrel
Írta: Kamarás Roland
Utolsó jelentős módosítás: 2012. december
A számítógépen tárolt adataink védelme érdekében számos, különböző biztonsági megoldást alkalmazhatunk, melyek a támadóról feltételezett képességek tekintetében nyújtanak eltérő hatásfokú, hatékonyságú és használhatóságú megoldásokat. A számítógép adathordozójának fájlrendszerén tárolt információk titkosítása az egyik ilyen lehetséges biztonsági óvintézkedés.
Tartalomjegyzék |
1 Bevezetés
A fájlrendszer adatainak, illetve magának a teljes fájlrendszernek a titkosítása egy lehetséges biztonsági megoldás, mely megnehezíti a támadónak az érzékeny adatainkhoz való hozzáférését, beleértve mind az adatok illetéktelen olvasását, illetve módosítását. Fontos azonban hangsúlyozni, hogy még a fájlrendszer rejtjelezése sem nyújthat minden támadási lehetőséget kizáró, teljes védelmet, hiszen ha a támadó valamilyen módon hozzájut a rejtjelezéshez használt titkos kulcshoz vagy a titkos kulcs alapját képező passphrase-hez, úgy triviálisan dekódolhatja a fájlrendszer tartalmát, ezzel megkerülve a védelmi megoldásunkat.
Ráadásul ezen kívül még számos mód van arra, hogy a támadó már eleve a dekódolt, felcsatlakoztatott partícióhoz férjen hozzá, tekintve például azt az egyszerű esetet, amikor magának az operációs rendszernek egy sebezhetőségét kihasználva valamilyen távoli kódfuttatást lehetővé tevő exploitot futtat és ezáltal szerez hozzáférést a futó rendszerhez, vagy például SSH-n keresztül jelentkezik be a gépre a tulajdonos felhasználó nevében (mert korábban megszerezte a user jelszavát), megkerülve ezzel a rejtjelezést.
Tehát itt is igaz az az alapelv, mely szerint egy rendszer biztonságát a rendszert alkotó leggyengébb láncszem biztonsága határozza meg. Ennek következtében ez a védelmi megoldás is alapvetően csak olyan típusú támadó ellen nyújt védelmet, mely támadó csak a dekódolatlan/felcsatolatlan partícióhoz képes hozzáférni és például más forrásból nem képes megszerezni a jelszót.
A következőkben egy esettanulmányt mutatok be - ismertetve a problémákat is, melyekkel szembesültem -, melynek során leírom, hogy miként lehet FreeBSD operációs rendszert installálni titkosított root partícióval. Az ismertetett megoldást korábban egy általam rendszeresen használt gépen valósítottam meg sikerrel (ez adta az ötletet a szócikk megírásához is).
Annak, hogy a választásom a FreeBSD-re esett, egyszerű okai vannak: korábban más Unix-szerű rendszereket használtam és ezzel is meg akartam ismerkedni. A feladatra a FreeBSD 9.0-RELEASE amd64-es verzióját használtam, mely szabadon letölthető a következő címről: http://www.freebsd.org/where.html, értelemszerűen a megfelelő architektúra és adathordozó formátum kiválasztását követően. A szócikk írásának időpontjában ez a verzió a legfrissebb FreeBSD kiadás.
Mivel egy notebookra installáltam a rendszert és meg akartam akadályozni annak lehetőségét, hogy ha valaki esetleg ellopná a gépemet, akkor hozzáférjen az adataimhoz, ezért döntöttem úgy, hogy titkosítást is alkalmazok. Az esettanulmányban a megoldásomat a FreeBSD által a titkosított fájlrendszerhez felkínált két eszközzel, a gbde-vel (GEOM Based Disk Encryption) és a geli (GEOM Encryption Layer Interface) használatával is bemutatom.
A GPT-s (GUID Partition Table) partícionálási sémára telepített FreeBSD mellé ugyanakkor akartam még telepíteni Windowst is (ugyanazon a diszken), a Windows azonban a desktop verzióknál csak a 64 bites Windows 7 és Vista esetén támogatja a GPT-t boot supporttal (http://en.wikipedia.org/wiki/GUID_Partition_Table), és akkor is csak UEFI-vel (Unified Extensible Firmware Interface). Mivel a notebookom alaplapja az UEFI-t nem támogatja (csak a hagyományos BIOS-t), ezért az egyetlen lehetőség a hybrid MBR névre keresztelt megoldás maradt, amellyel viszont sikerült megoldanom a problémát (történetesen telepíteni egy 64 bites Windows 7-et is).
Amennyiben például 2 diszk állt volna a rendelkezésemre, abban az esetben ez a probléma úgy is kiküszöbölhető lehetett volna, hogy az egyik diszken telepítem a FreeBSD-t GPT partícionálási séma szerint, a másikon pedig a Windowst a hagyományos MBR (Master Boot Record) típusú (szokták MSDOS partíciós táblaként is emlegetni) séma szerint.
Végezetül bemutatom, hogy hogyan lehet telepíteni és bekonfigurálni a FreeBSD-n a Grub 2-t, hogy ezáltal egy dual-bootos rendszerhez jussunk, amely a fenti megoldásokat ötvözi.
2 FreeBSD telepítése: kezdeti lépések
Ahogy már a bevezetőben említettem, a FreeBSD letölthető a http://www.freebsd.org/where.html címről indulva a megfelelő telepítő image kiválasztását követően, amely esetemben a FreeBSD-9.0-RELEASE-amd64-disc1.iso fájl volt.
Az imageről való betöltést és a boot opció választását követően betöltődik a kernel és az installer, amely felkínálja a telepítés lehetőségét menüvezérelt formában, illetve parancssorból végezve azt. Ezeken kívül kapunk egy "Live CD" opciót is, melynek során a rendszer telepítés nélkül is kipróbálható és használható a boot médiáról.
A "Welcome" menüben a telepítés megkezdéséhez:
- Válasszuk az "Install" opciót (ezzel ideiglenesen menüvezérelt telepítést indítunk)
- Válasszuk ki a billentyűzetkiosztást
- Állítsuk be a gép hosztnevét
- Válasszuk ki a szükséges opcionális rendszerkomponenseket, a választási lehetőségek a következők:
- doc: dokumentációk
- games: játék alkalmazások
- ports: Ports collection tree (a FreeBSD csomagkezelő alrendszere, illetve a csomagokat szervező könyvtárstruktúra, fa)
- src: a rendszer forráskódja
- Ezt követően a partícionálási szakaszhoz érkezünk, ahol lehetőségünk van előre megadott partícionálási sémát választani ("Guided" opció), illetve választhatunk a manuális menüvezérelt partícionálás ("Manual" opció), illetve a shellben történő partícionálás ("Shell" opció) között.
Mivel a titkosított fájlrendszerrel való telepítést csak a shellből tudjuk elvégezni, ezért az ennek megfelelő opciót kell választanunk.
A telepítés során GPT-s partíciós sémát választunk, mely a következő partíciókat fogja tartalmazni (zárójelben a partíciók méretei):
- Boot kódot tartalmazó partíció (512 kB)
- /boot partíció, melyen titkosítatlan fájlrendszer található (512 MB)
- / partíció - titkosított root fájlrendszerrel (40 GB)
- Titkosított swap partíció (4 GB)
- Titkosított partíció (a gbde bemutatásához, a másik két titkosított partíció geli-vel van rejtjelezve) (1 GB)
- Windowsos rendszerpartíció (50 GB)
- Fennmaradó szabad terület
A GPT-s partícionálási séma választása mellett szól a rugalmassága, valamint hogy a FreeBSD 9.0-ás verziójában már ez az alapértelmezett séma.
A fenti felsorolásból látható, hogy a rendszerbetöltőnek (bootloader) külön partíciót kell biztosítanunk (ez fogja tartalmazni a boot kódot), melynek mérete célszerűen legyen minimum 64 kB, de ne legyen nagyobb, mint 512 kB.
A /boot partíció titkosítására nincs lehetőségünk, hiszen ez fogja tartalmazni egyrészt a FreeBSD kernelbetöltőjének (loader) konfigurációs állományát (loader.conf), amelyben leírjuk a titkosított fájlrendszerrel kapcsolatos beállításokat, másrészt a későbbi Grub 2 multiboot rendszerbetöltő konfigurációs állományait is.
A root fájlrendszer, valamint a swap partíció viszont titkosítva lesz; a swap cserehelynek itt is célszerű a memóriának megfelelő méretű partíciót allokálni. Ezeket követi végül a Windows rendszerpartíciója.
Természetesen a fent leírtaktól eltérő partícionálási sémát is létrehozhatunk, készíthetünk például külön partíciót a /var, a /tmp és a /usr könyvtárban lévő adatok számára is eltérő mount opciókkal (akár a biztonság növelése érdekében).
A titkosított root fájlrendszer, valamint a többi partíció létrehozását a következő lépésekre oszthatjuk:
- GPT partícionálási séma létrehozása
- Boot block (bootstrap kód) létrehozása
- Boot partíció és fájlrendszer létrehozása
- Rejtjelezett root partíció létrehozása és inicializálása
- Root partíción fájlrendszer létrehozása
- További partíciók létrehozása
- Az elkészült rejtjelezett gyökér fájlrendszer felcsatolása az /mnt könyvtárba
- A telepítés folytatása
A telepítés során az "ada0" nevű diszket használjuk, amely a /dev/ada0 helyen érhető el.
3 Titkosítás geli-vel
Elsőként a gpart nevű program segítségével távolítsuk el a GPT vagy MBR partíciós táblát, amennyiben az létezik:
# gpart destroy -F /dev/ada0
ada0 destroyed
#
Majd hozzunk létre új GPT partíciós táblát a következő paranccsal:
# gpart create -s gpt /dev/ada0
ada0 created
#
Ezt követően hozzuk létre a boot kódot tartalmazó partíciót:
# gpart add -t freebsd-boot -s 512k -l bootcode /dev/ada0
ada0p1 added
#
- A "-t" kapcsolóval a partíció típusát, a "-s" kapcsolóval a méretét, míg a "-l"-lel a címkéjét adhatjuk meg.
Másoljuk rá a boot kódot az imént létrehozott partícióra:
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 /dev/ada0
bootcode written to ada0
#
- A "-p", illetve "-i" kapcsolókkal adható meg, hogy mely partícióra kerüljön a bootstrap kód (esetünkben a 1-es az első partíciót jelenti). A GPT részét képező protective MBR-t, mint célt, a "-b" kapcsoló után adhatjuk meg.
Hozzuk létre a /boot partíciót és rajta az UFS2 (ez a FreeBSD alapértelmezett fájlrendszere) fájlrendszert a "newfs" paranccsal:
# gpart add -t freebsd-ufs -s 512M -l boot /dev/ada0
ada0p2 added
#
# newfs -U -O2 -j /dev/gpt/boot
/dev/gpt/boot: 512.0MB (1048576 sectors) block size 32768, fragment size 4096
using 4 cylinder groups of 128.03MB, 4097 blks, 8320 inodes.
with soft updates
super-block backups (for fsck -b #) at:
192, 262400, 524608, 786816
Using inode 4 in cg 0 for 4194304 byte journal
newfs: soft updates journaling set
#
- A "-U" kapcsoló engedélyezi a "soft updates" mechamizmust, vagyis azt a lehetőséget, amely során nem írjuk ki azonnal a módosításokat az adathordozóra, hanem megadott ideig cache-eljük azokat. Ennek előnye, hogy növeli a teljesítményt különösen új fájlok létrehozása, illetve meglévők törlése esetén, ugyanakkor veszélyt is rejt magában.
- Ugyan a "soft updates" biztosítja a fájlok konzisztenciáját arra az esetre, ha a rendszerünk összeomlana, ugyanakkor jelentős idő (akár több másodperc is) telhet el azelőtt, mielőtt a változtatások fizikailag is kiíródnak a diszkre.
- Ezért rendszerösszeomláskor rosszabb esetben adatokat is veszíthetünk. Másrészt a megoldás késlelteti a fájlrendszer blokkjainak felszabadítását, ezért az is előfordulhat, hogy nem teljesen teli fájlrendszer esetén sem tudunk már új szabad területet lefoglalni.
- A "-O2" kapcsolóval adhatjuk meg az UFS2 fájlrendszert (ez az alapértelmezett egyébként).
- A "-j" opció lehetővé teszi a "soft update"-ek naplózását.
- Amint az látszik is, a partícióra már a címkéjével hivatkoztunk.
Ezt követően hozzuk létre a rejtjelezett partíciót, majd inicializáljuk azt a geli programmal:
# gpart add -t freebsd-ufs -s 40G -l encroot /dev/ada0
ada0p3 added
#
# mount /dev/gpt/boot /mnt
#
# dd if=/dev/random of=/mnt/encroot.key bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes transferred in 0.000897 secs (4566685 bytes/sec)
#
# kldload geom_eli
cryptosoft0: <software crypto> on motherboard
#
# geli init -b -v -B /mnt/ada0p3.eli -a HMAC/SHA512 -e AES-CBC -l 256 -s 4096 -K /mnt/encroot.key /dev/gpt/encroot
Enter new passphrase:
Reenter new passphrase:
Calculating number of iterations...
...
#
# geli attach -k /mnt/encroot.key /dev/gpt/encroot
Enter passphrase:
GEOM_ELI: Device gpt/encroot.eli created.
GEOM_ELI: Encryption: AES-CBC 256
GEOM_ELI: Integrity: HMAC/SHA512
GEOM_ELI: Crypto: software
#
- Vagyis előbb a gpart programmal létrehoztuk a root partíciót, a partíció típusának "freebsd-ufs"-t kell megadni. A partíció címkéje pedig "encroot" lesz. Szükséges még generálnunk a rejtjelezéshez kulcsot is, ehhez előbb felcsatoltuk a "boot" címkéjű partíciónkat, majd azon a dd programmal létrehoztunk egy 4096 byte-os kulcsot.
- Betöltöttük a geli-hez szükséges kernelmodult, majd a geli programmal inicializáltuk a partíciót, vagyis megadtuk a titkosítás paramétereit. A "-b" kapcsoló esetén a rendszer a passphrase-t boot során kérdezi meg (a root fájlrendszer felcsatolása előtt), a "-v" kapcsolóval "beszédes" kimenetet kapunk, a "-B" kapcsolóval adhatjuk meg a partíció backup fájlját.
- A backup fájlból való visszaállítás a "geli restore" paranccsal lehetséges, melynek meg kell adnunk egyrészt a backup fájlt, másrészt a partíciót reprezentáló device-t.
- A "-a" kapcsolóval engedélyezhetjük az adatok integritásvédelmét, authentikációját. A kapcsoló után kell megadni az alkalmazott algoritmust. A megoldás csökkenti a partíción rendelkezésre álló szabad területet és csökkenti az olvasási/írási sebességet is. Az authentikációra HMAC/SHA512-őt alkalmazunk.
- A "-e" opcióval adhatjuk meg a rejtjelezéshez használt algoritmust és egyben a rejtjelezési módot is. Az alapértelmezett algoritmus egyébként az AES.
- A "-l" kapcsolóval adhatjuk meg a titkosító algoritmus kulcsának hosszát, a "-s" kapcsolóval pedig a rejtjelező blokkméretét. A "-K" kapcsoló után adható(k) meg a titkosító kulcsának generálásához felhasznált állományok. Ez a mi esetünkben a korábban generált 4096 byte-os kulcs lesz.
- Végül meg kell adnunk a későbbi dekódoláshoz szükséges passphrase-t.
A támogatott hitelesítési és titkosítási algoritmusokról a következő oldalról tájékozódhatunk: http://www.freebsd.org/cgi/man.cgi?query=geli&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&arch=default&format=html
A példánkban alkalmazott algoritmusok a megadott paraméterekkel jelenlegi ismereteink szerint kellően biztonságosnak, erősnek mondhatók.
Fontos megjegyezni, hogy a geli nem fájlrendszert hoz létre a partíción, csupán egy providert, egy interfészt biztosít, amelyen keresztül hozzáférhetünk a partíción lévő tetszőleges titkosított adatainkhoz. Ahhoz, hogy a provideren keresztül használhassuk a partíciót és rajta a tényleges fájlrendszert, a providert "el kell indítanunk", csatlakoztatnunk kell. Ezt teszi lehetővé a "geli attach" parancs, melynek meg kell adnunk a kulcsot tartalmazó fájlt, valamint a fizikai partíciót, majd bekéri a korábban megadott passphrase-t. Innentől kezdve a geli által létrehozott logikai partíción keresztül érhetjük el az eredetit, mely partíció a /dev/gpt/encroot.eli helyen érhető el.
A provider lecsatolására a "geli detach" parancs szolgál, értelemszerűen a logikai device megadásával.
Miután a rejtjelezett partíciót létrehoztuk és inicializáltuk, hozzuk létre rajta a tényleges fájlrendszert is, amely ebben az esetben is UFS2 lesz:
# umount /mnt
# newfs -U -O2 -j /dev/gpt/encroot.eli
...
#
Ezt követően mountoljuk fel a még "teljesen üres" (metaadatokat nyilván tartalmazó) titkosított fájlrendszerünket:
# mount /dev/gpt/encroot.eli /mnt
#
Majd hozzunk létre rajta egy "bootdir" nevű könyvtárat (lehet más is a neve):
# mkdir /mnt/bootdir
#
Ebbe a könyvtárba (az /mnt-n belül mi most a leendő titkosított root partíciónkat látjuk) mountoljuk fel a 2. partíciót, vagyis ami a végleges rendszer /boot könyvtárába csatolódik majd fel:
# mount /dev/gpt/boot /mnt/bootdir
#
Amennyiben a "Welcome" menüben már eleve a shellben történő telepítést választottuk, úgy most az /mnt könyvtárba (vagyis a későbbi gyökérbe) telepítsük az alaprendszert, a kernelt, a ports collection-t, valamint a forrásokat:
(Ez nem jelent mást, mint a telepítőn előre elkészített csomagok kitömörítését.)
# cd /mnt
# unxz -c /usr/freebsd-dist/base.txz | tar xvpf -
# unxz -c /usr/freebsd-dist/kernel.txz | tar xvpf -
# unxz -c /usr/freebsd-dist/src.txz | tar xvpf -
# unxz -c /usr/freebsd-dist/ports.txz | tar xvpf -
#
Ezeken kívül a /usr/freebsd-dist/ könyvtárban még két tömörített állomány található: a doc.txz, illetve a games.txz.
Ezeket is hasonlóan lehetne kicsomagolni. Fontos, hogy a base.txz és a kernel.txz mindenképpen szükségesek a rendszer működéséhez, azokat muszáj telepíteni. A másik 4 csomag telepítése opcionális.
Amennyiben a "Welcome" menüben ideiglenesen a menüvezérelt telepítést választottuk ("Install" opció), úgy korábban már meg kellett adnunk a telepíteni kívánt opcionális csomagokat és ott pontosan az itt felsorolt 4 csomagot ajánlotta fel a rendszer. A base.txz, illetve a kernel.txz csomagok ott nem voltak felsorolva, mivel nem opcionálisak, azokat ahogy említettük, mindenképpen telepíteni kell egy működő rendszerhez (de ez nyilvánvaló is).
Ennek megfelelően tehát vagy a menüben válasszunk az opcionális csomagok közül és akkor már nem kell "kézzel" kicsomagolnunk az állományokat, vagy eleve a shellben végezzük el a telepítést és a kicsomagolásokat. Esetünkben az előbbi lehetőséggel éltünk.
- A fenti parancsok lefuttatásának eredményeként létrejön az /mnt könyvtárban a szokásos Unix-os könyvtárszerkezet.
Mivel mi a menüvezérelt esetet választottuk, lépjünk ki a shellből az "exit" paranccsal és hagyjuk, hogy az installer dolgozzon helyettünk.
- Amikor a telepítő ezzel végzett, adjuk meg a root felhasználó jelszavát.
- Ezt követően lehetőségünk van a hálózati beállítások megadására, ehhez:
- Válasszuk ki a konfigurálandó hálózati interfészt.
- IPv4-es címet állíthatunk be, melyet statikusan és dinamikusan (DHCP-vel) is megadhatunk.
- Ugyanezt IPv6-os címre is beállíthatjuk.
- Megadhatjuk a DNS resolver konfigurációját is értelemszerűen.
- Beállíthatjuk az UTC szerinti időt.
- Adjuk meg az időzónát.
- Ezt követően beállíthatjuk a rendszer bootolásakor automatikusan elinduló szolgáltatásokat, a következő választási lehetőségek vannak:
- sshd: Secure SHell daemon
- moused: PS/2 egérkurzor a konzolon
- ntpd: hálózati időszinkronizáció
- powerd: CPU frekvenciát dinamikusan állítja a nagyobb energiahatékonyság érdekében
- Engedélyezhetjük a crash dumpokat. Előnye, hogy segítségével fény derülhet a rendszerösszeomlás okára, hátránya, hogy a /var könyvtárban nagyobb területet is elfoglalhat.
- További felhasználókat adhatunk a rendszerhez, ehhez a következő információkat kell megadni:
- felhasználónév
- teljes név
- UID (User ID) (vagy default)
- login group
- kiegészítő csoporttagság
- login class (vagy default)
- shell
- home könyvtár
- home könyvtár jogosultságok (vagy default)
- jelszó alapú hitelesítés (igen/nem)
- üres jelszó engedélyezése (igen/nem)
- random jelszó használata (igen/nem)
- saját jelszó megadása
- fiók zárolása (igen/nem)
- további felhasználó hozzáadása (igen/nem)
- Az ez után megjelenő menüben válasszuk az "Exit" menüpontot, majd fogadjuk el az új shell megnyitását, ahol elvégezhetjük a további feladatokat.
Ezt követően a boot könyvtárat mozgassuk a bootdir könyvtárunkba (vagyis a boot címkéjű partícióra):
# mv boot bootdir/
#
Ezzel a boot könyvtár a helyére került (a boot partícióra); az nem jelent problémát, hogy valójában a bootdir könyvtáron belül található. Az egyetlen probléma, hogy nekünk ennek a boot könyvtárnak a tartalmát a gyökér fájlrendszerből is boot néven kellene tudnunk elérni közvetlenül, de ezt a problémát egy egyszerű szimbolikus link megoldja:
# ln -s bootdir/boot boot
#
Mozgassuk át a titkosított fájlrendszer backup fájlját, valamint a kulcsot tartalmazó fájlt a boot könyvtárba:
# cd /bootdir
# mv ada0p3.eli boot
# mv encroot.key boot
#
Miután nagyjából minden a helyére került, hozzuk létre a swap partíciónkat is. Egy probléma azonban adódik, az installer lefuttatott közben egy "chroot /mnt" parancsot, ezért most gyökérnek a korábbi /mnt könyvtárat látjuk, a /dev-ben pedig nincsenek elemek. A probléma megoldása lehet például az, hogy korábban már létrehoztuk a swapet, vagy majd a rendszer elindítását követően hozzuk létre.
Feltételezzük az utóbbi esetet.
Hozzuk létre a /boot/loader.conf állományt, hogy a loader betöltse a dekódoláshoz szükséges modulokat. Tehát adjuk meg a következőket:
vfs.root.mountfrom=”ufs:/dev/ada0p3.eli”
aesni_load=”YES”
geom_eli_load=”YES”
geli_ada0p3_keyfile0_load=”YES”
geli_ada0p3_keyfile0_type=”ada0p3:geli_keyfile0″
geli_ada0p3_keyfile0_name=”/boot/encroot.key”
Adjuk hozzá a /etc/fstab fájlhoz a következő sorokat, hogy automatikusan felcsatolódjanak a szükséges kötetek:
# Device Mountpoint FStype Options Dump Pass #
/dev/gpt/boot /bootdir ufs rw,noatime 1 1
/dev/gpt/encroot.eli / ufs rw,noatime 0 0
Ezután "exit"-eljünk és a megjelenő menüben válasszuk a "Reboot" lehetőséget.
A boot során a rendszer kérni fogja a dekódoláshoz szükséges passphrase-t, adjuk meg.
Végül jelentkezzünk be a root felhasználóval.
4 A telepítés befejezése
Adósak vagyunk még a swap partíció létrehozásával és rajta a titkosítás beállításával. Hozzuk létre a swapet a következő paranccsal:
# gpart add -t freebsd-swap -s 4G -l swap /dev/ada0
ada0p4 added
#
- Látható, hogy a típusnak "freebsd-swap"-et kell megadni.
A swap titkosításához (egyszer használatos kulccsal) vegyük fel a következő sort a /etc/rc.conf fájlba:
geli_swap_flags=”-e AES-CBC -l 256 -s 4096 -d”
- A kapcsolók jelentését már ismerjük, a "-d" pedig automatikus provider lecsatlakoztatást jelent a partíció umountolásakor.
A /etc/fstab fájlba is vegyük fel a swapet a következő sor hozzáadásával:
/dev/gpt/swap.eli none swap sw 0 0
Indítsuk újra a gépet, majd ellenőrizzük a swap titkosításának működését:
# swapinfo
Device 1K-blocks Used Avail Capacity
/dev/gpt/swap.eli 4194304 0 4194304 0%
Megjegyzések:
- Amennyiben már korábban létrehoztuk a swapet és arra már kikerülhettek érzékeny adatok, majd csak ezután rejtjelezzük a fájlrendszert, akkor célszerű lehet a biztonság fokozása érdekében a lapozóterületet felülírni random adattal még a rejtjelezés előtt:
# dd if=/dev/random of=/dev/gpt/swap bs=1M
#
- A boot partíciót létrehozhatjuk akár egy USB sticken is, így annak hiányában már a rendszert sem lehet elindítani, illetve nem áll rendelkezésre a kulcsot tartalmazó fájl.
Ezzel elkészült a partíciókiosztásunk a FreeBSD számára, melyet meg is nézhetünk a következő paranccsal:
# gpart show
=> 34 20971453 ada0 GPT (10G)
34 1024 1 freebsd-boot (512k)
1058 1048576 2 freebsd-ufs (512M)
1049634 4194304 3 freebsd-ufs (2.0G)
5243938 8388608 4 freebsd-swap (4.0G)
13632546 7338941 - free - (3.5G)
- Látható, hogy a gyökérpartíció csak 2 GB méretű, ez azért van, mert egy virtuális gépen újra végigpróbáltam a lépéseket és nem akartam 40 GB-os partíciót fölöslegesen létrehozni.
A gpart-ról és a newfs-ről további információkat a "man gpart", illetve "man newfs" paranccsal kaphatunk.
Ezzel végeztünk a FreeBSD telepítésével.
5 Titkosítás gbde-vel
A következőkben egy új rejtjelezett partíció létrehozását nézzük meg a gbde-vel. Ehhez root jogosultságok szükségesek.
Elsőként töltsük be a szükséges kernel modult:
# kldload geom_bde
#
Hozzunk létre egy új partíciót a célra:
# gpart add -t freebsd-ufs -s 1G -l gbde /dev/ada0
ada0p5 added
#
Hozzuk létre a gbde lock fájlok számára szükséges könyvtárat:
# mkdir /etc/gbde
#
Minden rejtjelezett partíció számára külön lock fájl fog létrejönni ebben a könyvtárban. A lock fájlok pedig a gbde számára szükségesek, ugyanis az innen tudja kiolvasni a dekódoláshoz szükséges információkat. A lock fájloknak a helyes működés érdekében ".lock" kiterjesztésűeknek kell lenniük.
Inicializáljuk a gbde partíciónkat:
# gbde init /dev/gpt/gbde -i -L /etc/gbde/ada0p5.lock
- A "-L" kapcsoló után adhatjuk meg a lock fájlt, a "-i" kapcsoló pedig az interaktív módot jelenti, ahol egy template fájlt kapunk és beállíthatjuk a szükséges paramétereket.
A parancs tehát megnyit egy editort, ahol a leendő UFS2 fájlrendszerhez állítsuk be a szektorméretet 2048-ra:
sector_size = 2048
Majd adjuk meg a passphrase-t.
Csatlakoztassuk a titkosított partíciót, majd adjuk meg az imént beállított jelszót:
# gbde attach /dev/gpt/gbde -l /etc/gbde/ada0p5.lock
Enter passphrase:
#
- A "-l" itt is a lock fájlt jelenti.
A titkosított partíció itt is egy logikai eszközt jelent, amely a /dev/gpt/gbde.bde helyen érhető el.
Hozzuk létre a partíción a fájlrendszert, majd mountoljuk fel például az /mnt-be:
# newfs -U -O2 /dev/gpt/gbde.bde
...
# mount /dev/gpt/gbde.bde /mnt
#
Ha minden sikeres volt, akkor a "df -H" parancs kimenetén látszania kell egy "/dev/gpt/gbde.bde" kezdetű sornak is, ahol a "Mounted on" oszlopban a "/mnt" felirat szerepel.
A felcsatolt provider a "gbde detach /dev/gpt/gbde" paranccsal választható le.
6 Swap titkosítása gbde-vel
Említést érdemel még a lapozóterület titkosítása gbde-vel, amihez csupán annyit kell tennünk, hogy a /etc/fstab fájlban a swap partíció sorában a swaphez tartozó device neve mögé ".gbde" utótagot írunk, valahogy így:
/dev/gpt/swap.bde none swap sw 0 0
A működés ellenőrzése itt is a "swapinfo" paranccsal lehetséges.
7 A geli és a gbde közötti különbségek
- A geli automatikusan használja a rendelkezésre álló kriptográfiai hardvert.
- A geli több kriptográfiai algoritmust is támogat, míg a gbde csak a 128 bites AES-t CBC (Cipher Block Chaining) módban.
- A geli lehetővé teszi titkosított root partíció létrehozását, a passphrase-t a boot során bekérve.
- A geli két független kulcs használatát is lehetővé teszi.
- A gbde minden szektort külön AES kulccsal rejtjelez.
- A geli lehetővé teszi a mester kulcs visszaállítását a backupból.
- A geli lehetővé teszi a partíció felcsatlakoztatását egy random egyszer használatos kulccsal, amely hasznos például swap partíció esetén.
8 Lehetséges hibaüzenetek, problémák
- A "geli attach" során a következőhöz hasonló hibaüzenteket kapunk:
Enter passphrase:
GEOM_ELI: Device gpt/encroot.eli created.
GEOM_ELI: Encryption: AES-CBC 256
GEOM_ELI: Integrity: HMAC/SHA512
GEOM_ELI: Crypto: software
GEOM_ELI: gpt/encroot.eli: 4096 bytes corrupted at offset 4096.
GEOM_ELI: gpt/encroot.eli: 4096 bytes corrupted at offset 0.
...
- Ráadásul így a newfs-sel sem tudunk a partíción fájlrendszert létrehozni, ugyanis a következő hibaüzenetet kapjuk:
newfs: can't read old UFS1 superblock: read error from block device: Invalid argument
Megoldás:
Ezt a hibaüzenetet - a FreeBSD levelezési listáiról gyűjtött információk szerint - valószínűleg azért kapjuk, mert az újonnan létrehozott geli device bizonyos szektorai még tartalmaznak olyan adatokat, amelyek a geli initet megelőzően kerültek oda. Emiatt ezekhez az adatokhoz nem a megfelelő MAC (Message Authentication Code) tartozik a szektoron belül, a newfs pedig ezekből az inicializálatlan szektorokból is próbál olvasni. Ez viszont MAC verifikációs hibát okoz, amely egyúttal olvasási hibához is vezet.
A problémát a legegyszerűbben úgy orvosolhatjuk, hogy a "geli attach"-et követően a dd programmal felülírjuk az eszköz összes szektorát, hogy azokba a megfelelő MAC-ek kerüljenek (frissítjük a MAC-eket). Ehhez tehát random adattal írjuk tele az eszközt (pontosabban a partíciót), amely annak méretétől függően hosszabb ideig (több tíz GB esetén már akár órákig) is eltarthat.
Ehhez például a következő parancsot használhatjuk:
# dd if=/dev/random of=/dev/gpt/encroot.eli bs=1M
...
Az ezt követő detach, majd újbóli attach során már nem kapunk hibaüzenetet és a fájlrendszer is létrehozható.
- Egy másik probléma lehet, hogy a rendszer bootolásakor bekért jelmondatot rosszul adjuk meg, de mivel az nem kerül kiírásra, nem tudjuk, hogy pontosan mit is írtunk be. A jelmondat echozását ideiglenesen be lehet kapcsolni a következő sor felvételével a /boot/loader.conf állományba (természetesen később újból kapcsoljuk ki):
kern.geom.eli.visible_passphrase=1
- Zavaró tényező lehet az is, hogy a jelmondat bekérésekor további üzenetek jelennek meg a képernyőn. Ez természetesen nem befolyásolja a beírt jelszót.
9 A Hybrid MBR
Ahogy korábban említettük, a célunk az lenne, hogy a FreeBSD mellé Windowst is telepíthessünk, a GPT-t azonban a Windows nem támogatja abban a formában, ahogy arra nekünk szükségünk lenne. Ezért az egyetlen megoldás a hybrid MBR alkalmazása. A megoldás lényege, hogy a GPT részét képező protective MBR-t kihasználjuk és abban elhelyezünk érvényes partíciós bejegyzéseket. A GPT-ben a protective MBR-re azért van szükség, hogy a GPT-t nem ismerő rendszerek is legalább a PMBR-t felismerjék benne. A PMBR-ben pedig olyan információ van elhelyezve, amely úgy mutatja a diszket a GPT-t nem ismerő rendszerek felé, mintha azon nem állna rendelkezésre szabad hely, így ezek az operációs rendszerek, illetve eszközök legalább nem írják felül a GPT-s partíciós sémánkat abban a hitben, hogy a lemez nem tartalmaz semmi értelmes dolgot.
Ha viszont a GPT-s partíciónk kezdőcímét beírjuk a PMBR-be, akkor a GPT-t nem ismerő rendszer a PMBR-en keresztül mégis látni fogja a neki szánt partíciót, így megoldva a problémát (ezt nevezzük hybrid MBR-nek). A többi partícióról viszont továbbra sem lesz tudomása.
Ehhez a megoldáshoz először telepítsük a gdisk programot a következő paranccsal:
# pkg_add -r gdisk
...
#
Majd a gdisk segítségével hozzuk létre a Windowsnak szánt partíciót, ehhez használjuk a "gdisk /dev/ada0" parancsot. A "Command" sorban a "p" paranccsal listázhatjuk ki az eszköz partíciós tábláját.
Az "n" paranccsal hozhatunk létre új partíciót. Adjuk meg a partíció sorszámát, ez esetünkben 6 lesz, majd a méretét, amely a példánkban +50G. A partíció hexadecimális kódjának adjunk meg "0700"-át, amely a Windowsos partíciót jelöli. A "w" paranccsal a lemezre írhatók a változtatások, de előtte a rendszer a biztonság kedvéért mégegyszer rákérdez. A művelet sikerességéről a program értesít.
A lemez partíciós táblájába való íráshoz szükséges azt külön engedélyezni a következő paranccsal:
# sysctl kern.geom.debugflags=16
Ezt követően nincs más dolgunk, mint módosítani a PMBR-t. Ehhez válasszuk a "recovery/transformation" menüpontot az "r" paranccsal. A partíciók sorszámait itt is kiírattathatjuk a "p" paranccsal. A hybrid MBR létrehozását a "h" paranccsal kezdeményezhetjük. Összesen 3 partíciót tehetünk a hybrid MBR-be, ezeknek a sorszámait kell szóközökkel elválasztva sorrendhelyesen felsorolni. A mi esetünkben egyetlen sorszámot, a 6-ost kell megadni. Ezt követően a "Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? (Y/N):" kérdésre válaszoljunk "y"-nal.
Korábban említettük, hogy a GPT-t nem ismerő rendszerek a PMBR miatt a lemezt úgy látják, mintha azon nem volna szabad hely. Ez igazából azért van, mert ez a speciális partíció típus (0xEE, vagyis EFI GPT) van elhelyezve a PMBR-ben a teljes adathordozót lefedő méret bejegyzéssel. Most azt csináltuk, hogy ennek a méretét az általunk megadott Windows partícióig korlátoztuk, így a Windows partíció előtti valamennyi partíció továbbra is védve lesz, ugyanakkor bekerült második bejegyzésként a Windowsos partíció kezdete is a maga méretével, így azt a Windows látni fogja. Amennyiben a Windowsos (vagyis általában a hybridizált) partíció után is vannak még partíciók, azok egy újabb 0xEE típusú bejegyzéssel védhetők (feltéve, hogy nem használtuk még ki a PMBR-ben rendelkezésre álló, összesen 4 bejegyzést).
Ezt követően a korábban felsorolt hybridizálandó partíciókhoz kell megadni a típuskódot, valamint beállítani a "bootable" flaget. Ez esetünkben a "07" típuskód megadását jelenti, valamint a "Set the bootable flag? (Y/N):" kérdésre "y"-nal válaszolunk. A "Unused partition space(s) found. Use one to protect more partitions? (Y/N):" kérdésre válaszoljunk "n"-nel. A beállítások az "o" paranccsal nézhetők meg. Ezt követően a "w" paranccsal kiírhatók a változtatások a diszkre.
A változtatások elmentése nélküli kilépésre a "q" parancs szolgál.
Innentől kezdve a Windows telepítőjének fel kell ismernie a neki szánt partíciót, melyet kiválasztva és NTFS fájlrendszerre formázva telepíthető a rendszer.
A hybrid MBR előnye, hogy segítségével a GPT-t nem ismerő operációs rendszerek is telepíthetők GPT partíciós sémára, hátránya, hogy nem szabványos megoldás, a különböző operációs rendszerek és toolok eltérő módon kezelhetik. Hybrid MBR-ben logikai partíciók nem hozhatók létre. A hybrid MBR kezelése új partíciók létrehozása, új rendszerek hozzáadása esetén kellő körültekintést igényel.
10 Dual-boot megvalósítása a Grub 2-vel
Utolsó lépésként telepítsük a Grub 2 névre hallgató rendszerbetöltőt, majd konfiguráljuk be, hogy segítségével bootolható legyen mind a FreeBSD, mind pedig a Windows 7.
Ehhez telepítsük a grub2 csomagot:
# pkg_add -r grub2
#
Hozzuk létre a szükséges könyvtárstruktúrát:
# cd /boot
# mkdir grub
# cd grub
# touch grub.cfg
A grub.cfg fájlba vegyük fel a következő bejegyzéseket:
set timeout=15
set default="0"
menuentry "FreeBSD 9.0 amd64" {
insmod ufs2
set root='(hd0,2)'
kfreebsd /boot/loader
}
menuentry "Windows 7 x64" {
insmod ntfs
set root='(hd0,6)'
chainloader +1
}
#
- Amint látható, az eszközazonosító 0-tól, a partíció pedig 1-től kezdve sorszámozódik.
Másoljuk a helyére a grub fájljait:
# cp -Rf /usr/local/lib/grub/i386-pc /boot/grub
#
A grub MBR-be írásához most is futtatnunk kell a következő parancsot:
# sysctl kern.geom.debugflags = 16
#
Nem maradt más hátra, mint installálni a grubot a diszk elejére a GPT-s modullal:
# grub-install --modules=part_gpt /dev/ada0
Installation finished. No error reported.
#
Ha a fenti üzenetet kapjuk, akkor az írás sikeresen lezajlott.
Ha mindent jól csináltunk, a következő újraindításnál már a Grub 2 fog betöltődni. Ezzel el is készült a dual-bootos rendszerünk.
11 Konklúzió
Összefoglalásként elmondhatjuk, hogy a fájlrendszer titkosítása hatékony megoldás lehet adataink védelme érdekében. Ugyanakkor nem szabad arról sem megfeledkeznünk, hogy ez sem nyújt biztos megoldást, hiszem csak olyan támadások ellen véd, ahol a támadó a felcsatolatlan eszközhöz férhet csak hozzá. Mivel a boot partíciót nem titkosíthatjuk, az is egy lehetséges támadási felületet jelent. Ugyanakkor a boot partíció külső eszközre való kihelyezésével lehetővé válik a kétfaktoros felhasználó hitelesítés. Az alkalmazott titkosító és authentikációs algoritmustól függően a rendszer teljesítménye csökkenhet, így a cél mindig az optimum megtalálása a biztonság és a hatékonyság között.