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.
Comments
January 27, 2020 18:07
Salut .
Ces notes sont intéressantes . P.A.M est en effet assez peu plébiscité alors que c'est un outil puissant. Je n'avais pas envisagé cette technique d'ailleurs.
+1 XFCE !
J'ai tout de même quelques remarques :
Pour ma part sur Void Linux par exemple j'ai choisis ce genre de structure :
LUKS2 (sur une autre partition) (header detaché) + PV>VG-Home > LV-Home . Déchiffré avec
/etc/crypttab
*Je choisis LUKS2 car plus robuste [PDF] et même s'il est pas compatible grub2 c'est /home le /boot peut être en luks1 .
Il sera compatible LUKS2 dans la prochaine version < 2.04 )
/etc/crypttab
est plutôt simple à mettre en place pourquoi ne pas l'utiliser ?Je suis intéressé par un article sur :
À plus .
January 31, 2020 03:33
@Disrupt1@fediverse.blog Salut,
J'ai choisi Veracrypt pour sa fonction de volume caché, c'est plus à des fins de tests qu'autres choses, mais je me suis amusé avec pam_exec, quand je me connecte avec une certaine clé USB (chiffré aussi avec Veracrypt), il monte cette clé (avec le mot de passe passé par pam) temporairement puis monte la partition caché Veracrypt avec la KeyFile contenu sur cette clé, ce qui me permettais d'avoir 2 home totalement différent en fonction de ma méthode de connexion.
Je ne voulais pas utiliser crypttab pour le home, car je voulais chaque home chiffré indépendemment, et donc qu'un utilisateur ne puisse en aucun cas monter le home d'un autre.
J'utilise par contre effectivement LUKS2 pour chiffrer le reste évidemment.