Copyright © 2003 Nowicki Christophe, Le-saux Julien, Marbache Florent
Permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la Licence de Documentation Libre GNU (GNU Free Documentation License), version 1.1 ou toute version ultérieure publiée par la Free Software Foundation. Pas de section inaltérable. Pas de texte de première page de couverture. Pas de texte de dernière page de couverture.
Table des matières
Introduction
Ce document explique etape par etape la mise en place d'un repertoire utilisateur chiffre sous Debian GNU/Linux. Pour cela nous allons utiliser le patch international et le module PAM mount. Ce document est fortement dependant de la distribution. Un certain niveau en administration UNIX/Linux est requis.
Un distribution Debian GNU/Linux 3.0 dite "unstable" ou "testing"
Les sources du Kernel Linux 2.4 : kernel-source-2.4.19
Une connection a l'internet.
Les outils pour compiler le noyau : kernel-package libncurses5-dev
GNU GPG pour verifier l'authenticite du patch : gnupg
La lib PAM mount : libpam-mount
OpenSSL : openssl
GNU Wget : wget
La premiere etape consiste a ajouter le support du chiffrement par block au noyau Linux. Cette fonctionnalite est apportee par un patch applique au noyau. Nous allons recuperer les sources du noyau :
#apt-get install kernel-sources-2.4.19#cd /usr/src#tar xjf kernel-source-2.4.19.tar.bz2#ln -sf /usr/src/kernel-source-2.4.19 linux#cd /usr/src/linux
Il faut ensuite recuperer le script appelle "International Kernel Patch Magic Installer" qui permet d'automatiser l'installation du patch international.
#wget -O - "www.kerneli.org/go?VersionDuKernel/CodePays" | sh
Il faut bien sur remplacer "VersionDuKernel" et "CodePays" par leur valeurs. Comme par exemple
#wget -O - "www.kerneli.org/go?2.4.19/FR" | sh
Apres l'application du patch nous allons construire un package debian du kernel a l'aide de la commande make-kpkg
#make-kpkg kernel-image --append-to-version -crypto --config menuconfig
Lors de la configuration du kernel la partie la plus importante est : Cryptography support (CryptoAPI)
<*> CryptoAPI support (NEW) [*] Cipher Algorithms --- 128 bit blocksize <M> AES (aka Rijndael) cipher (NEW) <M> MARS cipher (NEW) <M> RC6 cipher (NEW) <M> Serpent cipher (NEW) <M> Twofish cipher (NEW) --- 64 bit blocksize <M> 3DES cipher (NEW) <M> Blowfish cipher (NEW) <M> CAST5 cipher (NEW) <M> GOST cipher (NEW) <M> IDEA cipher (NEW) <M> RC5 cipher (NEW) --- Deprecated < > NULL cipher (NO CRYPTO) (NEW) < > DES cipher (DEPRECATED) (NEW) < > Old (mutated-endianess) Blowfish cipher (DEPRECATED) (NEW) [ ] Digest Algorithms [*] Crypto Devices <M> Loop Crypto support (NEW) [ ] Atomic Loop Crypto [*] Loop IV hack [ ] Loop Crypto Debugging < > IPSEC tunneling (ipsec_tunnel) support (NEW)
Vous pouvez mettre les "ciphers" en dur dans le noyeau ou bien en modules. Cela ne change rien. Attention la compilation d'un kernel 2.4 ne marche pas avec gcc 3.0, il faut donc remplacer gcc par gcc-2.95 dans le Makefile. Si la compilation c'est bien passer il suffit d'installer le package :
#dpkg -i kernel-image-2.4.19-crypto_10.00.Custom_i386.deb
Apres l'installation du package il faut configurer votre bootloader. Dans le cas de grub il suffit d'ajouter la ligne suivante dans le fichier /boot/grub/menu.lst :
title Debian GNU/Linux 3.0 Woody Kernel 2.4.19-crypto root (hd0,0) kernel /boot/vmlinuz-2.4.19-crypto root=/dev/hda1
Rebooter sur le nouveau kernel et verifier que le support de crypto api est bien charge :
#cat /var/log/dmesg | grep ^cryptocryptoapi: loadedcryptoloop: loaded
Voila, votre noyau supporte le chiffrement par block.
Chaque programme qui doit authentifier un utilisateur sous Linux utilise la librairie PAM (Pluggable Authentication Module). Les fichiers de configuration de chaque service se trouvent dans le repertoire /etc/pamd.d. Si vous voulez que votre repertoire personnel soit "mounter" lors de la session graphique. Il faut ajouter les deux lignes qui commancent par "+++" dans le fichier de configuration PAM de votre gestionnaire de connection graphique (xdm, gdm, kdm ou wdm) :
auth required pam_nologin.so
auth required pam_env.so
auth required pam_unix_auth.so
account required pam_unix_acct.so
password required pam_unix_passwd.so shadow
session required pam_unix_session.so
session required pam_limits.so
+++ auth optional pam_mount.so use_first_pass
+++ session optional pam_mount.so use_first_pass
Apres avoir configure votre service, il faut configurer le comportement de la libpam-mount elle meme. Pour cela il faut editer le fichier de configuration /etc/security/pam_mount.conf.
debug 0 mkmountpoint 1 lsof /usr/sbin/lsof fsck /sbin/fsck losetup /sbin/losetup options_allow * options_require nosuid,nodev smbmount /usr/bin/smbmount smbumount /usr/bin/smbumount ncpmount /usr/bin/ncpmount ncpumount /usr/bin/ncpumount umount /bin/umount lclmount /bin/mount --pass-fd 0 # Volumes that will be mounted when user triggers pam_mount module # # format: # volume <user> [smb|ncp|nfs|local] <server> <volume> <mount point> \ # <mount options> <cipher> <key> volume * local - /home/.&.img /home/& \ sync,loop,encryption=aes,keybits=256 aes-256-ecb /home/.&.key
Les deux dernieres lignes ne sont qu'une seul et unique ligne. Le caractere '&' est automatiquement remplacer par le login de l'utilisateur qui se connectera. L'image crypter du repertoire personnel de l'utilisateur se trouve dans le repertoire /home sous la forme .nom_d'utilisateur.img. La cle de cryptage se trouve dans le meme repertoire, dans le fichier .nom_d'utilisateur.key. Bien sur il est possible de placer ces fichier dans un autre repertoire. Les images de repertoires personnel de l'utilisateur sont bien sur proteger par une passphrase qui est mot de pass de l'utilisateur.
Par default la librairie PAM ne ferme pas la session de chaque utilisateur et n'appel jamais la fonction pam_close_session. Il faut modifier ce comportement pour demonter automatiquement le repertoire de l'utilisateur lorsque celui-ci se deconnect. Pour cela il faut regler la valeur de la variable CLOSE_SESSIONS a yes dans le fichier /etc/login.defs.
# # Enable pam_close_session() calling. When using normal (pam_unix.so) # session handling modules, this is not needed. However with modules # (such as kerberos or other persistent session models), login and su # need to fork and wait for the shell to exit so that sessions can be # cleaned up. # CLOSE_SESSIONS yes
La commande mount de la distribution Debian "unstable" ne supporte pas l'option "keybits". Pour que la commande prenne en compte cette option il faut appliquier un patch sur les sources de la commande et recompiler le package mount.
$apt-get source mountReading Package Lists... DoneBuilding Dependency Tree... DoneNeed to get 1907kB of source archives.Get:1 http://ftp.debian.org unstable/main util-linux 2.11z-4 (dsc) [641B]Get:2 http://ftp.debian.org unstable/main util-linux 2.11z-4 (tar) [1840kB]Get:3 http://ftp.debian.org unstable/main util-linux 2.11z-4 (diff) [66.0kB]dpkg-source: extracting util-linux in util-linux-2.11z$cd util-linux-2.11z/mount$wget -O - "http://etud.epita.fr/~nowick_c/mount.patch" 2> /dev/null | patch -p0patching file mount.c$cd ..$fakeroot#dpkg-buildpackage -b -uc...#suPassword:#dpkg -i ../mount_2.11z-4_i386.deb(Reading database ... 87184 files and directories currently installed.)Preparing to replace mount 2.11z-4 (using ../mount_2.11z-4_i386.deb) ...Unpacking replacement mount ...Setting up mount (2.11z-4) ...#dpkg --set-selectionsmount hold
Apres avoir installer le nouveau package mount il faut le geler a l'aide de l'option --set-selection de dpkg.
Il faut ensuite creer le fichier qui contient le repertoire de l'utilisateur. Ici nous creons un repertoire personnel d'une taille de 42Mo pour l'utilisateur "user". Il faut faire un backup de l'ancien repertoire personnel de l'utilisateur ou cas ou la manip tourne mal.
#dd if=/dev/urandom of=/home/.user.img bs=1M count=4242+0 records in42+0 records out44040192 bytes transferred in 24.981949 seconds (1762881 bytes/sec)
Il faut "broyer" le mot de pass de l'utilisateur pour le mettre dans le fichier qui se termine par key. Ici nous utilisons algorithme AES (Advanced Encryption Standard) avec une cle de 256 (32 characteres).
#dd if=/dev/urandom bs=1c count=32 | openssl enc \ -aes-256-ecb > /home/user.key32+0 records in32+0 records out32 bytes transferred in 0.001853 seconds (17269 bytes/sec)enter aes-256-ecb encryption password:Verifying - enter aes-256-ecb encryption password:
Il faut ensuite configurer le loop device pour que celui-ci assos-ci le fichier image et le fichier de la cle.
#openssl enc -d -aes-256-ecb -in /home/.user.key \ | losetup -e aes -k 256 -p0 /dev/loop0 /home/.user.imgenter aes-256-ecb decryption password:
Il faut ensuite cree un systeme de fichier (ext2fs, ext3fs, xfs, reiserfs, ...) sur le loop device. Et le "mounter" l'arboresence du systeme de fichiers. Changer le proprietaire du nouveau systeme de fichier pour que l'utilisateur ai les droits de cree un fichier dans son repertoire personnel. Apres il s'agit de migrer l'ancien repertoire personnel vers le nouveau. Et de demonter le loop device et effacer le cipher.
#mkfs -t ext3 -m 0 /dev/loop0mke2fs 1.34-WIP (21-May-2003)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)10752 inodes, 43008 blocks0 blocks (0.00%) reserved for the super userFirst data block=16 block groups8192 blocks per group, 8192 fragments per group1792 inodes per groupSuperblock backups stored on blocks:8193, 24577, 40961Writing inode tables: doneCreating journal (4096 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 21 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.#mount -t ext3 /dev/loop0 /mnt#cd /mnt#chown user. .#cp -pr /home/user/. .#sync#cd ..#umount /dev/loop0#losetup -d /dev/loop0
Pour verifier que tout fonctionne correctement il faut se connecter en utilisant le service que vous avez configurer. Et taper la commande mount dans le shell de l'utilisateur.
#mount | grep user/home/.user.img on /home/user type ext3 (rw,sync,loop=/dev/loop0,encryption=aes,keybits=256)
Et voila vos donnees sont maintenant chiffrer, il est impossible d'y acceder sans connaitre votre mot de pass et posserder le fichier .user.key. Attention de ne pas perdre ces fichiers. Il est conseiler de changer les attributs des ces fichiers pour ne pas les effacer par megarde :
#cd /home#chattr +i .*.key#chmod 600 .*.img#chmod 400 .*.key
Il est possible que dans certain cas le repertoire personel de l'utilisateur reste mounter meme lorsque celui-ci c'est deconnecter. Pour eviter cela il est d'executer la commande suivante a la fin de la session de l'utilisateur.
$fuser -mk /home/user