Šifrování diskového oddílu pomocí dm-crypt+LUKS

(CentOS 6)

Cílem je vytvořit šifrovaný oddíl pro uchovávání záloh.


LUKS je standardem pro šifrování pevných disků v Linuxu. Zajišťuje kompatibilitu mezi linuxovými distribucemi a poskytuje dvouúrovňové šifrování, funkci pro posílení hesla i bezpečnou správu více uživatelských hesel/klíčů. LUKS ukládá všechna potřebná nastavení v hlavičce oddílu a umožňuje tak uživateli snadno kopírovat nebo migrovat data. Linuxová (referenční) implementace používá dm-crypt.

Výhody:
  • kompatibilita díky standardizaci
  • posílení hesla (PBKDF2) proti slovníkovým útokům
  • podpora více klíčů (8 slotů)
  • efektivní revokace hesla
  • je zdarma

Balíky a jejich instalace

RPM balíky: cryptsetup-luks  cryptsetup-luks-libs

 

Zjištění, zda jsou nainstalovány:

rpm -qa cryptsetup-luks*

 

Instalace balíků (minimální instalace CentOS 6 je neobsahuje):

yum install cryptsetup-luks cryptsetup-luks-libs

Příprava diskového oddílu

Před vytvořením šifrovaného oddílu je vhodné zaplnit oddíl náhodnými daty, aby potenciální útočník nemohl snadno obnovit původní data nebo určit bloky s šifrovaným obsahem. Zde jsou uvedeny 3 často používané způsoby:

 

Upozornění: V příkazech je použito zařízení /dev/sdf1. Písmeno disku a číslo oddílu je třeba nastavit dle potřeby.

 

a) Příkaz dd kopíruje na diskový oddíl náhodná data (/dev/urandom), ale generování dat je pomalé. Průměrný zápis byl 7.3 MB/s (procesor Intel Xeon X3440).

dd if=/dev/urandom of=/dev/sdf1 bs=1M

 

b) Příkaz badblocks provede kontrolu bloků diskového oddílu a zároveň do nich zapíše náhodná data. Operace probíhá výrazně rychleji cca 86 MB/s, ale náhodná data jsou primitivní a pro tento účel nejsou doporučována.

badblocks -c 10240 -t random -s -w -v /dev/sdf1

 

c) cryptsetup FAQ zmiňuje níže uvedenou proceduru, která funguje jako jednoduchý generátor pseudonáhodných čísel.

 

Popis: Inicializuje se dočasný šifrovaný oddíl, který je po otevření zaplněn a přepíše tak základní blokové zařízení náhodnými daty. Následně se přepíše LUKS hlavička a úložiště klíče (keyslot).

 

Inicializace dočasného šifrovaného oddílu:

cryptsetup luksFormat /dev/sdf1

 

Otevření šifrovaného resp. mapování dešifrovaného oddílu:

cryptsetup luksOpen /dev/sdf1 decrypted

 

Zaplnění dešifrovaného oddílu nulami (průměrný zápis 73.1 MB/s):

dd if=/dev/zero of=/dev/mapper/decrypted bs=1M

 

Odstranění namapovaného dešifrovaného oddílu:

cryptsetup luksClose /dev/mapper/decrypted

 

Přepsání LUKS hlavičky a "keyslotu".

Ve výchozím nastavení má hlavička s jedním "keyslotem" velikost 2048 KB (šifra aes-cbc-essiv:sha256 + 256-bitový klíč). Je doporučeno přepsat také první 4 KB zapsané pomocí dm-crypt, celkem tedy 2052 KB.

 

Ověření počtu bloků, které zabírá hlavička + keyslot příkazem luksDump viz hodnota Payload offset:

cryptsetup luksDump /dev/sdf1

 

Přepsání 4104 bloků oddílu sdf1 (4096 bloků = hlavička/keyslot, 8 bloků = první 4 KB zapsané pomocí dm-crypt):

dd if=/dev/urandom of=/dev/sdf1 bs=512 count=4104

Inicializace šifrovaného oddílu

Příkaz inicializuje LUKS oddíl a oproti výchozí konfiguraci nastavuje šifrovací mód XTS a dvojnásobnou délku klíče. Protože se jedná o finální oddíl určený pro naše data, je vhodné zadat silné heslo.

(parametry: -c  šifrovací algoritmus, mód a inicializační vektor, -s délka klíče, -y potvrzení hesla)

cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/sdf1

Otevření šifrovaného oddílu

Otevření šifrovaného resp. mapování dešifrovaného oddílu:

cryptsetup luksOpen /dev/sdf1 decrypted

Vytvoření a připojení souborového systému

Vytvoření souborového systému na dešifrovaném oddílu:

(parametr -m určuje kolik procent bloků bude rezervováno pro uživatele root)

mkfs.ext4 -m 0 /dev/mapper/decrypted

 

Vytvoření přípojného bodu (adresáře):

mkdir /mnt/decrypted

 

Připojení souborového systému dešifrovaného oddílu:

mount /dev/mapper/decrypted /mnt/decrypted

Ukončení práce s dešifrovaným oddílem

Nejprve odpojení souborového systému:

umount /mnt/decrypted

 

Odstranění namapovaného dešifrovaného oddílu:

cryptsetup luksClose /dev/mapper/decrypted

Operace s klíči

Přidání klíče (hesla):

Před zadáním nového hesla je vyžádáno některé z existujících hesel.

cryptsetup luksAddKey /dev/sdf1

 

Odstranění klíče (hesla):

cryptsetup luksRemoveKey /dev/sdf1

Klíčový soubor

Místo hesla lze použít jakýkoliv soubor. Ukázka vytvoření klíčového souboru s náhodnými daty o velikosti 2 KB:

dd if=/dev/urandom of=/root/luks-keyfile bs=1k count=2

 

Přidání klíče (klíčového souboru):

cryptsetup luksAddKey /dev/sdf1 /root/luks-keyfile

 

Odstranění klíče (klíčového souboru):

cryptsetup luksRemoveKey /dev/sdf1 /root/luks-keyfile

 

Otevření šifrovaného oddílu pomocí klíčového souboru:

cryptsetup --key-file /root/luks-keyfile luksOpen /dev/sdf1 decrypted