Bon, j'ai testé ce que je racontais en #8, et évidemment, ça ne fonctionne pas 😃
En fait, ça devrait fonctionner, mais la configuration de cryptsetup dans debian et ses systèmes dérivés (donc ubuntu) l'en empêche.
En pratique, si on essaie de regénérer les initramfs avec l'option de déchiffrement par fichier dans /etc/crypttab, on obtient le warning suivant :
cryptsetup: WARNING: Skipping root target sda5_crypt: uses a key file
qui signifie que la partition chiffrée est simplement zappée, et donc ça ne bootera jamais.
Il semble que cet interdit sur le déchiffrement par fichier soit imposé pour des raisons de sécurité, sauf qu'il existe un contournement tout aussi peu sécurisé qui fonctionne parfaitement.
Il s'agit d'utiliser, à la place d'un fichier contenant le mot de passe de déchiffrement, un script qui affiche ce mot de passe.
Ce script sera stocké dans le initramfs, et sera exécuté de manière transparente au moment du boot.
Voici la procédure détaillée.
Tout d'abord ma config (il s'agit d'une install chiffrée d'ubuntu avec les choix par défaut dans une machine virtuelle) :
user@mubuntu:~$ lsblk -o name,size,type,fstype,mountpoint,uuid
NAME SIZE TYPE FSTYPE MOUNTPOINT UUID
sda 10G disk
├─sda1 731M part ext4 /boot 4f65cda2-6d1c-4517-959d-98ed12c6fae4
├─sda2 1K part
└─sda5 9,3G part crypto_LUKS 72ba2b68-f6d2-467c-bc65-a603862022c9
└─sda5_crypt 9,3G crypt LVM2_member YeSeP5-pdHc-6nQr-QAPM-jtQG-h6xy-pA6Pmu
├─vgmubuntu-root 8,3G lvm ext4 / d9839cc0-c88e-4fd1-9723-8c5e0d8a3f00
└─vgmubuntu-swap_1 976M lvm swap [SWAP] 95b464d4-7372-427c-9bad-99b0d679900f
sr0 56,8M rom iso9660 2019-12-10-15-09-23-93
user@mubuntu:~$
user@mubuntu:~$ cat /etc/crypttab
sda5_crypt UUID=72ba2b68-f6d2-467c-bc65-a603862022c9 none luks,discard
user@mubuntu:~$
On commence par faire une sauvegarde des fichiers que l'on va modifier :
user@mubuntu:~$ sudo cp /etc/crypttab /etc/crypttab.bak
user@mubuntu:~$
user@mubuntu:~$ sudo cp /boot/initrd.img-5.3.0-24-generic /boot/initrd.img-5.3.0-24-generic.bak
user@mubuntu:~$
Ensuite on modifie le fichier /etc/crypttab, pour indiquer qu'on va déchiffrer via un script :
user@mubuntu:~$ sudo sed -i 's%discard%keyscript=/home/user/echo_pwd.sh%' /etc/crypttab
user@mubuntu:~$
user@mubuntu:~$ cat /etc/crypttab
sda5_crypt UUID=72ba2b68-f6d2-467c-bc65-a603862022c9 none luks,keyscript=/home/user/echo_pwd.sh
user@mubuntu:~$
Le nom du script, ainsi que son emplacement, sont arbitraires : il faut simplement qu'il puisse être trouvé au moment de regénérer les initramfs, ensuite il leur sera intégré.
Voici le contenu de ce script :
user@mubuntu:~$ cat /home/user/echo_pwd.sh
#!/bin/sh
echo -n 'chiffrement'
user@mubuntu:~$
Attention à bien mettre « #!/bin/sh » et pas « #!/bin/bash », car bash n'existera pas dans le initramfs depuis lequel le script sera exécuté au moment du boot (je me suis fait avoir 😃)
Et évidemment, il faut remplacer « chiffrement » par le mot de passe de déchiffrement.
Ne pas oublier aussi de rendre le script exécutable :
user@mubuntu:~$ chmod a+x /home/user/echo_pwd.sh
user@mubuntu:~$
Et enfin, on regénère les initramfs :
user@mubuntu:~$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-5.3.0-24-generic
user@mubuntu:~$
Voilà, cette procédure-là fonctionne sur une machine virtuelle ubuntu 19.10 en ayant suivi la procédure d'installation chiffrée par défaut.
Quelques détails et commentaires supplémentaires dans ce lien dont je me suis servi :
https://unix.stackexchange.com/questions/164403/unlock-luks-encrypted-debian-root-with-key-file-on-boot-partition