FreeBSD telepítése titkosított fájlrendszerrel

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen Kamarás Roland (vitalap | szerkesztései) 2012. december 3., 23:40-kor történt szerkesztése után volt.

(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Í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 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):

  1. Boot kódot tartalmazó partíció (512 kB)
  2. /boot partíció, melyen titkosítatlan fájlrendszer található (512 MB)
  3. / partíció - titkosított root fájlrendszerrel (40 GB)
  4. Titkosított swap partíció (4 GB)
  5. Titkosított partíció (a gbde bemutatásához, a másik két titkosított partíció geli-vel van rejtjelezve) (1 GB)
  6. Windowsos rendszerpartíció (50 GB)
  7. 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:

  1. GPT partícionálási séma létrehozása
  2. Boot block (bootstrap kód) létrehozása
  3. Boot partíció és fájlrendszer létrehozása
  4. Rejtjelezett root partíció létrehozása és inicializálása
  5. Root partíción fájlrendszer létrehozása
  6. További partíciók létrehozása
  7. Az elkészült rejtjelezett gyökér fájlrendszer felcsatolása a /mnt könyvtárba
  8. 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.
  • 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:

  1. Válasszuk ki a konfigurálandó hálózati interfészt.
  2. IPv4-es címet állíthatunk be, melyet statikusan és dinamikusan (DHCP-vel) is megadhatunk.
  3. Ugyanezt IPv6-os címre is beállíthatjuk.
  4. 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.

Személyes eszközök