A FreeBSD kitűnő futásközbeni védelmet ajánl fel az adatok illetéktelen hozzáférése ellen. Az állományok engedélyei és a kötelező hozzáférés-vezérlés (Mandatory Access Control, MAC, lásd 16 fejezet) segítenek megvédeni érzékeny adatainkat az illéktelenek ellen az operációs rendszer futása és a számítógép működése során. Azonban az operációs rendszerben kezelt engedélyek teljesen hatástalanok abban az esetben, ha a támadó fizikailag is képes hozzáférni a számítógépünkhöz, eltávolítani a merevlemezt és egy másik operációs rendszer segítségével kielemezni a rajta található fontos adatainkat.
Függetlenül attól, hogy a támadó valójában miként is férkőzött hozzá a merevlemezünkhöz, vagy miként kapcsolta le a számítógépünket, a FreeBSD megtalálható GEOM alapú lemeztitkosítás (gbde) és a geli titkosítási alrendszer egyaránt képes védelmet nyújtani a számítógépen található állományrendszerek számára az értékes adatok után kutató igen motivált betörők ellen. A csupán egyes állományokra kiterjedő körmönfont titkosítási módszerekkel szemben a gbde és a geli az egész állományrendszert észrevétlen módon titkosítja. Titkosítatlan adat nem is kerül a merevlemezre.
Váljunk root felhasználóvá
A gbde beállításához rendszeradminisztrátori jogosultságokra lesz szükségünk.
% su - Password:
Adjuk hozzá a gbde(4) támogatását a rendszermag konfigurációs állományához
Tegyük a következő sort a rendszermag beállításait tartalmazó állományba:
options GEOM_BDE
Fordítsuk újra a rendszermagot a 8 fejezetben leírtak szerint.
Indítsuk el a számítógépet az új rendszermaggal.
A rendszermag újrafordítása helyett a kldload paranccsal is betölthetjük a gbde(4) modulját:
# kldload geom_bde
A következő példa azt feltételezi, hogy a rendszerünkhöz egy új merevlemezt adunk hozzá, amin egyetlen titkosított partíció foglal helyet. Ezt a partíciót a /private könyvtárba fogjuk csatlakoztatni. A gbde használható a /home és a /var/mail titkosítására is, de ennek megvalósítása olyan bonyolult utasításokat igényel, amelyek meghaladják ennek a bevezetésnek a kereteit.
Az új merevlemez hozzáadása
A 18.3 Szakaszban bemutatottak szerint adjuk hozzá a rendszerünkhöz az új merevlemezt. A példában az új lemez partícióját a /dev/ad4s1c néven fogjuk tudni elérni. A /dev/ad0s1* eszközök a példában szereplő FreeBSD rendszer szabványos partícióit jelölik.
# ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4
Hozzunk létre egy könyvtárat a gbde zárolásainak tárolásához
# mkdir /etc/gbde
A gbdenek azért van szüksége a zárolásokat rögzítő állományokra, hogy hozzá tudjon férni a titkosított partíciókhoz. Amennyiben ezt nem tudja megtenni, a gbde anélkül nem lesz képes visszafejteni a titkosított partíciókon tárolt adatokat, hogy az ezeket elérni akaró szoftvereknek ne kelljen jelentősebb mértékben manuálisan beavatkoznia. Mindegyik titkosított partíció külön zároló állományt használ.
A gbde partíció inicializálása
A gbde által használt partíciókat használatuk előtt inicializálni kell. Ezt a műveletet azonban csak egyszer kell elvégezni:
# gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
A gbde(8) ekkor elindít egy szövegszerkesztőt és benne egy sablon segítségével be tudjuk állítani a különböző konfigurációs értékeket. Az UFS1 vagy UFS2 használata esetén állítsuk a szektorméretet 2048-ra:
$FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $ # # Sector size is the smallest unit of data which can be read or written. # Making it too small decreases performance and decreases available space. # Making it too large may prevent filesystems from working. 512 is the # minimum and always safe. For UFS, use the fragment size # sector_size = 2048 [...]
A megjegyzés fordítása:
A szektorméret az adatok írásának és olvasásának legkisebb egysége. Ha túlságosan kicsire választjuk meg, akkor csökken a teljesítmény és csökken a rendelkezésre álló hely. Ha viszont túlságosan nagyra hagyjuk, akkor azzal akadályozzuk az állományrendszerek munkáját. 512 a legkisebb érték, amely mindig megbízható. Az UFS esetén használjuk a fragmensek méretét.
A gbde(8) kétszer is rá fog kérdeni az adatok titkosítására használt jelmondatra. A jelmondatnak természetesen mind a kétszer ugyanannak kell lennie. A gbde védelmének hatékonysága teljesen mértékben az általunk választott jelmondat minőségétől függ [1].
A gbde init parancs létrehoz egy zároló állományt a gbde partícióhoz, amely ebben a példában az /etc/gbde/ad4s1c.lock néven keletkezett. A gbde zároló állományainak “.lock” névre kell végződniük, mivel az /etc/rc.d/gbde indítószkript csak ebben az esetben észleli rendesen.
Figyelem: A gbde zároló állományait a titkosított partíciók tartalmával együtt kell lementeni. Miközben a zároló állomány törlése nem tudja megakadályozni, hogy az elszánt támadó visszafejtse a gbde által titkosított partíciót, addig a zároló állomány nélkül a jogos tulajdonos órási mennyiségű munka befektetése nélkül képtelen lesz hozzáférni a rajta levő adatokhoz. Ez utóbbitól egyébként a gbde(8) és a rendszer tervezője is totálisan elhatárolja magát.
A titkosított partíció illesztése a rendszermaghoz
# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
Ekkor a titkosított partíció illesztéséhez a rendszer kérni fogja az inicializálás során választott jelmondatot. Ezután az új titkosított eszköz megjelenik a /dev könyvtárban /dev/eszköznév.bde néven:
# ls /dev/ad* /dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1 /dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c /dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde
Állományrendszer kialakítása egy titkosított eszközön
Ahogy sikerült a titkosított eszközt
illeszteni a rendszermaghoz, létre is tudunk hozni
egy állományrendszert rajta. Erre a
célra a newfs(8) remekül
használható. Mivel egy új UFS2
állományrendszerek
inicializálása sokkal gyorsabb a régi
UFS1 állományrendszerek
inicializálásánál, ezért
a newfs(8) használata esetén az
-O2
beállítás
megadása ajánlott.
# newfs -U -O2 /dev/ad4s1c.bde
Megjegyzés: A newfs(8) parancsot egy illesztett gbde partíción kell végrehajtani, amit onnan ismerhetünk meg, hogy az eszköz nevében szerepel a *.bde kiterjesztés.
A titkosított partíció csatlakoztatása
Hozzunk létre egy csatlakozási pontot a titkosított állományrendszer számára.
# mkdir /privát
Csatlakoztassuk a titkosított állományrendszert.
# mount /dev/ad4s1c.bde /privát
Ellenőrizzük a titkosított állományrendszer működőképességét
A titkosított állományrendszert most már látja a df(1) program és készen áll a használatra.
% df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 1037M 72M 883M 8% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 8.1G 55K 7.5G 0% /home /dev/ad0s1e 1037M 1.1M 953M 0% /tmp /dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr /dev/ad4s1c.bde 150G 4.1K 138G 0% /private
A rendszer minden egyes indítása után az összes titkosított állományrendszert tényleges használata előtt újra illeszteni kell a rendszermaghoz, ellenőrizni az épségét és csatlakoztatni. Az ehhez szükséges parancsokat root felhasználóként kell kiadni.
A gbde partíció illesztése a rendszermaghoz
# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock
A gbde partíció inicializálása során megadott jelmondatot kell megadnunk a művelet elvégzéséhez.
Az állományrendszer épségének ellenőrzése
Mivel a titkosított állományrendszerek az automatikus csatlakoztatáshoz még nem szerepeltethetőek az /etc/fstab állományban, ezért az ilyen állományrendszereket csatlakoztatásuk előtt manuálisan ellenőriztetni kell a fsck(8) lefuttatásával.
# fsck -p -t ffs /dev/ad4s1c.bde
A titkosított állományrendszer csatlakoztatása
# mount /dev/ad4s1c.bde /privát
A titkosított állományrendszer most már készen áll a használatra.
Lehet írni olyan szkriptet, amely a titkosított partíciókat magától illeszti, ellenőrzi és csatlakoztatja, de biztonsági megfontolásokból semmi esetben sem szabad tartalmaznia a gbde(8) jelszavát. Ehelyett azt javasoljuk, hogy az ilyen szkripteknek külön meg kelljen adni a jelszót konzolon vagy az ssh(1) használatán keresztül.
De használhatjuk a mellékelt rc.d szkriptet is. A szkript paramétereit az rc.conf(5) állományon keresztül adhatjuk meg, például:
gbde_autoattach_all="YES" gbde_devices="ad4s1c" gbde_lockdir="/etc/gbde"
Ilyenkor a gbde által használt jelmondatot a rendszer indításakor kell megadni. Miután begépeltük a megfelelő jelmondatot, a titkosított gbde partíció magától csatlakoztatásra kerül. Ez akkor lehet hasznos, ha a gbde megoldását hordozható számítógépeken alkalmazzuk.
A gbde(8) a szektorok tartalmát 128 bites AES használatával CBC módban titkosítja. A lemezen található minden egyes szektort eltérő AES kulccsal kódolja. A gbde kriptográfiai felépítését, valamint mindazt, hogy az egyes szektorok kulcsai miként származtathatóak a felhasználó által megadott jelmondatból, a gbde(4) man oldalán olvashatjuk.
A sysinstall(8) nem kompatibilis a gbde által titkosított eszközökkel. A sysinstall(8) indítása előtt minden *.bde eszközt ki kell iktatni a rendszermagból, különben az eszközök keresése során össze fog omlani. A példánkban használt titkosított eszközt a következő paranccsal kell lekapcsolni:
# gbde detach /dev/ad4s1c
Továbbá megjegyezzük azt is, hogy a vinum(4) nem használja a geom(4) alrendszert, ezért a gbde alkalmazása során nem használhatunk Vinum-köteteket.
A FreeBSD 6.0 változatától kezdve egy
új kriptográfiai GEOM osztály is a
rendelkezésünkre áll, melyet pillanatnyilag
Pawel Jakub Dawidek <pjd@FreeBSD.org>
fejleszt. A geli segédprogram
némileg különböző a
gbde megoldásától
— más lehetőségeket kínál
fel és a titkosítást is egy
eltérő séma mentén
valósítja meg.
A geli(8) legfontosabb jellemzői a következők:
A crypto(9) keretrendszerét használja — tehát ha rendelkezünk kriptográfiai hardverrel, akkor a geli automatikusan használni fogja.
Több kriptográfiai algoritmust is ismer (melyek jelenleg az AES, Blowfish és a 3DES).
Segítségével a rendszerindításhoz használt (gyökér) partíció is titkosítható. Ilyenkor a szükséges jelmondatot a rendszer indításakor kell megadni.
Két független kulcsot (például egy “kulcsot” és egy “céges kulcsot”) is használhatunk vele.
A geli gyors — egyszerűen csak szektorról szektorra titkosít.
Lehetővé teszi a mesterkulcsok mentését is visszaállítását. Ha a felhasználó véletlenül megsemmisítené a kulcsát, akkor a biztonsági mentésből helyreállított kulcsok segítségével vissza tudjuk szerezni az adatainkat is.
Segítségével a lemezeket véletlenszerű, egyszeri jelszavakkal is illeszthetjük — ez különösen fontos lapozóterületek és ideiglenes állományrendszerek esetében.
A geli által felkínált lehetőségekről a geli(8) man oldalán találhatunk többet.
A következő lépések bemutatják, hogyan lehet a FreeBSD rendszermagjában engedélyezni a geli támogatását, és hogyan lehet létrehozni és használni egy geli titkosítással rendelkező adathordozót.
A geli alkalmazásához legalább a FreeBSD 6.0-RELEASE vagy későbbi változatára van szükségünk. Mivel a rendszermagot is módosítanunk kell, ezért rendszeradminisztrátori jogosultságok kellenek a műveletek elvégzéséhez.
A geli támogatásának hozzáadása a rendszermaghoz
Vegyük hozzá a következő sorokat a rendszermag beállításait tartalmazó állományhoz:
options GEOM_ELI device crypto
Fordítsuk újra a rendszermagot a 8 fejezetben leírtak szerint.
Betölthetjük a geli modulját is a rendszer indításakor. Ehhez a következő sort kell betenni a /boot/loader.conf állományba:
geom_eli_load="YES"
A geli(8) most már használható a rendszermagban.
A mesterkulcs legenerálása
A most következő példában egy kulcsot tartalmazó állomány létrehozását illusztráljuk, amit a /privát könyvtárba csatlakoztatott titkosított adathordozó mesterkulcsához fogunk használni. A kulcs állomány a mesterkulcs titkosításához felhasznált véletlenszerű adatot fogja tartalmazni, valamint rajta kívül még a mesterkulcsot egy jelmondattal is védjük. Az adathordozó szektormérete 4 kilobyte-os lesz. Emellett még bemutatjuk, hogyan kell illeszteni egy geli-adathordozót, állományrendszert létrehozni rajta, csatlakoztatni, dolgozni vele és lekapcsolni.
A nagyobb teljesítmény érdekében javasolt nagyobb szektorméretet választani (mint például 4 kilobyte).
A mesterkulcsot egy jelmondattal fogjuk védeni és a kulcsok készítéséhez használt adatforrás a /dev/random lesz. A /dev/da2.eli, amelyet mit csak adathordozónak fogunk csak hívni, szektorainak mérete 4 kilobyte lesz.
# dd if=/dev/random of=/root/da2.key bs=64 count=1 # geli init -s 4096 -K /root/da2.key /dev/da2 Enter new passphrase: Reenter new passphrase:
Nem kötelező egyszerre használni a jelmondatot és a kulcs állományt. A mesterkulcs elzárásának bebiztosítására bármelyik módszer alkalmas.
Ha a kulcs állomány a “-” paraméterrel adjuk meg, akkor a szabványos bemenetről olvassa be a program. Ez a példa több kulcs használatát mutatja be.
# cat kulcs1 kulcs2 kulcs3 | geli init -K - /dev/da2
Az adathordozó illesztése a generált kulccsal
# geli attach -k /root/da2.key /dev/da2 Enter passphrase:
Az új titkosítatlan eszköz neve /dev/da2.eli lesz.
# ls /dev/da2* /dev/da2 /dev/da2.eli
Az új állományrendszer kialakítása
# dd if=/dev/random of=/dev/da2.eli bs=1m # newfs /dev/da2.eli # mount /dev/da2.eli /privát
A titkosított állományrendszer most már df(1) számára is látszik és használható:
# df -H Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 248M 89M 139M 38% / /devfs 1.0K 1.0K 0B 100% /dev /dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr /dev/ad0s1d 989M 1.5M 909M 0% /tmp /dev/ad0s1e 3.9G 1.3G 2.3G 35% /var /dev/da2.eli 150G 4.1K 138G 0% /private
Az adathordozó leválasztása és lekapcsolása
Miután befejeztük a munkát a titkosított partíción, és a /privát partícióra már nincs tovább szükségünk, érdemes leválasztanunk és kiiktatnunk a geli titkosítású partíciót a rendszermagból.
# umount /privát # geli detach da2.eli
A geli(8) használatáról bővebben a saját man oldalán tájékozódhatunk.
A geli mellett találhatunk egy saját rc.d szkriptet, amely jelentősen leegyszerűsíti a geli használatát. A geli például így paraméterezhető az rc.conf(5) állományon keresztül:
geli_devices="da2" geli_da2_flags="-p -k /root/da2.key"
Ennek segítségével a
/dev/da2 eszközt
geli adathordozóként
állítjuk be a /root/da2.key
állományban található mesterkulcs
felhasználásával, de az
illesztéskor a geli nem kér
jelmondatot (ezt csak akkor fogja tenni, ha a geli
init parancs kiadásához
hozzátesszük a -P
beállítást). A rendszer
leállítása előtt pedig a
geli adathordozó így
automatikusan leválasztásra kerül.
Az rc.d beállításával kapcsolatos tudnivalókat a kézikönyv rc.d szkriptekről szóló szakaszában ismerhetjük meg.
[1] | A könnyen megjegyezhető ám mégis biztonságos jelmondatok megválasztásához a Diceware Passphrase honlapján találunk egy kis segítséget (angolul). |
Ha kérdése van a FreeBSD-vel kapcsolatban, a következő
címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése,
kérjük erre a címre írjon: <gabor@FreeBSD.org>.