====== Chiffrer une partition système avec LUKS ======
[[https://www.ubuntu.com/|Ubuntu]] propose une installation avec LVM et chiffrée très pratique si vous n'avez qu'un disque, mais sur un de mes ordinateurs j'en ai deux (un HDD et un SSD) et je désire maîtriser le partitionnement afin de répartir les répertoires du système entre les deux disques. Comme je désire quand même avoir mes fichiers protégés par un chiffrement en cas de perte voici la méthode que j'ai utilisée.
**Avertissement** : Avec cette méthode la partition '/boot' ne sera pas chiffrée. Un attaquant avec un accès physique à la machine pourrait placer un [[wp>fr:Keylogger|Keylogger]] ou un [[wp>fr:Trojan|Trojan]] à ce niveau là (voir [[https://security.stackexchange.com/questions/166075/encrypting-the-boot-partition-in-a-linux-system-can-protect-from-an-evil-maid-a#tab-top|cette page]], [[https://theinvisiblethings.blogspot.com/2009/10/evil-maid-goes-after-truecrypt.html|cette page]] ou encore [[http://2010.rmll.info/IMG/pdf/06_denis_article-2.pdf|celle-ci]]).
Depuis l'introduction du nouvel installateur Subiquity, il existe un bug de reconnaissance des partitions LVM sur un disque chiffré avec LUKS qui empêche la méthode d'installation exposée ici. Au jour de la dernière édition de ce texte, le bug persiste toujours dans la version 24.10.
https://bugs.launchpad.net/subiquity/+bug/2058511
===== Démarrer sur une clé USB =====
La première étape est de démarrer sur une clé USB (réalisée avec [[https://unetbootin.github.io/|Unetbootin]]) qui contient l'image de la dernière version d'[[https://www.ubuntu.com/|Ubuntu]]. Je vous recommande de [[https://tutorials.ubuntu.com/tutorial/tutorial-how-to-verify-ubuntu|vérifier les signatures]] et la somme de contrôle du fichier téléchargé avec [[https://releases.ubuntu.com/22.10/SHA256SUMS|celle disponible sur le site]] d'origine.
openssl dgst -sha256 ubuntu-24.04-desktop-amd64.iso
Une fois le démarrage effectué sur la clé, la première chose à faire est de passer le clavier en français. Il faut aller dans Système -> Préférences -> Clavier puis cliquer sur l'onglet "Agencements" et ajouter "France" pour l'appliquer à l'ensemble du système.
===== Formater les disques =====
{{ :cryptographie:luks-gparted-sda.png?200|}}
Je désire garder une partie de l'espace libre sur le SSD et mettre dessus les éléments du système sauf les répertoires avec beaucoup d'écritures afin de préserver la longévité sur SSD :
*/tmp
*/var
* et la SWAP
Je lance GParted pour formater mon disque HDD '/dev/sda' et je choisis :
* 16 Gio pour la Swap
* et je formate le reste (ou je le laisse libre pour le formater pendant l'installation).
{{ :cryptographie:luks-gparted-sdc.png?200|}}
Puis sur le disque SSD '/dev/sdc' de 128 Giga je formate une petite moitié pour le système :
* 64 Mio pour la partition UEFI ;
* 48 Gio pour le système ;
* et je laisse le reste libre.
Si vous désirez installer un deuxième système juste après le premier vous devrez ajouter à la suite une deuxième partition sur ce disque, mais il est bon de laisser un peu d'espace libre sur un SSD.
Si vous préférez utiliser la totalité de l'espace du disque vous choisirez ce plan de formatage :
* 64 Mio pour la partition UEFI ;
* 96 Gio pour le système
* et je laisse le reste libre (environ 15%).
Pour la partition EFI, elle doit posséder les caractéristiques suivantes:
* avoir entre 35 Mo et 250Mo, mais une taille de 5 Mo est suffisante si vous n'installez pas Windows ;
* être de type FAT32 ;
* avoir le drapeau BOOT (ou ESP si cette option est présente dans GPARTED) ;
* et elle doit être située au début d'un disque partitionné en GPT.
Elle sera automatiquement reconnue par l'installateur d'Ubuntu, sinon il faudra lui attribuera le point de montage /boot/efi.
===== Chiffrement, volumes logiques et système de fichiers =====
Maintenant avant de d'installer le système, il faut chiffrer le disque HDD avec LUKS puis créer des partions logiques avec LVM. J'utilise les paramètres permettant le plus au niveau de chiffrement possible avec cette méthode, j'ai trouvé de bonnes informations sur [[https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encrypting_devices_with_cryptsetup|ce wiki]].
==== Chiffrement LUKS ====
{{ :cryptographie:luks-cryptsetup.png?200|}}Je lance un terminal et je tape les commandes :
=== Chiffrer avec LUKS 1 ===
sudo su
apt update && apt install lvm2 cryptsetup
modprobe dm-crypt
cryptsetup luksFormat -v -c aes-xts-plain64 -s 512 -h sha512 -i 5000 --use-random /dev/sda2
=== Chiffrer avec LUKS 2 ===
sudo su
apt update && apt install lvm2 cryptsetup
modprobe dm-crypt
cryptsetup --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha512 --integrity hmac-sha512 --pbkdf argon2i --pbkdf-parallel 4 --iter-time 16000 --pbkdf-memory 1048576 --use-urandom --label Ubuntu --subsystem "" --verify-passphrase --verbose luksFormat /dev/sda2
Avec cette commande le chiffrement prendra plusieurs heures.
=== Choix de la méthode de chiffrement ===
Le cipher ''aes-xts-plain64'' est la méthode de chiffrement par défaut depuis la version [[https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/v1.6/v1.6.0-ReleaseNotes|1.6.0]] de ''cryptsetup''.
Pour obtenir les performances des différents algorithmes il existe cette commande :
cryptsetup benchmark
# Tests approximatifs en utilisant uniquement la mémoire (pas de stockage E/S).
PBKDF2-sha1 1691251 itérations par seconde pour une clé de 256 bits
PBKDF2-sha256 2175468 itérations par seconde pour une clé de 256 bits
PBKDF2-sha512 1506574 itérations par seconde pour une clé de 256 bits
PBKDF2-ripemd160 893165 itérations par seconde pour une clé de 256 bits
PBKDF2-whirlpool 589087 itérations par seconde pour une clé de 256 bits
argon2i 7 itérations, 1048576 mémoire, 4 threads parallèles (CPUs) pour une clé de 256 bits (temps de 2000 ms demandé)
argon2id 7 itérations, 1048576 mémoire, 4 threads parallèles (CPUs) pour une clé de 256 bits (temps de 2000 ms demandé)
# Algorithme | Clé | Chiffrement | Déchiffrement
aes-cbc 128b 738,1 MiB/s 2994,0 MiB/s
serpent-cbc 128b 92,3 MiB/s 627,0 MiB/s
twofish-cbc 128b 193,1 MiB/s 392,9 MiB/s
aes-cbc 256b 550,9 MiB/s 2331,7 MiB/s
serpent-cbc 256b 97,4 MiB/s 626,1 MiB/s
twofish-cbc 256b 199,4 MiB/s 393,8 MiB/s
aes-xts 256b 1930,6 MiB/s 1932,2 MiB/s
serpent-xts 256b 619,5 MiB/s 604,3 MiB/s
twofish-xts 256b 388,0 MiB/s 388,8 MiB/s
aes-xts 512b 1599,8 MiB/s 1617,9 MiB/s
serpent-xts 512b 615,6 MiB/s 601,3 MiB/s
twofish-xts 512b 389,8 MiB/s 388,7 MiB/s
Ici ce sera le cipher ''aes-xts'' avec une clef de 256 bits qui sera le plus performant.
Pour connaître la différence entre CBC et XTS voir [[https://crypto.stackexchange.com/questions/5587/what-is-the-advantage-of-xts-over-cbc-mode-with-diffuser|cette page]].
Le chiffrement [[wp>fr:Advanced_Encryption_Standard|AES]] est recommandé par la NSA pour la protection des informations classifiées "SECRET" et "TOP SECRET" du gouvernement américain (lorsqu'il est utilisé avec une taille de clé de 192 ou 256 bits). Le [[wp>fr:Blowfish|Blowfish]] est un des premiers chiffrements sécurisés sans brevet qui est devenu public. Le [[wp>fr:Twofish|Twofish]] fut développé comme successeur de Blowfish, mais n'a pas atteint une utilisation aussi répandue. Enfin le [[wp>fr:Serpent_(cryptographie)|Serpent]] __est considéré comme le plus sûr__ des cinq finalistes du concours AES, voir [[https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development|ici]], [[https://www.cl.cam.ac.uk/~rja14/Papers/serpentcase.pdf|ici]] et [[https://www.cl.cam.ac.uk/~rja14/Papers/serpent.pdf|ici]].
==== Sauvegarder l'entête LUKS ====
Si l’entête [[wp>fr:LUKS|LUKS]] qui permet le déchiffrement est corrompu, toutes les données sont perdues, et ce même avec le mot de passe. Pour se préserver contre ce risque de corruption il faut sauvegarder cet entête avec la commande suivante :
cryptsetup luksHeaderBackup /dev/sda2 --header-backup-file /media/ubuntu/myusbkey/luksHeaderBackup-computer1-`date +"%Y%m%d"`.img
==== Volumes logiques ====
{{ :cryptographie:luks-lvm.png?200|}}Après le chiffrement de cette partition je la monte sous le nom 'Ubuntu' ; je l'initialise avec la commande 'pvcreate' ; puis je l'ajoute dans le groupe de volume avec pour nom 'ubuntuvg' avec 'vgcreate' ; et dedans j'ajoute plusieurs volumes logiques. Pour les deux premiers j'indique explicitement la taille des volumes et pour le dernier j'utilise la place restante.
cryptsetup luksOpen /dev/sda2 Ubuntu
pvcreate /dev/mapper/Ubuntu
vgcreate ubuntuvg /dev/mapper/Ubuntu
lvcreate -L 8182M -n tmp ubuntuvg
lvcreate -L 32768M -n var ubuntuvg
lvcreate -l 100%FREE -n home ubuntuvg
==== Système de fichiers ====
Enfin il faut créer les systèmes des fichiers.
mkfs.ext4 /dev/ubuntuvg/tmp
mkfs.ext4 /dev/ubuntuvg/var
mkfs.ext4 /dev/ubuntuvg/home
===== Installation du système =====
{{ :cryptographie:ubuntu-19-installation-format.png?200|}}
{{ :cryptographie:ubuntu-19-installation-type.png?200|}}
Je suis ensuite le processus classique pour l'installation d'[[https://www.ubuntu.com/|Ubuntu]], seule différence pendant la sélection des partitions à l'étape "Type d'installation" où je choisis l'option "Autre chose" afin de définir moi-même les 'points de montage'.
Il faut faire attention ici d'installer le programme de démarrage sur le disque SSD, là ou se trouvera la partition racine – et de /boot, ici sur l'image '/dev/sdc'.
Si [[wpfr>Ubiquity_(logiciel_d'installation)|Ubiquity]] (le logicel d'installation d'Ubuntu) produit des erreurs qui empêchent l'installation, veuillez cocher la case "Formater la partition:" dans la fenêtre "Modifier la partition" de l'écran "Type d'installation".
===== Après l'installation =====
Après l'installation et après avoir ouvert une session utilisateur il faut maintenant modifier le fichier ''/etc/crypttab'' de l'installation. Avant de modifier ce fichier il faut connaître l'identifiant unique (UUID) de la partition chiffrée, pour cela dans le terminal lancer la commande blkid :
sudo blkid
Le terminal va afficher l'ensemble des devices et leur UUID ; il faut rechercher celui qui concerne la partition chiffrée, ici /dev/sda2.
sudo nano /target/etc/crypttab
Ubiquity monte les partitions dans /target
Dans la fenêtre qui s'ouvre taper le nom de la partition chiffrée, ici 'Ubuntu' et coller l'UUID, et retirer les guillemets, taper 'none' puis 'luks' en séparant chaque information par une tabulation :
Ubuntu UUID=2ae(...)4d1 none luks
Si la partition est sur un disque SSD il faudra ajouter 'discard' après 'luks' séparé d'une virgule :
sda3-crypt UUID=2ae(...)4d1 none luks,discard
S'il est impossible de la faire après le redémarrage (pas de console root) il faudra booter sur la clef USB, monter le disque où le système fut installé (ici /dev/sdd) puis éditer le fichier '/etc/crypttab'.
Ensuite il faut modifier la configuration de Grub
sudo nano /etc/default/grub
en remplaçant :
GRUB_TIMEOUT_STYLE=hidden
par
GRUB_TIMEOUT_STYLE=menu
ou en commentant la ligne GRUB_HIDDEN_TIMEOUT pour les vieilles versions.
Ensuite il faut retirer la commande "quiet splash" sur la ligne GRUB_CMDLINE_LINUX_DEFAULT (bien laisser les guillemets). Cette commande sert à masquer les lignes de code du système au démarrage. Malheureusement cela provoque souvent un bug qui empêche alors de saisir le mot de passe pour déverrouiller la partition chiffrée.
Une fois le fichier '/etc/default/grub' modifié il faut lancer les commandes suivantes :
sudo update-initramfs -u
Si la commande se termine avec une erreur il faudra vérifier et modifier le fichier '/etc/crypttab' et l'UUID indiqué, sinon :
sudo update-grub
===== Références =====
*[[https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encrypting_devices_with_cryptsetup|dm-crypt/Device encryption]] ;
*[[https://doc.ubuntu-fr.org/cryptsetup|doc.ubuntu-fr.org/cryptsetup]] ;
*[[http://korben.info/comment-chiffrer-une-partition-systeme-linux-ici-ubuntu.html|Comment chiffrer une partition système Linux par Korben]] ;
* Pour [[https://wiki.crans.org/WikiNit/Notes/BootChiffr%C3%A9|chiffrer la partition boot]].