<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article lang="fr"><artheader><title>Mise en place d'un repertoire utilisateur chiffre sous
  Debian GNU/Linux</title><authorgroup><author><firstname>Nowicki</firstname><surname>Christophe</surname></author><author><firstname>Le-saux</firstname><surname>Julien</surname></author><author><firstname>Marbache</firstname><surname>Florent</surname></author></authorgroup><date>juillet 2003</date><legalnotice><para>         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.
      </para></legalnotice><copyright><year>2003</year><holder>Nowicki Christophe</holder><holder>Le-saux Julien</holder><holder>Marbache Florent</holder></copyright></artheader><abstract><title>Introduction</title><para>  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.
  </para></abstract><sect1><title>Les prerequis</title><para>  <itemizedlist><listitem><para>Un distribution Debian GNU/Linux 3.0 dite "unstable" ou "testing"</para></listitem><listitem><para>Les sources du Kernel Linux 2.4 : kernel-source-2.4.19</para></listitem><listitem><para>Une connection a l'internet.</para></listitem><listitem><para>Les outils pour compiler le noyau : kernel-package libncurses5-dev</para></listitem><listitem><para>GNU GPG pour verifier l'authenticite du patch : gnupg</para></listitem><listitem><para>La lib PAM mount : libpam-mount</para></listitem><listitem><para>OpenSSL : openssl</para></listitem><listitem><para>GNU Wget : wget</para></listitem></itemizedlist>
  </para></sect1><sect1><title>Patcher le noyau</title><para>  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  :
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">apt-get install kernel-sources-2.4.19</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cd /usr/src</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">tar xjf kernel-source-2.4.19.tar.bz2</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">ln -sf /usr/src/kernel-source-2.4.19 linux</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cd /usr/src/linux</userinput>
  </screen>
  </para><para>  Il faut ensuite recuperer le script appelle "International Kernel Patch Magic
  Installer" qui permet d'automatiser l'installation du patch international.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">wget -O - "www.kerneli.org/go?VersionDuKernel/CodePays" | sh</userinput>
  </screen>
  </para><para>  Il faut bien sur remplacer "VersionDuKernel" et "CodePays" par leur
  valeurs. Comme par exemple
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">wget -O - "www.kerneli.org/go?2.4.19/FR" | sh</userinput>
  </screen>
  </para><para>  Apres l'application du patch nous allons construire un package debian
  du kernel a l'aide de la commande make-kpkg 
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">make-kpkg kernel-image --append-to-version -crypto --config menuconfig</userinput>
  </screen>
  </para><para>  Lors de la configuration du kernel la partie la plus importante est :
  Cryptography support (CryptoAPI)
  <programlisting format="linespecific">  
  &lt;*&gt; CryptoAPI support (NEW)                                                           
  [*] Cipher Algorithms                                                                 
  --- 128 bit blocksize                                                                 
  &lt;M&gt;  AES (aka Rijndael) cipher (NEW)                                                  
  &lt;M&gt;  MARS cipher (NEW)                                                                
  &lt;M&gt;  RC6 cipher (NEW)                                                                 
  &lt;M&gt;  Serpent cipher (NEW)                                                             
  &lt;M&gt;  Twofish cipher (NEW)                                                             
  --- 64 bit blocksize                                                                  
  &lt;M&gt;  3DES cipher (NEW)                                                                
  &lt;M&gt;  Blowfish cipher (NEW)                                                            
  &lt;M&gt;  CAST5 cipher (NEW)                                                               
  &lt;M&gt;  GOST cipher (NEW)                                                                
  &lt;M&gt;  IDEA cipher (NEW)                                                                
  &lt;M&gt;  RC5 cipher (NEW)                                                                 
  --- Deprecated                                                                        
  &lt; &gt;  NULL cipher (NO CRYPTO) (NEW)                                                    
  &lt; &gt;  DES cipher (DEPRECATED) (NEW)                                                    
  &lt; &gt;  Old (mutated-endianess) Blowfish cipher (DEPRECATED) (NEW)                       
  [ ] Digest Algorithms                                                                 
  [*] Crypto Devices                                                                    
  &lt;M&gt;  Loop Crypto support (NEW)                                                        
  [ ]   Atomic Loop Crypto                                                              
  [*]   Loop IV hack                                                                    
  [ ]   Loop Crypto Debugging                                                           
  &lt; &gt;  IPSEC tunneling (ipsec_tunnel) support (NEW)    
  
  </programlisting>
  </para><para>  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 :
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dpkg -i kernel-image-2.4.19-crypto_10.00.Custom_i386.deb</userinput>
  </screen>
  </para><para>  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 :
  </para><para>  <programlisting format="linespecific">  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 
  </programlisting>
  </para><para>  Rebooter sur le nouveau kernel et verifier que le support de crypto
  api est bien charge :
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cat /var/log/dmesg | grep ^crypto</userinput>
  <computeroutput moreinfo="none">cryptoapi: loaded</computeroutput>
  <computeroutput moreinfo="none">cryptoloop: loaded</computeroutput>
  </screen>
  </para><para>  Voila, votre noyau supporte le chiffrement par block. 
  </para></sect1><sect1><title>Configurer le module PAM mount</title><para>  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) :
  </para><para>  <programlisting format="linespecific">  
    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
	
  </programlisting>
  </para><para>  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.
  </para><para>  <programlisting format="linespecific">  
  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 &lt;user&gt; [smb|ncp|nfs|local] &lt;server&gt; &lt;volume&gt; &lt;mount point&gt; \
  # &lt;mount options&gt; &lt;cipher&gt; &lt;key&gt;
	  
  volume * local - /home/.&amp;.img /home/&amp; \
  sync,loop,encryption=aes,keybits=256 aes-256-ecb /home/.&amp;.key
  
  </programlisting>
  </para><para>  Les deux dernieres lignes ne sont qu'une seul et unique ligne.
  Le caractere '&amp;' 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.
  </para><para>  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.
  </para><programlisting format="linespecific">  
  #
  # 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
  
  </programlisting></sect1><sect1><title>Patcher la commande mount</title><para>  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.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">apt-get source mount</userinput>
  <computeroutput moreinfo="none">Reading Package Lists... Done</computeroutput> 
  <computeroutput moreinfo="none">Building Dependency Tree... Done</computeroutput> 
  <computeroutput moreinfo="none">Need to get 1907kB of source archives.</computeroutput> 
  <computeroutput moreinfo="none">Get:1 http://ftp.debian.org unstable/main util-linux 2.11z-4 (dsc) [641B]</computeroutput> 
  <computeroutput moreinfo="none">Get:2 http://ftp.debian.org unstable/main util-linux 2.11z-4 (tar) [1840kB]</computeroutput> 
  <computeroutput moreinfo="none">Get:3 http://ftp.debian.org unstable/main util-linux 2.11z-4 (diff) [66.0kB]</computeroutput>    
  <computeroutput moreinfo="none">dpkg-source: extracting util-linux in util-linux-2.11z</computeroutput>
  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">cd util-linux-2.11z/mount</userinput>
  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">wget -O - "http://etud.epita.fr/~nowick_c/mount.patch" 2&gt; /dev/null | patch -p0</userinput>
  <computeroutput moreinfo="none">patching file mount.c</computeroutput> 
  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">cd ..</userinput>
  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">fakeroot</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dpkg-buildpackage -b -uc</userinput>
  <computeroutput moreinfo="none">...</computeroutput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">su</userinput>
  <computeroutput moreinfo="none">Password:</computeroutput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dpkg -i ../mount_2.11z-4_i386.deb</userinput>    
  <computeroutput moreinfo="none">(Reading database ... 87184 files and directories currently installed.)</computeroutput>
  <computeroutput moreinfo="none">Preparing to replace mount 2.11z-4 (using ../mount_2.11z-4_i386.deb) ...</computeroutput>
  <computeroutput moreinfo="none">Unpacking replacement mount ...</computeroutput>
  <computeroutput moreinfo="none">Setting up mount (2.11z-4) ...</computeroutput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dpkg --set-selections</userinput>                  <userinput moreinfo="none">mount hold</userinput>
  </screen>
  </para><para>  Apres avoir installer le nouveau package mount il faut le geler a
  l'aide de l'option --set-selection de dpkg.
  </para></sect1><sect1><title>Creer les repertoires personnels des utilisateurs</title><para>  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.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dd if=/dev/urandom of=/home/.user.img bs=1M count=42</userinput>
  <computeroutput moreinfo="none">42+0 records in</computeroutput>
  <computeroutput moreinfo="none">42+0 records out</computeroutput>
  <computeroutput moreinfo="none">44040192 bytes transferred in 24.981949 seconds (1762881 bytes/sec)</computeroutput>
  </screen>
  </para><para>  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).
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">dd if=/dev/urandom bs=1c count=32 | openssl enc \
  -aes-256-ecb &gt; /home/user.key</userinput>
  <computeroutput moreinfo="none">32+0 records in</computeroutput>
  <computeroutput moreinfo="none">32+0 records out</computeroutput>
  <computeroutput moreinfo="none">32 bytes transferred in 0.001853 seconds (17269 bytes/sec)</computeroutput>
  <computeroutput moreinfo="none">enter aes-256-ecb encryption password:</computeroutput>
  <computeroutput moreinfo="none">Verifying - enter aes-256-ecb encryption password:</computeroutput>
  </screen>
  </para><para>  Il faut ensuite configurer le loop device pour que celui-ci assos-ci
  le fichier image et le fichier de la cle.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">openssl enc -d -aes-256-ecb -in /home/.user.key \
  | losetup -e aes -k 256 -p0 /dev/loop0 /home/.user.img</userinput>
  <computeroutput moreinfo="none">enter aes-256-ecb decryption password:</computeroutput>
  </screen>
  </para><para>  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.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">mkfs -t ext3 -m 0 /dev/loop0</userinput>
  <computeroutput moreinfo="none">mke2fs 1.34-WIP (21-May-2003)</computeroutput>
  <computeroutput moreinfo="none">Filesystem label=</computeroutput>
  <computeroutput moreinfo="none">OS type: Linux</computeroutput>
  <computeroutput moreinfo="none">Block size=1024 (log=0)</computeroutput>
  <computeroutput moreinfo="none">Fragment size=1024 (log=0)</computeroutput>
  <computeroutput moreinfo="none">10752 inodes, 43008 blocks</computeroutput>
  <computeroutput moreinfo="none">0 blocks (0.00%) reserved for the super user</computeroutput>
  <computeroutput moreinfo="none">First data block=1</computeroutput>
  <computeroutput moreinfo="none">6 block groups</computeroutput>
  <computeroutput moreinfo="none">8192 blocks per group, 8192 fragments per group</computeroutput>
  <computeroutput moreinfo="none">1792 inodes per group</computeroutput>
  <computeroutput moreinfo="none">Superblock backups stored on blocks:</computeroutput>
  <computeroutput moreinfo="none">      8193, 24577, 40961</computeroutput>
  <computeroutput moreinfo="none">Writing inode tables: done</computeroutput>
  <computeroutput moreinfo="none">Creating journal (4096 blocks): done</computeroutput>
  <computeroutput moreinfo="none">Writing superblocks and filesystem accounting information: done</computeroutput>
  <computeroutput moreinfo="none">This filesystem will be automatically checked every 21 mounts or</computeroutput>
  <computeroutput moreinfo="none">180 days, whichever comes first.  Use tune2fs -c or -i to override.</computeroutput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">mount -t ext3 /dev/loop0 /mnt</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cd /mnt</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">chown user. .</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cp -pr /home/user/. .</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">sync</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cd ..</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">umount /dev/loop0</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">losetup -d /dev/loop0</userinput>
  </screen>
  </para><para>
  </para></sect1><sect1><title>Verifier que tout fonctionne correctement</title><para>  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.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">mount | grep user</userinput>
  <computeroutput moreinfo="none">/home/.user.img on /home/user type ext3 (rw,sync,loop=/dev/loop0,encryption=aes,keybits=256)</computeroutput>
  </screen>
  </para><para>  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 :
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">cd /home</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">chattr +i .*.key</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">chmod 600 .*.img</userinput>
  <prompt moreinfo="none">#</prompt><userinput moreinfo="none">chmod 400 .*.key</userinput>
  </screen>
  </para><para>  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.
  </para><para>  <screen format="linespecific">  <prompt moreinfo="none">$</prompt><userinput moreinfo="none">fuser -mk /home/user</userinput>
  </screen>
  </para></sect1></article>
