Données cryptées au repos

Cryptage au repos

Outre les privilèges sur les fichiers, nous voulons nous assurer que les données sont cryptées sur le périphérique de stockage.

Même si l'appareil est volé, ou si un pirate informatique accède à la machine et peut lire directement l'appareil, il ne devrait pas être en mesure de comprendre le contenu sans une clé cryptographique.

Dans cette section, nous allons apprendre à attacher un volume à une VM, à le formater et à ajouter une couche cryptographique.

Disques vs partitions

Un disque est un périphérique comme un disque dur ou une clé USB. Sur un disque, on peut créer une ou plusieurs partitions, qui sont des espaces indépendantes.

Comment voir les disques et partitions ? Cela change en fonction de votre parfum d'Unix. Sur Ubuntu, on utilise la commande lsblk (list block devices) :

kevin%nguni.fr@unix-shell-students:~$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0  103M  1 loop /snap/lxd/23541
loop1     7:1    0 63,2M  1 loop /snap/core20/1695
loop2     7:2    0 49,6M  1 loop /snap/snapd/17576
vda     252:0    0 74,5G  0 disk 
├─vda1  252:1    0 74,4G  0 part /
├─vda14 252:14   0    4M  0 part 
└─vda15 252:15   0  106M  0 part /boot/efi

Ici, on voit que le disque vda contient 3 partitions.

Une partition ou un disque n'est pas obligatoirement monté dans la hiérarchie. lsblk nous donne de l'information des périphériques connectés seulement. Il faudrait la monter avant de l'utiliser, et de les voir avec df.

Provisionner un volume dans votre Cloud

Rendez-vous chez votre fournisseur de services en nuage et approvisionnez un nouveau volume (le plus petit et le moins cher que vous puissiez trouver) qui sera attaché à votre VM.

Nous allons maintenant apprendre à formater et à monter ce volume.

Formater un disque ou partition

Formater un disque ou une partition dépende du parfum Unix que vous utilisez. Dans Ubuntu, on utilise mkfs (make file system).

Par exemple :

# Formater le périphérique à /dev/sda avec le format "ext4" 
mkfs.ext4 /dev/sda

Monter un périphérique

Si vous branchez une clé USB ou disque dur interne (ou, si vous êtes chez un hébergeur cloud, et vous aimeriez attacher une volume externe), on commence par d'abord lister les périphériques (avec lsblk), puis on le monte à l'endroit où on veut :

mount -o defaults [chemin vers l’appareil block] [chemin de montage]

Exemple :

# Monter le périphérique /dev/sda sur le dossier /mnt/data
mount -o defaults /dev/sda /mnt/data

Monter les disques/partitions/volumes au démarrage

Si on redémarre notre machine UNIX après avoir monter un disque, on perdra nos modifications.

Il faudrait sauvegarder notre manipulation dans un fichier spécial, qui est lu au démarrage. Dans notre cas, le fichier se trouve à /etc/fstab :

kevin%nguni.fr@unix-shell-students:~$ cat /etc/fstab 
LABEL=cloudimg-rootfs   /        ext4   discard,errors=remount-ro       0 1
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1

Pour notre exemple, monter le disque /dev/sda (format ext4) sur /mnt/data automatiquement au démarrage :

nano /etc/fstab
# Ajoutez la ligne au fichier, puis sauvegardez :
# /dev/sda /mnt/data ext4 defaults 0 0

⚠️ Attention, il vous faut des droits suffisants pour modifier ce fichier !

📖 Consultez man fstab pour en savoir plus du format de ce fichier !

Vous pouvez tester votre modification avec umount et mount:

# Demonter votre volume
umount /mnt/data

# Re-monter le volume, sans préciser /dev/sda : mount va chercher dans fstab automatiquement
mount /mnt/data

Si mount fonctionne correctement, vous pouvez redémarrer votre instance avec :

reboot

Actuellement, votre volume est monté et persiste après le redémarrage. Mais il n'est pas crypté.

Forçons Linux à chiffrer toutes les données écrites sur le volume.

Tout d'abord, démontez le volume, et supprimez la ligne que nous avons ajoutée à /etc/fstab :

umount /mnt/data
nano /etc/fstab
# -> ensuite commentez la ligne ajoutée auparavant

Cryptage : LUKS

LUKS est le système utilisé pour chiffrer un volume.

Nous installons LUKS avec la commande cryptsetup :

# Installer
sudo apt install cryptsetup

Nous avons déjà vu que quand on parle de la cryptographie, il faudrait nécessairement un (ou plusieurs) clé(s) qui permettent de crypter et décrypter des données. Avec LUKS, nous allons créer et gérer ces clés.

Nous commençons par générer une clé forte, en utilisant l'outil openssh par exemple. Plus la clé est longue, plus elle est sécurisée :

# Générer un mot de passe bien unique
openssl rand -base64 32

# Formater le disque pour cryptage LUKS
cryptsetup -c aes-xts-plain64 -v luksFormat /dev/sda

# On vous demande de fournir un mot de passe fort. 
# Utilisez le mot de passe généré par openssl juste avant

Nous avons formaté le volume crypté. Ce volume ne peut pas être lu comme un volume normal. Il faudrait fournir la clé de cryptage. Donc avant de le monter, il faut configurer le périphérique :

# Configurer le peripherique 
# On précise :
# - l'opération: luksOpen (ouvrir un volume)
# - le péripherique physique concerné : /dev/sda
# - l'alias pour ce volume dans LUKS : encrypteddata
cryptsetup luksOpen /dev/sda encrypteddata

# On vous demande de fournir le mot de passe utilisé à la création du volume

# Le nouveau péripherique devrait être présent
ls /dev/mapper

Nous disposons maintenant d'un nouveau périphérique "virtuel" qui se trouve à /dev/mapper/encrypteddata. Ce périphérique peut être formaté et monté comme n'importe quel autre périphérique :

# Formater le nouveau volume
mkfs.ext4 /dev/mapper/encrypteddata

# Si pas déjà fait, créer le point de montage /mnt/encrypteddata
mkdir /mnt/encrypteddata

# Monter
mount /dev/mapper/encrypteddata /mnt/encrypteddata

Nous pouvons donc naviguer à /mnt/encrypteddata et créer et modifier les fichiers. Nous pouvons aussi préciser ce chemin pour le stockage de nos données d'une base de données SGBDR par exemple.

Mais, avant de le faire, il y a un problème : le volume crypté n'existera uniquement tant que l'instance ne redémarre pas. Au redémarrage, il faudrait fournir de nouveau le mot de passe de cryptage.

L'avantage de LUKS est qu'on peut ajouter plusieurs clés en parallèle. Nous allons créer une autre clé qui sera plutôt stocké dans un fichier sur un autre volume. Au démarrage, nous allons utiliser ce fichier pour déverrouiller notre volume.

# Créer uns chaîne de caractères aléatoire, et les sauvegarder dans /etc/.luks-encrypteddata-key
dd if=/dev/random of=/etc/.luks-encrypteddata-key bs=32 count=1

# Regarder ce fichier :
cat /etc/.luks-encrypteddata-key

Nous ajoutons cette clé parmi les clés possibles pour LUKS :

# Ajouter la clé /etc/.luks-encrypteddata-key parmi le trousseau pour /dev/sda
cryptsetup luksAddKey /dev/sda /etc/.luks-encrypteddata-key

# Attention: il va vous demander le mot de passe précédemment crée.
# C'est normale ! Il faut connaître déjà un mot de passe avant d'en ajouter un autre !

A tout moment, nous pouvons visionner l'état de nos clés :

cryptsetup luksDump /dev/sda

Testons cette nouvelle clé. D'abord, fermons le volume qui a été ouvert via la clé initiale :

# Démonter le volume
umount /mnt/encrypteddata 

# Fermer le périphérique
cryptsetup luksClose encrypteddata

Ensuite, montons le volume en précisant plutôt le fichier comme clé :

cryptsetup -v luksOpen /dev/sda encrypteddata --key-file /etc/.luks-encrypteddata-key

# Key slot 1 unlocked.
# Command successful.

C'est super. Maintenant, on peut déverrouiller un volume sans fournir manuellement un mot de passe. Comment le faire au démarrage ?

Vous vous souvenez du fichier /etc/fstab ? Nous avons l'équivalent pour les volumes cryptés : /etc/crypttab, qui prend le format suivant :

<target name> <source device> <key-file> <options>

Les options sont :

  • target name : le nom de notre volume, pour nous encrypteddata

  • source device : le UUID de notre volume. On peut trouver le UUID avec blkid /dev/sda. Dans mon exemple, j'ai trouvé le UUID 9096ac61-20bf-4c88-a770-35e6b71897b7.

  • key-file : le chemin absolu du fichier avec la clé, pour nous /etc/.luks-encrypteddata-key

  • options : les options du système de cryptographie. Pout nous luks

Nous ajoutons alors la ligne suivante :

# Ajouter cette ligne à /etc/crypttab, ex: 
# nano /etc/crypttab
encrypteddata  UUID="9096ac61-20bf-4c88-a770-35e6b71897b7"  /etc/.luks-encrypteddata-key  luks

Cette procédure assurera que le périphérique virtuel est créé (le volume crypté est ouvert). En revanche, il faut quand même monter le volume au démarrage, comme nous avons fait avec un volume normal. On modifie donc /etc/fstab :

# Ajouter cette ligne à /etc/fstab, ex: 
# nano /etc/fstab
/dev/mapper/encrypteddata  /mnt/encrypteddata ext4 defaults,nofail 0 0

Vérifiez bien que vous votre volume monte correctement :

umount /mnt/encrypteddata
mount /mnt/encrypteddata/

Ensuite, redémarrez votre instance pour tester.

Références:

Mis à jour