Chiffrement amélioré d’un système Linux avec LUKS

Comment chiffrer ses données sous Linux?

L’objectif est d’avoir un système d’exploitation Linux avec la plus de sécurité possible en cas de vol de disque dur, par exemple…

J’ai ainsi décidé de recompiler les informations, et de les traduire en français, car il y a plusieurs sites/blog qui traitent du sujet, mais souvent un point est passé rapidement, ou une ligne est manquante, rendant difficile l’aboutissement. Voici donc un tutoriel pour effectuer l’installation d’un système Linux (Debian 8 Jessie dans mon cas), avec la solution de chiffrement LUKS (skywalker :p ) implémentée par le module dm-crypt.

LUKS

La plupart des sites qui expliquent comment chiffrer un système Linux ne montrent pas comment chiffrer la partition /boot, qui contient le noyau (vmlinuz) et initrd.

Du coup, on trouve facilement des hacks sur le net pour exploiter cette faille de partition  /boot non chiffrée.

Les grosses lignes de l’attaque:

1.Il faut avoir accès à la machine, s’emparer du disque une première fois pour modifier du code dans initrd.
2.Ensuite, un utilisateur (qui ne s’est pas aperçu que le disque a été enlevé puis remis) doit se logguer sur le serveur, et donc entrer le mot de passe pour déchiffrer le disque.
3. Il faut récupérer le disque une seconde fois pour extraire le mot de passe écrit en clair dans un fichier…

Bref, ça reste pas simple, mais c’est faisable…

Ceci dit, aucune des méthodes ne permet de s’immuniser contre un hack plus fort, du genre cold boot, où l’on gèle la RAM avec de l’azote liquide pour ralentir l’effacement des données et essayer de récupérer à l’intérieur les mot de passe..  (source publication de Princeton University). Mais bon, si des mecs (et des femmes) débarquent avec de l’azote liquide et des cagoules dans une salle serveur, la meilleure sécurité devient alors potentiellement de passer par la fenêtre la plus proche avec un parachute sur le dos (quoi ça ne se passe pas comme ça dans la vraie vie?!)


Je vais donc expliquer comment installer un système qui permet d’avoir une partition /boot chiffrée. Celle ci sera déchiffrée par GRUB, qui depuis la version 1.98, gère le déchiffrement avec le module crypto qui a été ajouté. (blog sympa)
Pour réussir à hacker un tel système (sans les cagoules et l’azote hein!!), il faut modifier le core.img qui est installé dans le MBR.. Je n’ai pas trouvé encore un moyen de faire cela, pas certain que n’importe quel employé mal intentionné soit capable d’y arriver rapidement.

Utilisation de GRML  (et condition de test)

J’ai choisi d’utiliser le couteau suisse GRML, bien pratique pour effectuer les travaux nécessaires en amont de l’installation du futur OS. C’est à dire concernant le partitionnement, la création des volumes group et volumes logiques (pour permettre une extension des partitions le cas où^l’on a prévu trop juste :O) ainsi que du chiffrement.
Il existe plusieurs versions de GRML, 32/64 et small/full. La version contient a priori plus d’outils par défaut, comme la gestion de disk gpt (sgdisk), que j’ai du installer lors d’un test car absente dans la version light (mais je ne me sers pas de sgdisk dans ce tuto).

Déjà, j’ai perdu un long moment à essayer de booter GRML sous virtualBox windows, avec les options noudev ou encore vga=all, mais ce fut sans succès.. Apparemment il est possible de la faire avec une version compilée  je sais pas comment sous Linux. Mais manque de pot, je suis sous Windows et n’allait pas m’amuser à installer un Desktop sous Linux en plus… Quoique j’aurais pu étant donné le temps perdu à comprendre que virtualbox Win foutait le bronx…
Bref, j’ai finalement installé une version de Workstation (v9) pour effectuer un autre test et vérifier le coeur net. Et là, super, GRML démarre sans le moindre soucis.

Debian7-2015-06-11-09-48-51

Debian7-2015-06-11-09-49-51
Happy Hacking!
Préparation du disque avec la commande parted:

Dans un premier temps, création et dimensionnement du disque qui va héberger notre OS, /dev/sda. Une partition sda1 de 3Mo pour que Grub puisse venir s’installer, avec ses modules.

Remarque: Avec tous les tests que j’ai fait, je pense que cette partition est nécessaire seulement si on souhaite les fonctionnalités avancées de grub comme le cryptage, sinon GRUB s’installe à partir du MBR (Master Boot Record).

Et une partition sda2 qui va contenir un VG (volume group), ce dernier contenant les différents LV (logical volume). C’est cette partition que nous chiffrerons ensuite.

root@grml ~ # parted -a optimal /dev/sda
(parted) print
(parted) mklabel gpt
(parted) unit mib
(parted) mkpart primary 1 3
(parted) name 1 grub
(parted) set 1 bios_grub on
(parted) mkpart primary 3 -1
(parted) name 2 lvm
(parted)print
(parted) quit

Chiffrer la partition sda2, puis créer le VG et LV pour les partitions /, /home et pour la partition d’échange swap aussi.

On utilise la commande cryptsetup pour chiffrer la partition. Ensuite, on crée les VG et LV avec vgcreate, lvcreate. Puis il faut formater les nouvelles partitions avec la commande mkfs.ext4. On termine par monter les partitions formatées. Je ne monte pas la partition /home, mais j’ajouterai une entrée dans fstab plus tard.

root@grml ~ # cryptsetup luksFormat /dev/sda2
root@grml ~ # cryptsetup luksOpen /dev/sda2 lvm
root@grml ~ # pvcreate /dev/mapper/lvm
root@grml ~ # vgcreate vg /dev/mapper/lvm
root@grml ~ # lvcreate -L 512M vg -n swap
root@grml ~ # lvcreate -L 4G vg -n root
root@grml ~ # lvcreate -l +100%FREE vg -n home
root@grml ~ # mkswap -L swap /dev/mapper/vg-swap
root@grml ~ # mkfs.ext4 /dev/mapper/vg-root
root@grml ~ # mkfs.ext4 /dev/mapper/vg-home
root@grml ~ # mount /media/vg-root

Installation en mode debootstrap

On va lancer l’installation du Debian en fournissant le répertoire racine. Les options par défaut sont OK. On peut lancer la commande sans option et une interface nous guide dans l’installation.

root@grml ~ # grml-debootstrap --target /media/vg-root --password YOUR_PASSWORD --hostname YOUR_HOSTNAME
* grml-debootstrap [0.57] - Please recheck configuration before execution:
Target: /mnt
Install grub: no
Using release: jessie
Using hostname: YOUR_HOSTNAME
Using mirror: http://http.debian.net/debian
Using arch: i386
Important! Continuing will delete all data from /media!
* Is this ok for you? [y/N] y
[...]

Là vous pouvez aller prendre un ou deux cafés…

Configuration du GRUB et Initrd

On va se possitionner en CHROOT dans à la racine du futur OS:

root@grml ~ # grml-chroot /media/vg-root /bin/bash
(debian8)root@grml ~ # grub-install /dev/sda
(debian8)root@grml ~ # update-grub

On peut installer ce package et choisir la langue:

(debian8)root@grml ~ # apt-get install console-setup

Modification de la configuration de GRUB pour charger les modules de déchiffrement:

#KEYMAP anglais 🙁

(debian8)root@grml ~ # echo GRUB_ENABLE_CRYPTODISK=y >> /etc/default/grub
(debian8)root@grml ~ # echo 'GRUB_PRELOAD_MODULES="keymap lvm cryptodisk luks mdraid1x"' >> /etc/default/grub

Puis modification des fichiers de configuration pour déterminer les partitions à déchiffrer puis à monter lors du démarrage! cryptroot est ici notre cible, que nous allons utiliser dans /etc/crypttab:

(debian8)root@grml ~ # echo "cryptroot /dev/sda2 none luks,discard" >> /etc/crypttab

Ajout des partitions à monter au démarrage:

(debian8)root@grml ~ # echo "/dev/mapper/vg-root / ext4 noatime,discard,errors=remount-ro 0 1" > /etc/fstab
(debian8)root@grml ~ # echo "/dev/mapper/vg-swap none swap sw,discard 0 0" >> /etc/fstab
(debian8)root@grml ~ # echo 'CRYPTOPTS=target=lvm,source=/dev/sda2,lvm=vg-root' > /etc/initramfs-tools/conf.d/cryptroot

Comme le script cryptsetup par défaut ne détecte pas toujours les volumes chiffrés, on force comme cela l’ajout de cryptsetup dans initrd:

(debian8)root@grml ~ # echo 'CRYPTSETUP=y' >> /etc/initramfs-tools/initramfs.conf
(debian8)root@grml ~ # echo "export CRYPTSETUP=y" > /usr/share/initramfs-tools/conf-hooks.d/forcecryptsetup

Copie de modules pour chiffrement et LVM nécéssaires à initramfs:

(debian8)root@grml ~ # cp /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
(debian8)root@grml ~ # cp /usr/share/initramfs-tools/hooks/lvm2 /etc/initramfs-tools/hooks/
(debian8)root@grml ~ # cp /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/
(debian8)root@grml ~ # cp /usr/share/initramfs-tools/scripts/local-top/lvm2 /etc/initramfs-tools/scripts/local-top/

Des erreurs peuvent s’afficher suite à la mise à jour du grub..

(debian8)root@grml ~ # update-grub
(debian8)root@grml ~ # update-initramfs -k all -u

On sort du chroot et on démonte proprement les partitions, puis on peut redémarrer!

(debian8)root@grml ~ # exit
root@grml ~ # umount /dev/vg-root
root@grml ~ # vgchange -an
root@grml ~ # cryptsetup luksClose lvm
root@grml ~ # reboot

Ecrans que l’on doit obtenir

Premier mot de passe demandé pour avoir accès à la partition boot chiffrée sur le volume root..

DebianLUKS_LVM-2015-06-12-15-40-32

Puis le GRUB2 en question

DebianLUKS_LVM-2015-06-12-15-40-58

Et le mot de passe demandé pour déchiffrer les partitions!

DebianLUKS_LVM-2015-06-12-15-41-34

Enfin le login…

DebianLUKS_LVM-2015-06-12-15-41-49


Publié

dans

,

par

Étiquettes :

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *