18.16. A lemezpartíciók titkosítása

Írta: Lucky Green.

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.

18.16.1. A lemez titkosítása a gbde használatával

  1. Váljunk root felhasználóvá

    A gbde beállításához rendszeradminisztrátori jogosultságokra lesz szükségünk.

    % su -
    Password:
  2. 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.

  3. A rendszermag újrafordítása helyett a kldload paranccsal is betölthetjük a gbde(4) modulját:

    # kldload geom_bde

18.16.1.1. A titkosított merevlemez előkészítése

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.

  1. 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
  2. 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.

  3. 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.

  4. 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
  5. Á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.

  6. 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
  7. 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

18.16.1.2. Létező titkosított állományrendszerek csatlakoztatása

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.

  1. 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.

  2. 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
  3. 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.

18.16.1.2.1. A titkosított partíciók önálló csatlakoztatása

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.

18.16.1.3. A gbde által alkalmazott titkosítási módszerek

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.

18.16.1.4. Kompatibilitási problémák

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.

18.16.2. A lemezek titkosítása a geli használatával

Írta: Daniel Gerzo.

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 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 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.

  1. 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.

  2. 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
  3. 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
  4. 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
  5. 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.

18.16.2.1. A geli rc.d szkriptjének használata

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.

Megjegyzések

[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>.