Mise en place d'un repertoire utilisateur chiffre sous Debian GNU/Linux

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

Les prerequis
Patcher le noyau
Configurer le module PAM mount
Patcher la commande mount
Creer les repertoires personnels des utilisateurs
Verifier que tout fonctionne correctement

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.

Les prerequis

  • 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

Patcher le noyau

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 ^crypto
  cryptoapi: loaded
  cryptoloop: loaded
  

Voila, votre noyau supporte le chiffrement par block.

Configurer le module PAM mount

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
  
  

Patcher la commande mount

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 mount
  Reading Package Lists... Done 
  Building Dependency Tree... Done 
  Need 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 -p0
  patching file mount.c 
  $cd ..
  $fakeroot
  #dpkg-buildpackage -b -uc
  ...
  #su
  Password:
  #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-selections                  mount hold
  

Apres avoir installer le nouveau package mount il faut le geler a l'aide de l'option --set-selection de dpkg.

Creer les repertoires personnels des utilisateurs

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=42
  42+0 records in
  42+0 records out
  44040192 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.key
  32+0 records in
  32+0 records out
  32 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.img
  enter 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/loop0
  mke2fs 1.34-WIP (21-May-2003)
  Filesystem label=
  OS type: Linux
  Block size=1024 (log=0)
  Fragment size=1024 (log=0)
  10752 inodes, 43008 blocks
  0 blocks (0.00%) reserved for the super user
  First data block=1
  6 block groups
  8192 blocks per group, 8192 fragments per group
  1792 inodes per group
  Superblock backups stored on blocks:
        8193, 24577, 40961
  Writing inode tables: done
  Creating journal (4096 blocks): done
  Writing superblocks and filesystem accounting information: done
  This filesystem will be automatically checked every 21 mounts or
  180 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
  

Verifier que tout fonctionne correctement

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