napsal něco o šifrovaní pod linuxem. Tady jsem to hodlal dát až to přepracuju, protože už v té době se luks chovat jinak v Ubuntu 18.04 než 16.04, ale když už se to řeší, dám sem aspoň tu starou verzi.
Jestli napsat tenhle příspěvek jsem se dlouho rozmýšlel, protože jej samozřejmě půjde použít i na krytí trestné činnosti. Ovšem krom mého případu, který mě k tomuto tématu prvotně přivedl, se teď objevila zpráva o člověku, který je stíhán za pouhé držení, což považuju omezování lidských svobod a diskriminaci.
V šifrovacím programu cryptsetup je dostupný algoritmus Argon2 optimalizovaný pro ztížení lámání hashe na grafických kartách, která tím, že dokáže využít velké množsví paměti, znemožnuje paralelního chodu více výpočetních vláken a zároveň se výpočet brzdí, prože je pořeba přistupovat k velkému množství dat v paměti. Návod je asi spíš pro pokročilé linuxáky.
Běžné použití lukse na vytvoření šifrovaného odílu sdx1. Netřeba snad připomínat že data která tam jsou se tímto zničí:
sudo cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/sdx1
Naformátuje tak oddíl sdx1 s šifrovacím algoritmem aes-xts-plain64, velikostí klíče 512 bitů. Program po nás pak bude chtít YES a 2x heslo.
Po vytvoření nového šifrovaného oddilu je potřeba v něm vytvořit souborový systém.
Šifrovaný oddíl odemkneme
sudo cryptsetup luksOpen /dev/sdx1 encrypted
a naformátujeme
sudo mkfs.ext4 /dev/mapper/encrypted. Pokud chceme, aby se formátovaní neprovádělo na pozadí, ale rovnou, tak
sudo mkfs.ext4 -E lazy_itable_init=0 /dev/mapper/encrypted.
Uzavření:
sudo cryptsetup luksClose encrypted
Když se podíváte na podrobnosti, jak je oblast sdx1 zašifrovaná:
sudo cryptsetup luksDump /dev/sdx1
Kód: Vybrat vše
LUKS header information for /dev/sdx1
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 512
MK digest: fa 21 62 bb 10 34 d6 0a 4c 7a a7 ad c7 c9 53 59 2e 14 42 26
MK salt: 72 ee ea 90 b0 db 85 1a e1 19 00 5b 67 3d f7 36
53 b1 00 1c 6d fa 01 1e 99 51 25 ac d7 3a b9 79
MK iterations: 105363
UUID: 207c414c-fbdd-4ea9-9b5c-862b9b75b4cb
Key Slot 0: ENABLED
Iterations: 1685812
Salt: 7c 12 67 9d f6 5c 67 5a 42 9d 7b 29 a0 ae a5 29
32 ca ff 56 4d f7 cf 8e c5 c9 c5 66 0e 94 43 76
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Zjistíme že je na zahashování hlesla je použitý sha256, na starších systémech se použíje i jen děravý sha1.
Pro použití maximální ochrany hashe hesla můžeme použít derivaci klíče Argon2id.
Postup komplikuje, že aby bylo použito sha512, je potřeba v několika krocích přešifrovat klíč.
Zašifrovaný oddíl, třeba podle příkladu výše, konvertujeme na sha512:
sudo cryptsetup-reencrypt /dev/sdx1 --keep-key --hash sha512
Nebo již takový vytvoříme:
sudo cryptsetup luksFormat /dev/sdx1 --cipher aes-xts-plain64 --key-size 512 --hash sha512
Dále zvedmene verzi lukse:
sudo cryptsetup convert /dev/sdx1 --type luks2
A teprve pak můžeme dát Argon2id:
sudo cryptsetup-reencrypt /dev/sdx1 --keep-key --hash sha512 --pbkdf argon2id --pbkdf-memory 4194304 --pbkdf-parallel 4 --iter-time 1000
Kde
--pbkdf-memory 4194304 znamená použít 4GB pamět pro dešifrování,
--pbkdf-parallel 4 čtyři výpočetní vlákna a
--iter-time 1000 pro čas dešifrování 1s. Pokud systém takovéto nároky nedokáže splnit (málo paměti nebo jader) použije se automaticky menší hodnota. Pro kontrolu použijeme
sudo cryptsetup luksDump /dev/sdx1:
Kód: Vybrat vše
LUKS header information
Version: 2
Epoch: 3
Metadata area: 12288 bytes
UUID: f72973f1-4faa-47ef-9e13-528a79407a17
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 2097152 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
PBKDF: argon2id
Time cost: 4
Memory: 4194304
Threads: 4
Salt: 9a a1 ab 1a f8 a1 d7 ad e2 7a 1e 7a 3b 1c 67 13
a1 47 4d 7f 20 d5 ce 4e 89 c0 1a 70 fc 45 43 00
AF stripes: 4000
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha512
Iterations: 133610
Salt: 82 23 d6 43 ac e6 7a c2 fd 4c f4 bc 27 97 f5 17
68 2c 3f 55 6a 4f 35 ed a0 d3 39 e4 e3 d5 d2 3d
Digest: c0 c6 8d 66 bb aa 6e a3 53 62
b3 51 a8 66 4a f2 8d d8 80 f8
Když je vše v pořádku, uvidíme ve výpisu:
Cipher: aes-xts-plain64, PBKDF: argon2id, Memory: 4194304, Threads: 4.
Pokud chceme takto mít zašifrovaný celý systém, což je ideální, provedeme standarní šifrovanou instalaci, ovšem ubuntu používá jen sha256. Povýšit šifrování tímto návodem lze i nainstalovaný šifrovaný systém, ovšem nejde to na spuštěném systému, tedy jedine přez live distribuci. I když se píše, že grub nepodporuje luks 2, mám vyskoušené, že s tím není problém od verze 18.04 ,i když je velký iter time.
Popíratelné šifrování
Úplně nejlepší je, aby ani nebylo zřejmé, že něco šifrované je. K tomu lze použí parametr --type plain :
sudo cryptsetup --type plain --cipher=aes-xts-plain64 --hash=sha512 --key-size=512 open /dev/sdx1 plain_crypt
Jelikož není nikde uložený žádný hash hesla, daný oddíl se rovnou otevře, a pokud je heslo špatné, budou na něm jen náhodná data. Samozřejmě - obdobně jako u minulého návodu - je po prvním otevření potřeba vytvořit souborový systém
sudo mkfs.ext4 /dev/mapper/plain_cryp . Pro dokonalejší zamaskování můžeme data schovat. To jde, pokud oddíl naformátujeme na nežurnálový typ souborového systému, kde nehrozí jejich kolize, tedy FAT nebo extFAT. Parametrem -offset=číslo se posunou šifrovaná data o násobky 512B za ostatní. Pokud se samozřejmě na maskovací souborový systém budou kopirovat další data, naše šifrovaná zasáhnou. Ovšem to má i výhodu v možnosti nenápadného zničení v případě potřeby.
Pokud by někdo nechtěl pro úschovu použít celý diskový oddíl, ale soubor, je možnost k tomu použít loop.
Uděláme si soubo o požadovené velikosti uložiště, třeba 10MB:
fallocate -l 10M nenapadnysoubor
Připojíme do loopu
sudo losetup /dev/loop0 nenapadnysoubor; pokud není loop0 volný, použijeme další číslo. Pak si můžemv tomto souboru udělat šifrovanou oblast
sudo cryptsetup --type plain --cipher=aes-xts-plain64 --hash=sha512 --key-size=512 open /dev/loop0 plain_crypt a vytvořit souborový systém viz výše.
Pro zavření pak kromě
sudo cryptsetup luksClose plain_crypt i
sudo losetup -d /dev/loop0 .
Pár dalšíchu příkazů
Změna hesla:
sudo cryptsetup luksChangeKey /dev/sdx1
Vytvoření souboru s náhodnýmy daty, pro maskování obsahu šiforvané oblasti:
dd if=/dev/urandom of=random.bin bs=4k
Před změnami šifrování se může hodit záloha hlavičky lukse:
sudo cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file lukshead.bin
A její obnova sudo cryptsetup
luksHeaderRestore /dev/sdx1 --header-backup-file lukshead.bin
Záloha steré hlavičky je ale po té potřeba bezpečně zničit:
sudo shred -u lukshead.bin
Jestli chce mít někdo námitky k používání šifrování, tak ať napíše přesnou definici toho co dětská pornografie je, a co už ne. Problém s tím mají i
Přidám aspoň přímý příkaz na to vytvoření šifrované oddílu s pomocí Argon2id a 512b hashi: