Je cherchais un moyen de chiffrer les homes des utilisateurs de mon PC, sous manjaro depuis peu. Après avoir testé plusieurs solutions, mon choix c’est arrêté sur veracrypt, parce que pourquoi pas.

Pour ceci nous utiliserons donc veracrypt (à installer en fonction de votre distribution), couplé avec pam_exec.

Pour ce tutoriel, j’utilise manjaro avec xfce4 et lightdm, le comportement peut être différent avec d’autre environnement de bureau ou d’autre gestionnaire de connexion.
De plus j’utilise LVM, avec un VG spécifique pour les homes nommés vghome, avec un LV par utilisateur, mon script sera à adapter en fonction de votre installation bien évidemment.

Ce mini tutoriel est plus un POC qu’autre chose, pour comprendre l’utilisation de pam_exec plus que le chiffrement réellement.

Montage d’un volume veracrypt

Création du volume

Il faut utiliser le même mot de passe que celui de votre session.

$ veracrypt -t -c
Volume type:
 1) Normal
 2) Hidden
Select [1]: 1

Enter volume path: /dev/mapper/vghome-xataz

Encryption Algorithm:
 1) AES
 2) Serpent
 3) Twofish
 4) Camellia
 5) Kuznyechik
 6) AES(Twofish)
 7) AES(Twofish(Serpent))
 8) Camellia(Kuznyechik)
 9) Camellia(Serpent)
 10) Kuznyechik(AES)
 11) Kuznyechik(Serpent(Camellia))
 12) Kuznyechik(Twofish)
 13) Serpent(AES)
 14) Serpent(Twofish(AES))
 15) Twofish(Serpent)
Select [1]: 1

Hash algorithm:
 1) SHA-512
 2) Whirlpool
 3) SHA-256
 4) Streebog
Select [1]: 1

Filesystem:
 1) None
 2) FAT
 3) Linux Ext2
 4) Linux Ext3
 5) Linux Ext4
 6) NTFS
 7) exFAT
Select [2]: 5

Enter password: ************* 
Re-enter password: ************

Enter PIM: # On laisse vide

Enter keyfile path [none]: # On laisse vide

Please type at least 320 randomly chosen characters and then press Enter:
Characters remaining: 117

Done:  23,279%  Speed:   12 MB/s  Left: 8 minutes

The VeraCrypt volume has been successfully created.

Nous laissons Enter PIM et Enter keyfile path vide

Puis nous le montons temporairement dans /mnt par exemple, premièrement pour le tester, et deuxièmement pour copier notre home dessus :

$ veracrypt -t /dev/mapper/vghome-xataz /mnt
$ chown -R xataz: /mnt
$ cp -rf --preserve=all /home/xataz/ /mnt/

Nous pouvons donc le démonter :

$ veracrypt -d /mnt

Modification du PAM

Pour commencer, nous créons un script qui permettra le montage de notre partition, personnellement placer dans /opt, et nommé pam_mountencrypt.sh :

#!/bin/bash

DEVICE_PATH="/dev/mapper/vghome-$PAM_USER "
HOME_PATH="/home/$PAM_USER "

if [ "$PAM_TYPE" == "auth" ] && ! mount | grep "$HOME_PATH" | grep veracrypt && [ -e $DEVICE_PATH ]; then
    tr '\0' '\n' | veracrypt -t --non-interactive --stdin $DEVICE_PATH $HOME_PATH
elif [ "$PAM_TYPE" == "close_session" ] && mount | grep "$HOME_PATH" | grep veracrypt; then
    if ! who | grep $PAM_USER | grep -v $PAM_TTY; then
        pkill -KILL -u $PAM_USER && veracrypt -d $HOME_PATH
    fi
fi

On oublie pas de le rendre exécutable.

Le script est relativement simple, mais en version littéraire ça donne :

  • Si nous recevons une demande d’authentification, que le home n’est pas déjà monté et que la partition existe, on monte la partition. Donc si le home est déjà monté (utilisateur connecté sur un autre TTY par exemple), alors on ne fait rien.
  • Mais si on reçoit une demande de fermeture de session, que le home est bien monté, alors on vérifie que l’utilisateur n’est pas connecté sur une autre session, puis on kill tout les processus de l’utilisateur, et on démonte le home.
  • Les variables PAM_USER, PAM_TYPE et PAM_TTY sont injectés par pam_exec, et le mot de passe est injecté en stdin du script.

Ce script sera exécuté par pam_exec à l’authentification, ainsi qu’à la fermeture de session.
Pour ceci nous modifions le fichier /etc/pam.d/system-login :

## Après les autres lignes commençant par auth
auth optional pam_exec.so expose_authtok /opt/pam_mountencrypt.sh

## Après les autres lignes commençant par session
session optional pam_exec.so /opt/pam_mountencrypt.sh

Puis nous allons faire une petite modification de systemd, qui sur certaine distribution ne ferme pas proprement tous les processus de l’utilisateur à la fermeture de la session.

Nous modifions donc le fichier /etc/systemd/logind.conf et on ajoute cette option :

KillUserProcesses=yes

On redémarre la machine, et normalement tout fonctionne.

D’autres cas d’utilisation

Avec Veracrypt, nous pourrions imaginer un montage d’un volume caché si une certaine clé USB est connecté par exemple.
J’utilise également pam_exec pour monter un répertoire réseau NFS. Si je suis sur mon réseau local, il monte le répertoire directement, mais si je suis sur un autre réseau, il me crée une connexion VPN vers chez moi, puis monte le répertoire. Je l’utilise aussi pour monter un répertoire cloud par rclone et chiffré.

Il y a vraiment beaucoup de cas d’utilisation, les possibilités sont quasiment illimitées, et pas forcément que pour monter un répertoire. Je suis tombé récemment sur un article, qui montrais comment mettre en place un profil itinérant sous GNU/Linux grâce notamment à pam_exec.