Dm-crypt, a adathordozónk teljes titkosítása

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Dm-crypt full disk encryption and the translation is 100% complete.
Other languages:
Resources

Ez a cikk több szempontot tárgyal a 'dm-crypt (teljes) lemez titkosítás használatával kapcsolatban. Elsősorban olyan kiegészítő információk forrásaként szolgál, amelyek még nem kerültek megvitatásra a dm-crypt, a genkernel vagy az initramfs wiki oldalakon.

Important
Minden további biztonsági stratégiák, amelyek ebben a cikkben kerülnek bemutatásra, opcionálisak. Néhány itt bemutatott szempont kizárólag azért kerül megemlítésre, mert gyakran kérdések tárgyát képezik, vagy erősen személyes biztonsági nézetekhez kapcsolódnak. Ennek a cikknek a célja tehát az, hogy - remélhetőleg - egy objektív megbeszélést nyújtson. A cryptsetup GYIK egy erősen ajánlott kiegészítő információforrás.

Melyik titkosító:hash kombináció?

A LUKS alapértelmezett titkosítója manapság aes-xts-plain64, vagyis a AES mint titkosító és XTS mint működési mód. Ez csak nagyon ritka esetekben szabad megváltoztatni. Az alapértelmezett beállítás biztonsági szempontból rendkívül észszerű választás, és teljesítmény szempontjából messze a legjobb választás, amely 2-3 GiB/s titkosítási/dekódolási sebességet képes elérni AES-NI-vel rendelkező CPU-kon.

Az AES-NI elérhetősége az alábbi módon ellenőrizhető:

user $grep -m1 'aes' /proc/cpuinfo

Az XTS két AES kulcsot használ, ezért a lehetséges kulcsméretek a következők: -s 256 és -s 512.

A titkosító és kulcsméret alapértelmezett választása felülírható a -c és -s parancssori paraméterekkel, például:

root #cryptsetup luksFormat -c aes-xts-plain64 -s 512 ...
root #cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 ...

Többet megtudhat a teljesítményről egy adott titkosító és működési mód esetében, ha lefuttat egy benchmarkot:

root #cryptsetup -c ... -s ... benchmark

A parancs kiadása -c és -s nélkül számos különböző választási lehetőségre futtatja a benchmark tesztet. Például, egy (enyhén rövidített) kimenet egy 2014 közepén készült Intel Core i7 CPU esetében így nézhet ki:

root #cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   256b   469.7 MiB/s  2093.2 MiB/s
 serpent-cbc   256b    85.3 MiB/s   523.3 MiB/s
 twofish-cbc   256b   173.4 MiB/s   340.2 MiB/s
     aes-xts   256b  2386.7 MiB/s  2387.4 MiB/s
 serpent-xts   256b   548.6 MiB/s   531.1 MiB/s
 twofish-xts   256b   320.0 MiB/s   342.3 MiB/s
Warning
A dm-crypt számos különböző titkosító, működési mód és IV mód kombinációját támogatja DMCrypt wiki. Néhány ezek közül nem olyan biztonságos, mint mások, míg néhányat rendkívül bizonytalannak tartanak (például ECB). További információért a kriptográfiai titkosítókról és működési módokról tekintse meg a Wikipédiát. Ha bizonytalan, akkor maradjon az alapértelmezett paramétereknél.
Note
További információ a cryptsetup luksFormat használatáról a dm-crypt wiki oldalon található.
Note
Néhány titkosító választása esetében van egy további hash specifikáció a titkosító:hash formában, például aes-cbc-essiv:sha256. Ilyen hash specifikációt bizonyos működési módok (mint például cbc-essiv) használnak IV generálásához. A plain64 működési módok azonban nem használnak ilyen hash specifikációt (IV generálásához). Ebben az esetben a hash specifikációt el kell hagyni.

Milyen hash választás alkalmas kulcsszármaztatáshoz?

A LUKS a PBKDF2-t használja a kulcsszármaztatásra. Lényegében a felhasználó által megadott jelszó egy sóval van kombinálva, és meghatározott számú körön keresztül van hashelve. Ez a kulcshosszabbítás biztonságosabbá teszi a jelszót brute force támadások ellen. A PBKDF2-ben használt hash függvény -h segítségével állítható be. Az alapértelmezés sha256, de (ízlés szerint) megváltoztatható egy másik biztonságos hash algoritmusra. Az iterációk teljes számát az aktuális hardver sebessége határozza meg, és befolyásolható azzal, hogy beállítjuk azt a milliszekundum számot, amelyet a PBKDF2 jelszófeldolgozással kell tölteni, --iter-time segítségével. Az alapértelmezettet például 2 másodpercről 3 másodpercre növelve és sha512 használatával a következőképpen járhatunk el:

root #cryptsetup luksFormat ... -h sha512 --iter-time 3000 ...
Warning
Nem ajánlott a PBKDF2 iterációk számát az alapértelmezett érték alá csökkenteni a upstream GYIK szerint.

Jelszavakról, a leválasztott LUKS fejlécekről és (titkosított) kulcsfájlokról

Használjon megfelelően hosszú jelszót (például 8-12 általános, véletlenszerű szót, tekintse meg a xkcd részt ebben a témában), PBKDF2 kulcshosszabbítással kombinálva.

További védelem érhető el brute force támadások ellen azáltal, hogy egy külső USB flash adathordozót állítunk be az alapvető dekódolási információk tárolására (mint például egy kulcsfájl vagy maga a LUKS fejléc). A flash meghajtó ekkor egy fizikai kulcs szerepét tölti be. A titkosított partíció megnyitása csak akkor lehetséges, ha mind a flash adathordozó, mind a jelszó rendelkezésre áll. Ez azonban jelentős hátrányokkal járhat a komplexitás tekintetében, például a teljes adathordozó-titkosítás beállításánál, vagy a dekódolási kulcsok elvesztésének kockázatával jár (ha az USB flash adathordozót elveszítjük).

Leválasztott LUKS fejléc

Lehetséges egy partíció titkosítása leválasztott LUKS fejléccel (ahol minden információ a jelszó származtatásáról tárolva van), amely fizikailag különböző helyen, például egy USB flash adathordozón van tárolva. Ez azt eredményezi, hogy egy támadónak, aki nem rendelkezik a flash adathordozóval, nincs információja a kulcsszármaztatásról és a használt titkosítási algoritmusokról. Ez potenciálisan megnehezíti a brute force támadásokat.

Az alábbi parancsok először létrehoznak egy 5 MB fix méretű luks-header fájlt. Ezután egy leválasztott LUKS fejléc kerül a fájlba írásra. (További információért a cryptsetup luksFormat vagy a cryptsetup open parancsok használatáról lásd a dm-crypt wiki oldalt.)

root #truncate -s 5M /path/to/luks-header
root #cryptsetup luksFormat ... --header /path/to/luks-header ...

Annak ellenőrzésére, hogy a fejléc sikeresen lett-e írva, futtassa a következő parancsot: cryptsetup luksDump /path/to/luks-header.

A letitkosított adathordozó megnyitásához adja ki a következő parancsot:

root #cryptsetup open ... --header /path/to/luks-header
Note
A leválasztott LUKS fejlécet jelenleg nem támogatja a genkernel.

GnuPG titkosított kulcsfájl generálása

A hagyományosabb megközelítés az USB pendrive használatára az, hogy egy GnuPG által titkosított kulcsfájlt (amely elegendő entrópiát tartalmaz) tárolunk rajta. Egy ilyen kulcsfájlt az genkernel könnyedén támogat.

A következő parancsok egy 512 bites GnuPG által titkosított kulcsfájlt hoznak létre, és egy titkosított partíciót állítanak be vele:

root #dd if=/dev/urandom count=64 | gpg --symmetric --cipher-algo aes --armor > /path/to/key.gpg
root #gpg --decrypt /path/to/key.gpg | cryptsetup luksFormat ...

Az eszköz feloldásához, amely titkosítva van,

root #gpg --decrypt /path/to/key.gpg | cryptsetup open ...
Note
Természetesen a dm-crypt működik nem titkosított kulcsfájlokkal is. Tekintse meg a dm-crypt wikioldalt. A nem titkosított kulcsfájlok használatát, amelyeket a gyökérpartíción vannak tárolva, a titkosított partíciók "láncszerű megnyitásához", az alábbiakban tárgyaljuk.

Adathordozók előkészítése

Warning
Különös óvintézkedéseket kell tenni, ha az ebben a szakaszban felvázolt stratégiát egy SSD esetében alkalmazzuk.

Néha ajánlott a teljes adathordozót véletlenszerű számokkal felülírni az adathordozó-titkosítás beállítása előtt. Ennek az ajánlásnak az indoka az, hogy a titkosított adathordozó olvasása a lehető legkevesebb információt szivárogtassa ki. Ha azonban a fájlrendszer által nem használt blokkok továbbra is mind nullák, akkor egy támadó némi magas szintű információt vissza tud nyerni azáltal, hogy meghatározza, mely (titkosítási) blokkok valószínűleg használatban vannak (mert véletlenszerűnek tűnő adatokat tartalmaznak), és melyek nem használatosak (mert például mind nullák). A valószínűleg használt titkosítási blokkok száma és helyzete olyan információkat fedhet fel, mint az adathódozónak a használata, a használt fájlrendszer vagy a valószínű átlagos fájlméret.

Ezért egy kissé hatékony (de időigényes) ellenintézkedés az adathordozó véletlenszerű adatokkal való felülírása használat előtt. Egy hatékony módszer nagy mennyiségű véletlenszerű adat gyors generálására egy cryptsetup leképezés használata. Például, a /dev/sdXX felülírásához használja a következőt:

root #cryptsetup open --type=plain --key-file=/dev/urandom /dev/sdXX delete_sdXX
root #dd if=/dev/zero of=/dev/mapper/delete_sdXX bs=1M status=progress
root #cryptsetup close delete_sdXX

Ezt követően formázza az adathordozót a cryptsetup luksFormat ... segítségével.

Warning
A teljes SSD véletlenszerű adatokkal történő felülírása minden blokkot használtként jelöl meg, és a gyártótól és modelltől függően jelentősen ronthatja az egyenletes kopáselosztást. Ennek potenciálisan katasztrofális hatása lehet az adathordozó élettartamára. Ennek enyhítéseként néha azt javasolják, hogy az adathordozó jelentős részét, körülbelül 10-20%-át hagyja szabadon, hogy elegendő üres blokk álljon rendelkezésre az egyenletes kopáselosztáshoz. Ez úgy érhető el, hogy megfelelő méretű, formázatlan partíciót hoz létre, és megfelelően elveti azt s blkdiscard használatával. Felhívjuk a figyelmet arra, hogy egy LUKS konténer --allow-discards opcióval történő csatlakoztatása átlátszó módon továbbítja az elvetéseket az SSD-nek, és ellentétes lenne a fent ismertetett beállítással.

Dm-crypt az SSD és hibrid adathordozókon

További információért a dm-crypt SSD-ken és hibrid meghajtókon való használatának biztonsági szempontjairól tekintse meg a cryptsetup GYIK oldalát.

A cryptsetup átlátható módon képes továbbítani a törlési műveleteket egy SSD adathordozóra. Ez a funkció a --allow-discards opció használatával aktiválható, együtt a cryptsetup open paranccsal. A törlési műveletek engedélyezése egy titkosított SSD adathordozón hatékony elhasználódás-kiegyenlítést és élettartamot biztosíthat, különösen akkor, ha az egész adathordozó titkosítva van. A biztonsági következmények részletes elemzéséhez tekintse meg a cryptsetup GYIK oldalát és a cryptsetup man súgóját.

Initramfs generálása

Az operációs rendszer vagy adahordozók titkosítása után szüksége lesz egy initramfs fájlra, hogy a rootfs-t abban lehessen csatolni, majd átadhassa az irányítást a valódi init-nek. Számos általános initramfs-készítő használható a feladat elvégzéséhez, például dracut, mkinitcpio (van egy fórum téma és egy ebuild: sys-kernel/mkinitramfs-ll) vagy akár genkernel (vagy annak következő változata), amely támogatja a LUKS-t.

Genkernel

A következő példa a sys-kernel/genkernel szoftvercsomagot használja arra, hogy csak egy initramfs fájlt hozzon létre (nem egy teljes kernelt), és engedélyezze a luks támogatást:

root #genkernel --luks --lvm initramfs

A teljesebb magyarázatért tekintse meg a megjegyzéseket közvetlenül a /etc/genkernel.conf fájlban, vagy a man genkernel kimenetét.

Az initrd paramétereket igényel ahhoz, hogy megmondja, hogyan kell a meghajtót dekódolni, és ezek ugyanúgy kerülnek megadásra, mint más kernelparaméterek. Például:

FILE grub.conf
title Gentoo Linux 3.4.0-gentoo
root (hd0,0)
kernel /boot/kernel-3.4.0-gentoo crypt_root=UUID=<encrypted partition uuid> root=/dev/mapper/root
initrd /boot/initramfs-3.4.0-gentoo
Note
A TRIM támogatás engedélyezhető, ha a titkosított eszköz képes rá (például SSD) a root_trim=yes beállítással, de először olvassa el a biztonsági következményeket, amelyeket a --allow-discards szakasz részletez a cryptsetup wiki oldalon.

További információ a genkernel cikkben található.

Dracut

A sys-kernel/dracut szoftvercsomagot a RedHat projektből portolták, és hasonló eszközként szolgál az initramfs létrehozásához. Néhány modulra szükség lehet. Kérjük, tekintse meg a dracut dokumentációt. Általában a következő parancs generál egy használható alapértelmezett initramfs fájlt.

root #dracut -a crypt

Az initrd paramétereket igényel ahhoz, hogy megmondja, hogyan kell a meghajtót dekódolni, és ezek ugyanúgy kerülnek megadásra, mint más kernelparaméterek. Például:

FILE grub.conf
title Gentoo Linux 3.4.0-gentoo
root (hd0,0)
kernel /boot/kernel-3.4.0-gentoo root=UUID=<root filesystem uuid> rd.luks.uuid=<encrypted partition uuid>
initrd /boot/initramfs-3.4.0-gentoo.img
Note
A Dracut képes nem teljes UUID-ket párosítani, amennyiben nem félreérthetőek, így lehetőség van csak az első szakasz megadására a kívánt rövidség/egyértelműség érdekében.
Note
A TRIM támogatás engedélyezhető, ha a titkosított eszköz képes rá (például SSD) az rd.luks.allow-discards beállítással, de először olvassa el a biztonsági következményeket, amelyeket a --allow-discards szakasz részletez a cryptsetup wiki oldalon.

A Dracutban található luks opciók teljes listájáért kérjük, tekintse meg a dracut kézikönyv megfelelő szakaszát.

Mkinitramfs-LL

A nem hivatalos sys-kernel/mkinitramfs-ll (megtalálható tokiclover's bar-overlay-ben) egy könnyű és moduláris változata a korábban ismert initramfs-készítő eszközöknek, amely udev-mentes függőséggel rendelkezik. Alapértelmezés szerint csak busybox-t használ mdev-vel, és további funkciókhoz extra szoftvercsomagoktól függ. Így sem bash, sem coreutils, sem util-linux nincs beépítve az initramfs fájlba. További rugalmasságokat is kínál, például lehetőséget DM-Crypt LUKS használatára LVM-en vagy fordítva, btrfs vagy ZFS DM-Crypt LUKS felett, DM-Crypt LUKS RAID felett, leválasztott fejlécet (egy eszközre vagy fájlra) dm-crypt LUKS-hoz stb.

root #mkinitramfs-ll --luks --lvm --firmware=iwlwifi-5000

Használja az alábbi GRUB2 beállításrészletet, hogy elinduljon LVM/LUKS és egy normál kulcsfájl eltávolítható eszközre történő beállításával kapcsolatban.

FILE /etc/default/grub
'"`UNIQ--pre-00000008-QINU`"'
Note
Van egy opcionális környezeti változó a beállításfájlban (mkinitramfs-ll.conf), amely beállítja az olyan környezeti változókat, amelyek ugyanazt a hatást fejtik ki, mint a kernel parancssori argumentumai, lehetővé téve a kernel cmdline nélküli bootolást. Ez az alapértelmezett cmdline (mint környezeti változók) azonban futás közben letiltható, ha szükséges, az env=No cmdline argumentum hozzáadásával.

További olvasnivaló a témában