On s’intéresse ici au déverrouillage et montage des périphériques chiffrés, à l'aide des fichiers crypttab et fstab.
Note : Le déverrouillage initial par grub d'une partition boot chiffrée n'est pas traitée ici.
Mise à jour : Debian 9.6
Dans ce qui suit, on utilise les conventions suivantes
Identifiant de la partition physique du container chiffré luks : /dev/sdb1
Nom du mappage : secret
Point de montage : /mnt
$ lsblk -f /dev/sdb1
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb1 crypto_LUKS de53f0d1-e643-4782-bd8d-0655393f3efe
└─secret ext4 exemple 91d006c5-ae5f-4bc4-95d0-77616726c60f /mnt
Le fichier /etc/crypttab
contient la liste des périphériques à déverrouiller automatiquement. Chaque ligne du fichier crypttab est de la forme :
<target name
> <source device
> <key file> <options>
<target name> : Nom à donner au mappage (/dev/mapper/name), dans le cas présent "secret"
<source device> : l'identifiant du container luks, sous la forme UUID=
<key file> : chemin absolu vers le ficher de phrase de passe. Si le déverrouillage doit s'effectuer par saisie d'un mot de passe, indiquer "none"
<options> : liste d'options séparées par des virgules, par exemple luks, discard pour un chiffrage luks et autoriser l'utilisation de la commane fstrim ou discard au niveau du container. L'option keyscript= donne la possibilité d'exécuter un script ou une commande avec le chemin vers le fichier de passe de phrase (paramètre password précédent) fourni comme argument.
A chaque périphérique déclaré dans /etc/crypttab
est associé une ligne dans /etc/fstab
précisant les conditions de montage. Chaque ligne de fstab est de la forme :
<file system> <mount point> <type> <options> <dump> <pass>
file system : le nom du container tel que dans crypttab
mount point, type options dump et pass correspondant au système de fichier du container (ext4 généralement)
$ sudo update-initramfs -u -k all
Trois situations sont envisagées :
le déverrouillage par saisie de mot de passe
le déverrouillage par fichier de passe de phrase, stocké dans le système
le déverrouillage par fichier de passe de phrase, stocké dans l'initramfs
Ces situations sont applicables respectivement
au déverrouillage de la partition root lorsque la partition boot n'est pas chiffrée
au déverrouillage d'une partition home, swap, boot, .... lorsque la partition root est chiffrée
au déverrouillage d'une partition root, lorsque la partition boot est chiffrée
$ cat /etc/crypttab
#
<target name
><source device
> <key file><options>
secret UUID=de53f0d1-e643-4782-bd8d-0655393f3efe none luks
Note : l'uuid de la partition peut-être obtenu directement avec :
# blkid /dev/sdb1 -s UUID -o value
de53f0d1-e643-4782-bd8d-0655393f3efe
Fstab
$ cat /etc/fstab
/dev/mapper/secret /mnt ext4 defaults 0 0
Démonter et verrouiller le périphérique, puis
Vérifier le déverrouillage selon la configuration définie dans crypttab
# cryptdisks_start secret
[....] Starting crypto disk...[info] secret (starting)...
Please unlock disk secret: ****
[ ok t (started)...done.
# mount /dev/mapper/secret
Pour démonter et verrouiller le périphérique :
# umount /mnt
# cryptdisks_stop secret
[ ok ] Stopping crypto disk...secret (stopping)...done.
Au démarrage, le mot de passe sera demandé pour chaque périphérique présent dans crypttab. Une fois le mot de passe saisi, le périphérique sera automatiquement déverrouillé et monté.
Note de sécurité : Dans cette configuration, la phrase de passe est stockée dans l'arborescence du système. Pour qu'elle ne soit pas accessible lorsque le système est à l'arrêt, la partition système doit donc impérativement être chiffrée.
Dans ce qui suit, le fichier de phrase de passe sera stocké en /etc/key/secret_phrase
Créer le fichier de phrase de pass, et restreindre les droits de lecture et d'écriture :
$ sudo mkdir /etc/keys
$ sudo dd if=/dev/urandom of=/etc/keys/secret_phrase bs=512 count=4
$ sudo chmod 600 /etc/keys/secret_phrase
Et l'ajouter dans un des slots de la partition chiffrée :
$ sudo cryptsetup luksAddKey /dev/sdb1 /etc/keys/secret_phrase
Entrez une phrase secrète existante :
Dans le fichier /etc/crypttab
précédent, remplacer "none" par le chemin absolu du fichier :
$ cat /etc/crypttab
#
<target name
><source device
> <key file><options>
secret UUID=de53f0d1-e643-4782-bd8d-0655393f3efe /etc/keys/secret_phase luks
La ligne du fichier /etc/fstab
est inchangée
$ cat /etc/fstab
/dev/mapper/secret /mnt ext4 defaults 0 0
$ sudo cryptdisks_start secret
Au démarrage, le périphérique est automatiquement déverrouillé et monté. Un message confirme le bon déverrouillage.
Note: Si le périphérique est démonté, verrouillé puis déconnecté lorsque le système est en fonctionnement, il sera automatiquement déverrouillé et monté s'il est reconnecté.
Note de sécurité : Dans cette configuration, la phrase de passe est stockée dans l'arborescence du système et dans l'initramfs. Pour qu'elle ne soit pas accessible lorsque le système est à l'arrêt, la partition système et la partition dans laquelle est située l'initramfs doivent impérativement être chiffrées.
Créer une phrase de passe comme dans la configuration précédente et l'ajouter dans un des slots de la partition chiffrée :
Créer le fichier de phrase de passe et restreindre les droits d'accès
# mkdir /etc/keys
# dd if=/dev/urandom of=/etc/keys/secret_phrase bs=512 count=4
# chmod 600 /etc/keys/secret_phrase
Ajouter la phrase de passe dans un des slots de la partition chiffrée :
# cryptsetup luksAddKey /dev/sdb1 /etc/keys/secret_phrase
Entrez une phrase secrète existante :
Créer le script qui permettra d'ajouter la phrase de passe à la racine de l'initramfs :
# cat > /etc/initramfs-tools/hooks/addkey <<EOF
#!/bin/sh
cp /etc/keys/secret_phrase "\${DESTDIR}"
EOF
Rendre le script exécutable
# chmod +x /etc/initramfs-tools/hooks/addkey
Restreindre à root seul, l'accès en lecture à initramfs :
# echo "UMASK=026" >>/etc/initramfs-tools/initramfs.conf
Dans le fichier /etc/crypttab
précédent
remplacer "none" par le chemin du fichier de phrase de passe dans l'initramfs
ajouter l'option keyscript=/bin/cat qui permettra de lire la phrase de passe depuis l'initramf
$ cat /etc/cryptab
#
<target name
><source device
> <key file><options>
secret UUID=de53f0d1-e643-4782-bd8d-0655393f3efe /secret_phase luks,keyscript=/bin/cat
Mettre à jour l'initramfs
# update-initramfs -u -k all
On peut vérifier que le fichier secret_phrase est présent à la racine de l'initramfs :
# lsinitramfs /boot/initrd.img-4.9.0-3-amd64 |grep secret_phrase
secret_phrase
La ligne du fichier /etc/fstab
est inchangée
$ cat /etc/fstab
/dev/mapper/secret /mnt ext4 defaults 0 0
Au démarrage, le périphérique est automatiquement déverrouillé et monté. Un message confirme le bon déverrouillage