Chiffrement du répertoire personnel

Lorsque j’ai installé mon dernier ordinateur du travail, je n’ai pas chiffré le disque. Il me semble que l’installeur propose l’option mais qu’elle s’applique au disque entier et qu’il faut donc rentrer une phrase secrète au démarrage. Dans l’absolu, ça n’est pas gênant s’agissant d’un ordinateur portable que je suis censé utiliser alors qu’il se trouve devant moi mais il arrive que je le laisse au bureau et que je l’éteigne en partant. Si je veux pouvoir m’y connecter à distance après qu’un gentil collègue me l’aura démarré, il aura fallu au préalable que je lui communique cette phrase secrète, qui alors ne sera plus secrète. C’est un cas d’usage qui peut être reglé en ne chiffrant que certains répertoires, notamment le répertoire personnel, qui sera déverrouillé avec le mot de passe de l’utilisateur. Traditionnellement, c’est fait avec ecryptfs, mais la solution n’est plus proposée à l’installation d’Ubuntu, sans doute à cause des mauvaises performances liées à l’empilement de couches et la consommation excessive de mémoire (on doit lire sur disque, stocker en mémoire, déchiffrer et stocker en mémoire) ; il est toujours possible d’installer les paquets adéquats a posteriori. Heureusement, depuis le noyau 4.1 et l’intégration des modifications de Google destinées à Android Lollipop, le système de fichiers ext4 intègre le chiffrement par répertoire, avec une phrase secrète différente pour chacun et des algorithmes éprouvés (AES-256-XTS pour le contenu des fichiers et AES-256-CBC+CTS pour les noms de fichiers). Google est également à l’origine de fscrypt, un outil de haut niveau écrit en go pour la gestion du chiffrement des systèmes de fichiers ext4, f2fs et ubifs ; l’installeur d’Ubuntu ne propose que la première option pour le moment à ma connaissance. L’outil prévoit un module PAM pour déverrouiller un répertoire avec le mot de passe de connexion d’un utilisateur.

ll y a quand même quelques préalables. Evidemment, il faut que le système de fichiers sur lequel on veut utiliser le chiffrement soit formaté en ext4. La taille de page du noyau doit être identique à la taille de bloc du système de fichiers. Pour vérifier le premier point :

# getconf PAGE_SIZE
4096

Et pour le second :

# tune2fs -l /dev/sdXy | grep 'Block size'
Block size:               4096

Où sdXy représente le fichier de périphérique où se trouve le système de fichiers. Une fois chiffré, il ne sera plus lisible par des noyaux antérieurs à la version 4.1. Enfin, il ne faut pas utiliser GRUB pour démarrer le système à partir de ce système de fichiers, puisqu’il ne sera pas lisible. Avec une partition /boot ou si le montage a été fait avant dans initrd par exemple, il n’y a pas de problème.

Maintenant qu’on a vérifié que tout va bien, il suffit de lancer la commande suivante pour indiquer qu’on souhaite utiliser le chiffrement sur le système de fichiers :

# tune2fs -O encrypt /dev/sdXy

On peut maintenant installer les outils de gestion avec la commande suivante :

# sudo apt install fscrypt libpam-fscrypt

On crée un fichier de configuration pour l’outil :

# sudo fscrypt setup
Create "/etc/fscrypt.conf"? [Y/n] y
Customizing passphrase hashing difficulty for this system...
Created global config file at "/etc/fscrypt.conf".

La configuration du module PAM est faite lors de l’installation, donc rien à faire de plus.

On indique qu’on veut utiliser le chiffrement sur le système de fichier désiré. Sur mon poste, je n’en ai qu’un, / :

# sudo fscrypt setup /
Filesystem "/" (/dev/sda6) ready for use with ext4 encryption.

On peut vérifier que le chiffrement a bien été activé :

# sudo tune2fs -l /dev/sda6|grep -i encrypt
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg encrypt sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

Pour le moment, le chiffrement ne s’applique qu’à un répertoire initialement vide. On va donc renommer le répertoire personnel avant de le récréer, le chiffrer et y recopier le contenu. Idéalement, il vaut mieux passer ces commande en tant que super utilisateur depuis une console après s’être déconnecté pour ne rien perdre en route :

# mv /home/huy /home/huy.bak
# mkdir /home/huy
# fscrypt encrypt /home/huy --user=huy
Should we create a new protector? [Y/n] y
Your data can be protected with one of the following sources:
1 - Your login passphrase (pam_passphrase)
2 - A custom passphrase (custom_passphrase)
3 - A raw 256-bit key (raw_key)
Enter the source number for the new protector [2 - custom_passphrase]: 1
Enter login passphrase for huy:
"/home/huy" is now encrypted, unlocked, and ready for use.

Comme on lance la commande avec le super utilisateur, il faut indiquer quel utilisateur doit fournir son mot de passe de connexion pour déverrouiller le répertoire, ça n’est pas nécessaire sinon. Il faut évidemment choisir l’option 1.

On copie les donnéees :

# rsync -PavzH /home/huy.bak/ /home/huy/

Après avoir vérifié que tout y est, on peut supprimer l’ancien répertoire :

# rm -rf /home/huy.bak

Le répertoire sera donc déverrouillé à la première connexion de l’utilisateur. Une fois déverrouillé, le répertoire est accessible sans chiffrement à tous les utilisateurs. Le verrouillage implique le démontage du système de fichiers pour que les clés soient effacées de la mémoire, dans mon cas, ça ne sera donc qu’à l’arrêt ou au redémarrage du système. On voit donc que le chiffrement est utile ici principalement si l’ordinateur passe entre de mauvaises mains alors qu’il est éteint. Mais il peut rester dans ce cas des copies de bribes la mémoire lors de la dernière utilisation de l’ordinateur dans l’espace de pagination. Pour éviter ceci, il faut donc également chiffrer le swap. Comme on l’a déjà utilisé, il vaut mieux l’effacer. Cela dit, mon ordinateur a un SSD et le mode de fonctionnement de ce type de disques fait qu’il est très difficile d’effacer de façon sécurisé leur contenu (voir le dernier paragraphe de cet article). Il vaut mieux donc contrairement à moi, chiffrer son disque dès le départ. Pour chiffrer le swap, il faut ajouter une ligne dans /etc/crypttab :

# <name> <device>         <password>    <options>
cryptswap     LABEL=cryptswap  /dev/urandom  swap,offset=2048,cipher=aes-xts-plain64,size=512

Pour le fichier de périphérique, j’ai indiqué un label que j’ai auparavant ajouté avec la commande suivante :

sudo swaplabel -L cryptswap /dev/sda5

Ici, /dev/sda5 représente bien évidemment ma partition de swap.

Il faut ensuite mettre en commentaire la ligne qui définissait l’espace de pagination et en ajouter une nouvelle pour le swap chiffré :

# swap was on /dev/sda5 during installation
#UUID=a172a67b-459f-4a7e-a2a8-91e39f76d3c9 none            swap    sw              0       0
/dev/mapper/cryptswap none            swap    sw              0       0

Au prochain démarrage, le système utilisera donc le nouvel espace de pagination chiffré. S’il n’est pas possible de redémarrer tout de suite :

sudo cryptdisks_start cryptswap
swapoff -a
swapon -a

La commande cryptdisks_start est dans le paquet cryptsetup.