Système de fichier chiffré🔗

Posted by Médéric Ribreux 🗓 In blog/ Sysadmin/

#sysadmin #security

Introduction

Après avoir utilisé pendant près d’un an cryptoloop, il nous faut passer à dm-crypt. L’occasion de disposer d’un nouveau PC est trop belle. Nous allons donc voir comment on peut procéder avec dm-crypt pour crypter tout ou partie d’un système de fichiers.

Pour commencer: des explications et un exemple simple

Principes

dm-crypt utilise un système de Device Manager (DM) pour crypter les données. Le DM agit comme une sorte de filtre entre un périphérique de bloc virtuel et un périphérique de bloc physique. Lorsqu’un bloc de données va de l’un à l’autre, il est crypté par le module. Pour de bonnes performances, nous allons utiliser l’algo aes avec une clef de 256 octets.

Installation

Première étape: un noyau ayant le module dm-mod. C’est en standard partout. Un simple modprobe dm-mod doit suffire à charger le module. Ensuite, il faut que /dev/mapper/control existe. Sinon, il faut installer la libdevmapper. Normalement, on doit utiliser le programme dmsetup pour gérer les opérations de device (création, dimensionnement, etc.) mais son interface n’est pas triviale. C’est pourquoi, un petit apt-get install cryptsetup est recommandé: cette commande est plus facile à utiliser.

Préparation du système

Pour éviter de charger les modules à la main avec modprobe, il convient d’ajouter les modules dans /etc/modules.

echo aes >> /etc/modules
echo dm_mod >> /etc/modules
echo dm_crypt >> /etc/modules

En avant avec cryptsetup

Création du device crypté:

sudo cryptsetup create crypt /dev/hda7

Cette commande va créer un “Crypted Device Mapper” (CDM) nommé crypt (visible dans /dev/mapper tel que) pointant sur /dev/hda7. À noter que la création du CDM n’intervient pas sur la partition cible. À ce niveau, il n’y a rien de touché ! On pourrait même imaginer créer deux CDM pointant vers la même partition.

Si on a fait une erreur, on peut revenir à l'état précédent en supprimant le device toujours avec cryptsetup:cryptsetup remove crypt

Pour aller plus loin, on peut jouer avec les options de cryptsetup pour disposer d’un système adapté à nos besoins:

sudo cryptsetup --verify-passphrase --cipher aes --key-size 256 \
  create crypt /dev/hda7

Dans ce cas, cryptsetup va créer un CDM avec l’algorithme AES avec une clef de 256 octets et va chiffrer cette clef avec un password qu’il demandera de confirmer (option --verify-passphrase).

Vérification de la création du CDM

sudo cryptsetup status crypt

Cette commande retourne chez moi les références suivantes:

/dev/mapper/crypt is active:
cipher: aes-cbc-plain
keysize: 256 bits
device: /dev/.static/dev/hda7
offset: 0 sectors
size: 58588992 sectors
mode: read/write

Ne reste qu’à remplir

En effet, maintenant, /dev/mapper/crypt est périphérique de blocs comme un autre. Dans ces conditions, il est possible de le formater comme une partition et de l’intégrer dans le montage des systèmes de fichier au démarrage de la machine.

Formattage du CDM

C’est très simple: on procède comme tout autre périphérique de bloc (ici, j’ai choisi d’utiliser du Reiserfs comme système de fichiers):

sudo mkfs.reiserfs /dev/mapper/crypt

Modifications des fichiers pour montage

Il faut amender notre /etc/fstab pour indiquer qu’on souhaite monter /dev/mapper/crypt au bon endroit:

sudo echo "/dev/mapper/crypt /private_life reiserfs defaults 0 1" >> /etc/fstab

Maintenant, un simple: mount /private_life suffit pour monter le système de fichiers chiffré.

Montage au démarrage

Là, un problème supplémentaire vient se greffer: si on désire monter notre partition chiffrée automatiquement au démarrage, il faut impérativement demander le mot de passe qui protège la clef de chiffrement du CDM crypt. Pour cela, il suffit de renseigner le fichier /etc/crypttab, sorte de fstab pour dm\_crypt:

sudo echo "crypt /dev/hda7" >> /etc/crypttab

Ainsi, au démarrage, il faudra entrer la “passphrase” pour activer le CDM. Ensuite, suivant la configuration de fstab, la partition sera montée directement.

Si le fait de taper une passphrase au démarrage vous ennuie, le mieux est de supprimer les liens vers le script de démarrage /etc/init.d/cryptdisks par la commande suivante:

sudo update-rc.d -f cryptdisks remove

Une fois que l’on désire lancer le système de chiffrement, il suffit de lancer la commande sudo /etc/init.d/cryptdisks.

dm_crypt sur un fichier loopback

Le problème

Je n’ai pas envie d’utiliser une partition complète pour crypter un système de fichiers. Une solution existe: elle consiste à créer un périphérique loopback à partir d’un fichier. Ensuite, on dispose d’un périphérique de bloc qui va bien et on peut donc appliquer dm_crypt.

Voici la manipulation en détails.

On commence par créer un fichier rempli de bordel (random) qui va contenir notre futur système de fichiers chiffré:

dd if=/dev/zero of=./carchive1 bs=1M count=60000

Initialisation du périphérique de boucle (loopback device)

Une interface de boucle (loopback) permet d’utiliser un fichier comme périphérique de bloc. Pour initialiser le périphérique de boucle, on utilise losetup: sudo losetup -f ./carchive1

Cette commande affecte le premier périphérique de boucle disponible au fichier ./carchive1. Ensuite, c’est la même chose avec dm_crypt qu’avant:

Au lieu de travailler avec /dev/hda7, on va travailler sur le loopback choisi (suivant les cas /dev/loop0 ou /dev/loop1), etc.

sudo cryptsetup -y --cipher aes --key-size 256 create crypt_loop /dev/loop1
sudo mkfs.reiserfs /dev/mapper/crypt_loop

Les problèmes: le démarrage

Pour l’instant, cryptsetup ne supporte pas directement les périphériques de boucle. Donc en attendant, il faudra, à chaque démarrage lancer un script qui associera le loopback device au fichier puis qui activera le CDM correspondant au loopback-device.

Sauvegardes et récupération

Introduction

On va présenter le problème simplement: le disque système de ta machine vient de cramer. En revanche, le disque de data est encore OK ! Tu remontes un système qui va bien mais comment on fait pour récupérer ce qui est sur le volume data ? Bonne question…

Petite expérience:

Si on tente de recréer un CDM qui pointe vers un périphérique de blocs déjà passé à la moulinette, voilà ce que ça donne (on passe les configs de fstab):

cryptsetup --verify-passphrase --cipher aes --key-size 256 create crypt /dev/hda7
mount /dev/mapper/crypt

Ben, ça marche… mais je ne l’ai fait que sur une machine précise avec une seule distribution (Ubuntu).

Conclusion

Lors d’un crash machine, si vous voulez récupérer vos données cryptées, il suffit de recréer le bon CDM avec la même passphrase (et les mêmes paramètres, genre les offsets).

Crypter le swap

Introduction

Question: Pourquoi crypter le swap ? Réponse: Parce qu’on est parano et qu’on aime ça…

Plus sérieusement, une bonne analyse du swap qui, par défaut, est le reflet d’un moment donné de la RAM de votre système peut révéler des informations sensibles sur votre vie privée.

Principes

Le swap n’est pas comme un système de fichiers simple: son contenu est amené à changer souvent et il ne sert pas de stockage à long terme d’informations. C’est pourquoi on peut utiliser une clef jetable pour le chiffrer. Cette notion de clef jetable est particulièrement intéressante:

Nous allons donc utiliser /dev/random pour générer la clef !

En avant

Opérations de création:

Chez moi, le swap est en /dev/hda9. On va donc l’arrêter puis créer un CDM avec les bonnes commandes en choisissant /dev/random pour générer la clef. Ensuite, on montera tout ça.

Ça donne ça:

sudo swapoff /dev/hda9
sudo cryptsetup -d /dev/urandom create cryptoswap /dev/hda9
sudo mkswap /dev/mapper/cryptoswap -L le_swap_chiffre -v1

La première ligne arrête le swap présent en /dev/hda9. La seconde ligne créé un CDM (nommé cryptoswap) à la volée. La troisième ligne créé un swap sur le CDM cryptoswap en lui donnant un label (le_swap_chiffre), avec comme type nouveau (-v1).

Volatilité au démarrage

Les principes vus dans le point précédent peuvent être relancés à chaque démarrage de manière à disposer d’un swap complètement neuf aussi bien dans le contenu que dans la clef de chiffrement.

Pour cela, il suffit d’amender le contenu de /etc/crypttab:

echo 'cryptoswap /dev/hda9 /dev/urandom swap' >> /etc/crypttab

Ensuite, il faut indiquer dans /etc/fstab qu’on désire utiliser /dev/mapper/cryptoswap comme périphérique de swap.

/dev/mapper/cryptoswap none swap sw 0 0

Une fois ces changements faits, un simple sudo swapon -a suffit pour remonter le swap. D’ailleurs cette commande est lancée au moment du démarrage de la machine.

Conclusion

Ça prend deux minutes pour crypter son swap, ce n’est pas dangereux (pas de perte de données vitales), c’est très sûr et les performances restent correctes. Conclusion: à faire absolument.

Les extensions LUKS

LUKS, c’est quoi ?

LUKS signifie Linux Unified Key Setup. En gros, c’est un effort de standardisation des systèmes de génération de clefs pour les protections de systèmes de fichiers cryptés. Si on se réfère au point sur les sauvegardes, on voit que c’est assez risqué. Je sais par expérience qu’entre une Ubuntu 32bits et une Ubuntu 64bits (la même Breezy), il est impossible de partager un système de fichiers chiffré.

LUKS entre toutes les informations pour générer la clef directement dans la partition cryptée. Dans ces conditions, on a toujours assez d’informations pour re-générer la clef correctement. De plus, LUKS permet de changer le mot de passe de protection de la clef sans devoir tout ré-encoder.

En revanche, LUKS ne fonctionne que sur une partition…

Comment on utilise LUKS avec dm_crypt ?

Par bonheur, cryptsetup de Ubuntu contient les extensions LUKS. Il nous suffit donc de reprendre nos commandes habituelles et d’ajouter des options.

Pour vérifier si cryptsetup supporte LUKS, un simple cryptsetup –help suffit: si on voit des lignes genre: luksFormat / [] - formats a LUKS device luksOpen - open LUKS device as mapping

Faire du bruit

Avant de remplir la partition avec des données chiffrées, on va la remplir avec du bruit (des données aléatoires). Sur un disque neuf et non utilisé, on peut utiliser badblocks avec les options de random pour générer ce bruit. Dans mon cas, je veux juste m’occuper de la partition /dev/hdb5 de 30Go. On va donc utiliser dd:

sudo dd if=/dev/urandom of=/dev/hdb5

Ça prend environ 5 minutes par Go soit dans mon cas, près de 2H30…Au fait, n’utilisez pas /dev/random: ça prendrait des années à remplir ! Présentation des opérations LUKS de cryptsetup

Les extensions LUKS de cryptsetup ne sont pas nombreuses. En voici une rapide présentation: - luksFormat: initialise une partition et initialise sa clef. - luksOpen: active la partition et la lie à un CDM. - luksClose: supprime le CDM lié à la partition - luksAddKey: Ajoute une clef d’accès à la partition. - luksDelKey: efface une clef d’accès à la partition. - luksUUID: retourne le UUID. - luksDump: fait un dump de l’entête de partition. - isLuks: vérifie si la partition est en mode LUKS.

Création de la partition LUKS

C’est la première étape: on va utiliser luksFormat avec quelques options pour convenir à notre besoin. luksFormat va nous permettre de mettre une première clef pour chiffrer notre partition.

sudo cryptsetup --verbose --verify-passphrase --cipher aes -cryptsetup luksClose archive_vol0

Note: soyez sûr de taper YES en MAJUSCULE lorsque cryptsetup vous demande si vous voulez effacer la partition.

Activation et formatage de la partition LUKS

Ensuite, il faut activer la partition et la formater. Activer une partition, c’est en fait créer le CDM à la volée.

sudo cryptsetup luksOpen /dev/hdb5 archive_vol0

Normalement, une passphrase est demandée.

Ensuite, /dev/mapper/archive_vol0 peut être utilisé comme n’importe quel périphérique de bloc. Nous allons formater cette partition en reiserFS (3.6, pas assez moderne pour du reiserFS4), les options par défaut me suffisent: sudo mkfs.reiserfs /dev/mapper/archive_vol0

On peut maintenant désactiver la partition:

sudo cryptsetup luksClose archive_vol0

Montage et démontage à la volée

Pour ma part, l’intérêt de LUKS avec cryptsetup est de pouvoir monter facilement la partition à un autre moment qu’au boot: sur ma machine, il existe plusieurs utilisateurs. Je ne désire pas que ces derniers partagent ma passphrase de chiffrement ni même qu’ils aient un dialogue qui demande cette passphrase. Dans ces conditions, un montage au boot est assez lourd.

Grâce à LUKS, on peut avec une combinaison de commande monter rapidement la partition chiffrée à la demande:

sudo cryptsetup luksOpen /dev/hdb5 archive_vol0 && sudo mount /dev/mapper/archive_vol0 /mnt/archive_vol0

Il est facile de mettre cette commande dans un script.

Pour démonter à la volée, il suffit de lancer la commande:

sudo umount /dev/mapper/archive_vol0 && sudo cryptsetup luksClose archive_vol0

Références:

  1. Site principal de dm-crypt
  2. Wiki de dm-crypt
  3. Wiki de dm-crypt sur LUKS
  4. Wiki Ubuntu sur les systèmes de fichiers cryptés
  5. Site de LUKS: Linux Unified Key Setup