Laisser un commentaire

Chiffrement de répertoire sous Linux

Dans l’ère post-Snowden, le chiffrement est devenu une question d’hygiène. Contrairement au chiffrement des communications pendant leur transport, les données sont encore souvent stockées en clair sur nos machines et serveurs.

Sur Linux, il existe plusieurs méthodes de chiffrement : chiffrement du disque entier avec LUKS ou encore de répertoire. Une particularité cependant, l’usage doit être compatible avec les serveurs, donc possibilité de rentrer le mot de passe à distance et de conserver le dossier lisible après que l’utilisateur se soit déconnecté.

Pour un usage serveur, chiffrer l’ensemble du disque avec LUKS est complexe puisqu’il est très compliqué [en] de saisir un mot de passe à distance.

La majeure partie du temps, il suffit de chiffrer le ou les répertoires dans lesquels sont stockées les données sensibles. Attention cependant, sur Ubuntu, si vous utilisez ecryptfs-utils [en] pour chiffrer votre home, ce dernier sera automatiquement déchiffré lorsque vous vous connectez, mais de nouveau chiffré à la déconnexion. Or ce n’est pas forcement le comportement souhaité pour un serveur…

Plusieurs outils wrappers existent pour faciliter la configuration, cependant, ils offrent moins d’options. Nous partons donc directement avec l’outil bas niveau qu’on installe d’un petit coup de apt.

apt install ecryptfs-utils

Avant de commencer, il faut sauvegarder l’ensemble du répertoire que l’on s’apprête à chiffrer. En effet, lors de la création du répertoire chiffré, tous les documents s’y trouvant seront rendus illisibles.

Sachez également que l’ensemble des commandes mount doivent être exécutées en root. Par conséquent, le mieux est de se loguer directement en root ou de faire un sudo su.

cp -pfr /home/buzut/ /home/buzut-bak/
# on utilise la commande "mount"
# en lui précisant qu'il s'agit bien de monter un répertoire chiffré "-t ecryptfs"
mount -t ecryptfs /home/buzut /home/buzut

# il nous demande la phrase de passe, à ne perdre sous aucun prétexte !
Passphrase:

# on doit ensuite choisir un algo de chiffrement
Select cipher:
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32
 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16

# je conserve celui par défaut (aes)
Selection [aes]:

# la longueur en octets de la clef de chiffrement
Select key bytes:
 1) 16
 2) 32
 3) 24
Selection [16]:

# on n'autorise pas de fichiers non chiffrés dans ce volume
Enable plaintext passthrough (y/n) [n]:

# chiffrer ou nom les noms de fichiers
Enable filename encryption (y/n) [n]: y

# on laisse la signature générée par défaut
Filename Encryption Key (FNEK) Signature [33419c4g4b0rrey6]:
Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_fnek_sig=33419c4g4b0rrey6
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=33419c4g4b0rrey6
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Would you like to proceed with the mount (yes/no)? : yes

Si vous désirez en apprendre d’avantage sur les concepts de longueur de clefs, voyez l’article de Wikipedia.

Voilà notre répertoire monté ! Il faut restaurer tous nos documents dans le dossier maintenant chiffré :

cp -pfr /home/buzut-bak/ /home/buzut/

Nous avons presque terminé. En dernier lieu, nous allons créer un fichier de configuration qui nous permettra d’éviter de re-renseigner les options de montage à chaque fois. Pour cela, nous créons /root/.ecryptfsrc avec les options définies précédemment et affichées lors du montage.

ecryptfs_unlink_sigs
ecryptfs_fnek_sig=33419c4g4b0rrey6
ecryptfs_key_bytes=16
ecryptfs_cipher=aes
ecryptfs_sig=33419c4g4b0rrey6

Avant d’être totalement couvert, il reste un petit détail pour avoir l’esprit tranquille : chiffrer le swap. En effet, dans l’éventualité où des données passent en swap et que ce dernier n’est pas chiffré, tout ce qui y aurait été stocké se retrouverait en clair sur le disque à la mercie du premier venu… Pas cool.

Pour remédier à cela, il suffit de chiffrer le swap. Comme toujours, plusieurs solutions sont envisageables. La méthode que nous allons aborder est la plus sécurisée. Le mot de passe qui sert au chiffrement de la partition est réinitialisé à chaque démarrage. Ainsi, au reboot de la machine, toutes les données anciennement mises en swap sont devenues totalement illisibles.

C’est bien entendu l’effet recherché puisque le swap est juste là pour suppléer à la ram lorsqu’elle vient à manquer. Le seul inconvénient à cette technique vient du fait que le swap est utilisé pour stocker le contenu de la ram pour la veille prolongée. Donc sur les pc portables notamment, où l’on utilise parfois le mode veille prolongée, celle-ci ne fonctionnera plus. Bon, après tout le cas d’usage que l’on prend depuis le départ est plutôt orienté serveur puisqu’ils existe d’autres techniques adaptées pour les laptops et desktops.

On ouvre donc /etc/crypttab et on y ajoute notre swap :

# <target name> <source device>         <key file>      <options>
cryptswap UUID=6638c3db-4f18-4a2a-a3de-9b79883bcb71 /dev/urandom swap,cipher=aes-xts-plain64,size=256

target name contient, comme son nom l’indique, le nom du device. On a ensuite une adresse à la /dev/sdX# ou un UUID dans source device.

key file est l’adresse du fichier contenant la clef pour chiffrer/déchiffrer. En l’occurrence, on en génère une unique à chaque démarrage donc /dev/urandom est tout à fait indiqué.

En dernier lieu, options permet de configurer les options de montage. Nous avons ici swap qui se chargera de créer le volume avec mkswap. Les autres options permettent ici de définir la cipher de chiffrement et la taille de la clef. Pour les autres options, référez-vous directement au man [en].

Une fois le fichier de configuration renseigné, votre swap chiffré ce trouvera dans /dev/mapper/cryptswap. cryptswap correspond au nom que vous avez défini en tant que target name dans /etc/crypttab.

Pour finir, nous allons désactiver le swap non chiffré - en le commentant - et activer le swap chiffré directement dans /etc/fstab.

#UUID=6638c3db-4f18-4a2a-a3de-9b79883bcb71 none swap sw 0 0
/dev/mapper/cryptswap1 none swap sw 0 0

Et voilà ! Vous n’avez plus que deux commandes à retenir : mount -t ecryptfs /home/buzut /home/buzut pour monter votre répertoire et umount /home/buzut. Pour encore plus d’ergonomie, il ne vous reste plus qu’à créer deux alias et le tour sera joué. Pour l’alias, je vous fais confiance, vous êtes de grandes personnes !

Commentaires

Rejoignez la discussion !

Vous pouvez utiliser Markdown pour les liens [ancre de lien](url), la mise en *italique* et en **gras**. Enfin pour le code, vous pouvez utiliser la syntaxe `inline` et la syntaxe bloc

```
ceci est un bloc
de code
```