Quelques explications pour montrer le chemin à qui n'a pas peur de s'y risquer. Attention, la manip n'est pas sans danger pas plus qu'elle n'est pour les débutants ! Il y a mille manières de se retrouver avec une machine non-bootable et toutes ses données perdues !

J'en décris ici seulement l'idée, les grandes lignes. Des points de détail peuvent manquer, alors encore une fois, attention à vos données ! You've been warned !

Je pars d'un portable comportant une installation quasi-standard d'Ubuntu 7.10 Gutsy Gibbon, avec cependant un swap chiffré selon la méthode expliquée dans mon précédent article, et également un /tmp + /var/tmp chiffré selon la méthode décrite dans un article que je n'ai pas encore écrit.

Le jeu consiste à chiffrer l'ensemble des filesystems sur la base d'une LVM, sans bien sûr rien perdre de mon installation, ni devoir réinstaller à blanc. Simplement en déplaçant l'installation sur un disque externe avant de la remettre sur le portable dont le filesystem aura été préalablement chiffré.

J'ai commencé par prendre un disque dur externe USB que j'ai entièrement effacé et gavé de données aléatoires avec un beau

nice dd if=/dev/urandom of=/dev/sdb bs=1M
(ça dure des heures...)

À la suite de quoi, j'ai partitionné le disque externe en 3 bouts :

  1. Un petit /boot de 100 Mo en ext3
  2. Une grosse partition non formatée de type 83 (Linux) de "tout le disque moins 2 Go"
  3. Une partition non formatée de type 82 (Linux swap)

Ceci fait, j'ai monté la première partition et y ai copié mon /boot d'un coup de rsync -ax

Ensuite de quoi, j'ai utilisé cryptsetup luksFormat puis mke2fs pour faire de la deuxième partition du disque externe une partition chiffrée LUKS, que j'ai montée (sous un point de montage temporaire /mnt/ext2).

Après quoi, j'ai recopié l'ensemble du système du portable sur cette partition chiffrée du disque externe d'un nouveau coup de rsync (les différentes partitions séparées du disque interne rassemblées en une seule dans le disque externe).

J'obtiens donc une copie de sauvegade complète et chiffrée (sauf /boot) de mon portable sur le disque USB externe.

Vient le plus délicat : Rendre l'installation chiffrée bootable et utilisable directement depuis le disque externe,

  1. Monter le /boot du disque externe sous la structure chiffrée : mount -t ext3 -o noatime /dev/sdb1 /mnt/ext2/boot
  2. Créer un /dev/null bidon sous la nouvelle installation : mknod /mnt/ext2/dev/null c 1 3
  3. Monter le /dev sous l'installation externe, de manière "fantôme" : mount --bind /dev /mnt/ext2/dev
  4. Se chrooter dans l'installation : chroot /mnt/ext2
  5. Une fois là, monter /proc : mount -t proc proc /proc
  6. ...et /sys : mount -t sysfs sysfs /sys
  7. Adapter /etc/crypttab à la structure du disque externe : Créer une entrée pour le swap chiffré sur le disque externe, et une autre pour la "racine" chiffrée :
    • cswap /dev/sdb3 /dev/urandom size=128,swap
    • crootfs /dev/sdb2 none luks, check
  8. Adapter /etc/fstab de même à la structure des points de montage : un /boot non chiffré, une racine (/dev/mapper/crootfs), un swap chiffré comme dans mon précédent article
  9. Se rendre ensuite dans /boot/grub et modifier menu.lst : Y modifier le "root=" pour pointer sur le root filesystem chiffré.
  10. Installer grub sur le MBR du disque externe de manière à le rendre bootable.

A ce stade, il suffit normalement de régénérer l'initramfs avec

  • update-initramfs -v -u

...pour avoir fini le boulot.

Je me suis cependant aperçu qu'un des scripts de démarrage d'Ubuntu était incorrect et n'autorisait pas le boot sur un disque externe USB chiffré, trop lent à être "vu" par le noyau au démarrage. J'ai donc écrit un patch pour ce script (/usr/share/initramfs-tools/scripts/local-top/cryptroot), patch que je joint en annexe et que je vous conseille d'installer (il ne peut pas faire de mal ;-) avant de lancer "@@update-initramfs -v -u"

Ceci fait, il ne reste plus qu'à...

  1. cd /
  2. umount /proc
  3. umount /sys
  4. exit (nous sort du chroot)
  5. umount /mnt/ext2/dev
  6. umount /mnt/ext2/boot
  7. sync
  8. umount /mnt/ext2
  9. sync
  10. Fermer le volume chiffré LUKS (cryptsetup luksClose, etc...) du disque externe

...Et on peut rebooter proprement.

Sélectionner par le BIOS le démarrage depuis le disque USB, on doit alors avoir un beau grub qui propose le démarrage sur le disque externe chiffré.

Le mot de passe de montage de la partition LUKS sera demandé automatiquement grâce aux scripts prévus à cet effet. Elle est pas belle, la vie ?

À ce stade, on a créé une installation de Linux entièrement chiffrée sur un disque externe bootable, que l'on devrait pouvoir d'ailleurs utiliser pour booter un peu n'importe quelle machine et y retrouver son environnement Ubuntu complet ! (modulo les possibles problèmes causés par des hardwares différents, notamment carte graphique...)

Une fois que l'on a vérifié que notre installation externe est complète et marche parfaitement, et qu'on peut donc utiliser le portable sans son disque interne, on va pouvoir totalement effacer celui-ci, y préparer notre installation chiffrée un peu de la même manière que pour le disque externe, et redéménager dans l'autre sens.

Commençons par effacer totalement le disque dur du portable avec :

nice dd if=/dev/urandom of=/dev/sda bs=1M
(Comme précédemment, ça durera des heures...)

Pour l'organisation du disque proprement dit, chiffré là encore à l'exception de /boot, je me suis cette fois largement inspiré de l'excellent EncryptedFilesystemLVMHowto, dont je n'ai cependant lu que les points essentiels et que j'ai largement adapté à ma sauce, notamment :

  • Répartition en plusieurs volumes logiques (root filesystem, /var, /home, etc...)
  • J'ai conservé un swap et un /tmp chiffrés "selon mon ancienne méthode" sur des partitions séparées en dehors de la LVM, afin de pouvoir les chiffrer avec des clés aléatoires changées automatiquement à chaque boot.

Une fois le filesystem chiffré installé et monté, il reste à recopier tout le système comme précédemment, mais dans l'autre sens, à grands coups de rsync.

Puis de nouveau la partie délicate : Chroot, adaptation de /etc/crypttab, /etc/fstab, /boot/grub/menu.lst, installation de grub dans le MBR du disque, régénération de l'initramfs.

Ceci fait, démonter tous les volumes du disque interne, arrêter la LVM, désactiver sa partition chiffrée, et il n'y a plus qu'à rebooter !

On obtient enfin un portable au filesystem entièrement chiffré, qui demande gentiment la phrase secrète durant le boot, et est totalement inexploitable sans elle. Et ça marche du Feu de Dieu !

Prochaine étape : Comme mon portable comporte un lecteur de carte SD (comme les appareils photos numériques), j'envisage, plutôt que de devoir me peler la phrase secrète à chaque boot, de mettre un fichier-clé sur une telle carte et d'utiliser celle-ci comme "clé de contact" de mon portable : Carte SD insérée, il bootera tout seul, carte SD absente, il ne bootera pas, point. La carte SD tient dans la poche et dans le portefeuille :-)