Un disque dur peut se révéler très indiscret, et un examen "forensic" de celui-ci peut le plus souvent exhumer des fichiers temporaires effacés depuis longtemps, des morceaux de documents dont on penserait "qu'ils n'ont jamais été sauvegardés", des mots de passe...

Protéger un système contre la présence de tels "restes mortels" constitue un projet long et complexe, mais on peut commencer par le plus simple et le plus nécessaire : le swap et les répertoires de fichiers temporaires.

Nous nous intéresserons aujourd'hui au seul swap.

Le swap est une partition spéciale qui est toujours créée automatiquement et séparément des autres lors de l'installation d'une distribution GNU/Linux. Le swap peut être vu comme une extension sur le disque dur de la mémoire vive (RAM) du système, c'est-à-dire que dès que le système manque de mémoire, il copie automatiquement sur le disque dur, dans l'espace de swap, non pas des fichiers, mais des blocs de sa mémoire vive dont "il n'a pas besoin pour l'instant", de manière à libérer de la place en mémoire centrale. Ces éléments copiés sur le swap y demeurent jusqu'à ce qu'ils soient écrasés par d'autres, et on peut y trouver absolument n'importe quoi : Bouts de documents ouverts ou en cours de rédaction, pages web en cours de visite, morceaux de programmes, mots de passe... Leur exploitation est difficile, mais accessible à un spécialiste doté d'outils ad hoc.

Comme Linux optimise en permanence son utilisation de la mémoire, en pratique, dès qu'une machine a été allumée quelques dizaines de minutes, des données inutilisées sont swappées même si le système ne manque pas de mémoire.

Pour éviter la présence rémanente sur son disque dur de telles indiscrétions rémanentes, la plus sûre solution est de chiffrer le swap en utilisant un mot de passe aléatoire généré automatiquement au boot de la machine, et définitivement perdu dès que la machine est éteinte ou rebootée. Ainsi, tout ce qui demeure sur le swap est définitivement inexploitable dès la machine éteinte.

Or, ceci est extrêmement facile à mettre en oeuvre. Voici comment procéder sur une Ubuntu 7.04 Feisty ou 7.10 Gutsy.

=> Dans la suite de ce document, je parle de "console root". Une "console root" est un terminal dans lequel on est passé en mode root (administrateur) en tapant la commande "sudo -s". On peut aussi exécuter chaque commande root à partir d'une console "ordinaire", mais il faut à ce moment-là précéder chaque commande de "sudo" pour l'exécuter en tant que root.

Si l'on a fait "sudo -s", on peut ensuite ressortir en mode "utilisateur ordinaire" en tapant "exit" ou [Ctrl]-D (fin du fichier d'entrée).

Pour chiffrer le swap, donc, la première chose à faire est d'installer le paquetage cryptsetup, soit au moyen de l'outil graphique adéquat, soit en console root par la simple commande :

aptitude install cryptsetup

Une fois ceci fait, il faut s'assurer de la partition de disque sur laquelle se trouve le swap.

ATTENTION : Dans la suite de ce processus, toute erreur ou faute de frappe dans le nom de la partition sur laquelle on travaille provoquera irrémédiablement la destruction des données du disque dur ! Il faut donc vérifier à chaque commande qu'on travaille bien sur la bonne partition, exclusivement celle du swap !

Tapons la commande :

root@totor:/etc# swapon -s
Filename Type Size Used Priority
/dev/sda4 partition 4200884 34072 -1

...Notre partition de swap active est /dev/sda4 (4ème partition principale de notre premier disque dur SATA ou SCSI).

Dans la suite de ce document, à chaque fois que vous verrez /dev/sda4, pensez à le remplacer par votre partition de swap telle que cette commande vous l'aura montrée !

Si vous avez un processeur de classe i586 ou supérieur (c'est-à-dire tout le monde, sauf les possesseurs de très vieilles machines), nous utiliserons le module de chiffrement "aes_i586" (les plus vieux utiliseront "aes" tout court.

  • Chargeons les modules de noyau dont nous avons besoin pour le chiffrement :
modprobe aes_i586
modprobe dm_mod
modprobe dm_crypt
  • Désactivons notre partition de swap (fermez auparavant les applications dont vous n'avez pas besoin, de manière à vous assurer que vous ne consommez pas plus de mémoire vive que la mémoire RAM réelle de votre système)
swapoff /dev/sda4
  • Assurons-nous que le swap n'est plus utilisé :
root@totor:/etc# swapon -s
Filename Type Size Used Priority

(On ne doit plus rien voir dans la liste)

Maintenant, nous allons effacer "écraser" complètement le contenu de la partition de swap (si vous écrasez la mauvaise partition, vous êtes mal !)

  • Si nous avons du temps devant nous (ça peut prendre plusieurs dizaines de minutes), nous remplirons cette partition de données pseudo-aléatoires, pour rendre son contenu présent et futur complètement indiscernable de données aléatoires :
dd if=/dev/urandom of=/dev/sda4 bs=1M

...L'opération se poursuivra jusqu'à donner une "erreur d'entrée-sortie" quand la partition sera pleine.

(Si nous sommes pressés et voulons aller beaucoup plus vite, nous pouvons utiliser "/dev/zero" à la place de "/dev/urandom" pour écraser toute la partition avec des zéros, mais cela donnera une protection d'un peu moins bonne qualité.)

  • La partition une fois effacée, créons un volume chiffré à partir de celle-ci :
cryptsetup -s 128 -d /dev/urandom create cswap /dev/sda4

(N'utilisez en aucun cas "/dev/zero" ici !)

Si cela a fonctionné, nous devons maintenant voir un péripérique bloc appelé /dev/mapper/cswap :

root@totor:/etc# ls -l /dev/mapper
total 0
crw-rw 1 root root 10, 63 2007-10-27 10:37 control
brw-rw 1 root disk 254, 41 2007-10-27 10:37 cswap

...Et nous pouvons vérifier que cswap est bien une partition chiffrée :

root@totor:/etc# cryptsetup status cswap
/dev/.static/dev/mapper/cswap is active:
cipher: aes-cbc-plain
keysize: 128 bits
device: /dev/sda4
offset: 0 sectors
size: 8401790 sectors
mode: read/write
  • Créons maintenant un espace de swap sur cette nouvelle partition chiffrée :
mkswap /dev/mapper/cswap
  • Activons maintenant cet espace de swap :
swapon /dev/mapper/cswap
  • Vérifions qu'il est bien actif :
root@totor:/etc# swapon -s
Filename Type Size Used Priority
/dev/mapper/cswap partition 4200884 34272 -1

Et voilà ! Notre swap est désormais chiffré !

Il nous faut maintenant nous assurer que ceci sera fait automatiquement à chaque boot. Nous avons pour cela quelques fichiers de configuration à éditer (toujours en mode root) :

  • Editons le fichier /etc/modprobe.d/aliases, et ajoutons à la fin de celui-ci une ligne :
alias aes aes_i586
  • Editons le fichier /etc/modules, et ajoutons vers le début de celui-ci les lignes :
aes_i586
dm_mod
dm_crypt
  • Editons le fichier /etc/crypttab, comme suit :
#                 
cswap /dev/sda4 /dev/urandom size=128,swap
  • Editions le fichier /etc/fstab, cherchons la ligne concernant le swap et qui doit probablement commencer par un long "UUID=blablabla" suivi quelque part de "swap", et être précédé d'une ligne de commentaire indiquant "# /dev/sda4". Modifions cette ligne en supprimant "UUID=blablabla" et en le remplaçant pour donner à la ligne l'aspect suivant :
/dev/mapper/cswap none           swap    sw              0       0

Voilà, nous avons terminé !

Il ne reste plus qu'à redémarrer le système pour s'assurer que ceci a "survécu au reboot" et que le système sait désormais configurer tout seul son swap chiffré à chaque boot. Après le reboot, on vérifiera simplement que...:

root@totor:/etc# swapon -s
Filename Type Size Used Priority
/dev/mapper/cswap partition 4200884 34272 -1

root@totor:/etc# cryptsetup status cswap
/dev/.static/dev/mapper/cswap is active:
cipher: aes-cbc-plain
keysize: 128 bits
device: /dev/.static/dev/mapper/swap
offset: 0 sectors
size: 8401790 sectors
mode: read/write

Voilà, notre "swap" est désormais définitivement chiffré. Dans un prochain article, nous verrons comment faire la même chose, sur le même principe, pour la partition de fichiers temporaires "/tmp".