La solution repose donc dans pam_mount, ce module PAM vous permet de faire monter un volume au moment de l'ouverture de session. C'est le truc parfait : pas de question posée au boot et lorsque vous n'êtes plus loggué, votre volume est démonté, c'est une bonne chose pour les gens qui ne font pas confiance en root (même si root, c'est moi-même).

pam_mount est capable de gérer le montage de partition NFS, Samba, NCP et surtout, ce qui nous intéresse, les volumes chiffrés. Il dispose de deux modes d'utilisations : pour monter le volume chiffré, il peut utiliser comme "clef de déchiffrement" le mot de passe système (celui du fichier shadow par exemple) mais ça voudrait dire que vous devrez conserver à vie votre mot de passe (car c'est la clef de chiffrement). Ce n'est donc même pas imaginable !

L'autre méthode consiste à utiliser un fichier contenant la clef générée (ou non) aléatoirement et à chiffrer ce fichier par le mot de passe système. Plus clairement, cela veut dire qu'à l'ouverture de session, pam_mount va déchiffrer le fichier avec votre mot de passe système pour récupérer la clef de déchiffrement du fichier. Vous avez besoin d'aspirine ?

Cette méthode permet à l'utilisateur de modifier son mot de passe lorsqu'il le veut, en contre partie, il doit ré-écrire le fichier pour rechiffrer la clef du volume avec son nouveau mot de passe système.

Résumé pour mettre en place tout ça

  1. Avoir ce qu'il faut dans le noyau (cryptoloop, device-mapper, cyphers, etc.) :
  2. # apt-get install libpam-mount
  3. Ajouter la ligne "@include common-pammount" dans /etc/pam.d/ où il faut.
  4. Ajouter la ligne suivante dans /etc/security/pam_mount.conf (coupée en deux mais faut pas) pour l'utilisateur foobar :

    volume foobar local - /vol/foobar /home/foobar loop,encryption=aes,keybits=256 \
             aes-256-ecb /etc/mounts/foobar.key
    
  5. Maintenant, il faut créer et initialiser le volume chiffré :

    On génère 32 octets aléatoirement, ce sera notre clef de chiffrement pour notre volume. Ensuite, nous chiffrons cette chaîne de caractères avec le mot de passe système.

    # export PASS_LOGIN=maman-ours
    # dd if=/dev/urandom bs=1c count=32 | \
         openssl enc -aes-256-ecb -pass env:PASS_LOGIN > /etc/mounts/foobar.key
    

    Il nous reste enfin à créer un système de fichier sur notre volume.

    # openssl enc -d -aes-256-ecb -in /etc/mounts/foobar.key | \
         losetup -e aes -k 256 -p0 /dev/loop7 /vol/foobar
    enter aes-256-ecb decryption password: [MOT DE PASSE LOGIN]
    
    # mkfs.ext2 /dev/loop7
    # losetup -d /dev/loop7
    

C'est terminé !

Résultat :

% mount |grep foobar
% su - foobar
Password: 
foobar@shibby:~$ mount |grep foobar
/vol/foobar on /home/foobar type ext2 (rw,loop=/dev/loop0,encryption=aes,keybits=256)
foobar@shibby:~$ logout
% mount |grep foobar

Génial non ?

Pour rajouter un peu plus de sécurité, chiffrons le swap :

# apt-get install cryptsetup
# cat > /etc/crypttab
swap         /dev/hda7 /dev/urandom swap

# grep swap /etc/fstab
/dev/mapper/swap none swap sw 0 0

Zoup, c'est terminé !