HSC
Cabinet de consultants en sécurité informatique depuis 1989 - Spécialisé sur Unix, Windows, TCP/IP et Internet
Mode texte : accès au contenu de la page
Hervé Schauer Consultants
Vous êtes ici : Accueil > Ressources > Brèves > Mise en place de Cryptsetup avec LUKS
Accéder au : Site HSC des formations
Recherche :  
English version
   Services   
o Domaines de compétences
o Conseil & Expertise
o Prestations ISO 27001
o Audit & Évaluation
o Tests d'intrusion
o Tests de vulnérabilités (TSAR)
o Analyse Forensique
o Certification ARJEL
o Formations
o E-learning
   Conférences   
o Agenda
o Interventions passées
o Tutoriels
   Ressources   
o Index thématique
o Brèves
o Présentations
o Cours
o Articles
o Outils (téléchargement)
o Veille en vulnérabilité
   Société   
o Hervé Schauer
o Equipe
o Offres d'emploi
o Références
o Historique
o Partenariats
o Associations
   Presse et
 communication
 
 
o Newsletter HSC
o Bulletin juridique HSC
o Revue de presse
o Communiqués de presse
o Publications
   Contacts   
o Coordonnées
o Requêtes particulières
o Accès à nos locaux
o Hôtels proches de nos locaux
|>|Mise en place de Cryptsetup avec LUKS  

par Jérôme Poggi (07/03/07)



Utilisation de Cryptsetup avec LUKS (Linux Unified Key Setup)
-------------------------------------------------------------

Cette brève explique comment mettre en place une partition chiffrée 
par utilisateur avec une clef de recouvrement pour toutes les 
partitions.

1 - Installer Cryptsetup + LUKS
-------------------------------

Soit votre distribution le supporte, soit il faut y aller à la main.
Par exemple sous Gentoo, il suffit d'installer le package
sys-fs/cryptsetup-luks plutôt que sys-fs/cryptsetup.

Sinon :
$ wget http://luks.endorphin.org/source/cryptsetup-1.0.5.tar.bz2
$ tar -xvjf cryptsetup-1.0.5.tar.bz2
$ cd cryptsetup-1.0.5/
$ ./configure --prefix=/usr/local
$ make
# make install

Et voila, normalement tout est installé dans /usr/local/sbin et 
/usr/local/bin. Si vous voulez remplacer ou écraser le cryptsetup 
existant, il suffit d'enlever l'option --prefix=/usr/local au 
lancement de ./configure

2 - Créer le volume RAID-1
--------------------------

Par exemple, nous allons créer un LV (Volume Logique) sur le disque /dev/hda
avec comme miroir /dev/hdb :
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda /dev/hdb

Évidemment, le md0 est à changer suivant votre configuration et les 
existants.

Pour voir où en est la duplication, il suffit de regarder dans /proc/mdstat.

# cat /proc/mdstat 
Personalities : [raid0] [raid1] [faulty]
md0 : active raid1 hdb[1] hda[0]
      488386496 blocks [2/2] [UU]
      [>....................]  resync =  0.0% (233344/488386496)
finish=209.1min speed=38890K/sec

unused devices: <none>

Dans notre cas, la durée de création du LV est assez longue car on
travaille sur deux disques de 500Go en SATA.

Pour parfaire le travail on va créer le PV (Volume Physique) avec la commande 
suivante :

# pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created
# pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/md0        lvm2 --   465.76G 465.76G

Tout a l'air OK.

3 - Créer le groupe de volume conteneur
---------------------------------------

Maintenant, il va falloir créer un VG (Groupe de Volume) permettant 
de contenir les futurs volumes chiffrés. Pour cela, nous utiliserons 
la commande suivante :
# vgcreate -l 0 -p 0 -s 8M vg_sauv /dev/md0
  Volume group "vg_sauv" successfully created

J'ai pris une taille de bloc d'allocation minimum à 8 Méga octets vu 
la taille du VG. Et surtout, je n'ai pris aucune limite pour le nombre 
de LV et de PV contenu dans ce VG, ça laisse de la marge :-)
Sinon, si vous êtes puriste, vous pouvez toujours les limiter. Par 
exemple :
# vgcreate -l 256 -p 8 -s 8M vg_sauv /dev/md0

Le nombre de PV ne devrait pas être trop grand car nous n'allons pas 
en utiliser dans ce VG. Par contre, il va y avoir un LV par utilisateur, 
donc visez juste.

4. Création de la clef de recouvrement
--------------------------------------

Il nous faut une clef particulièrement aléatoire de 256 bits puisque
nous avons choisi un chiffrement AES 256 bits. DéDé est là pour nous
aider à extraire ce qu'il faut de /dev/random : 

$ dd if=/dev/random of=/root/RecoveryKey bs=32 count=1

Pourquoi 32 ? Parce que 32x8=256  :-)

5 - Créer et formater les partitions LUKS
-----------------------------------------

5.A. Initialisation de la partition coté root
---------------------------------------------

Tout d'abord, créons notre LV de 10Go :
# lvcreate -L10G -n lv_poggi_crypt vg_sauv

Définissez bien la taille du LV, car une fois créée, modifier la taille 
n'est pas une chose aisée.

J'ai choisi la convention de nommage suivante :
LV chiffrée : lv_$USER_crypt
LV en clair : $USER_clair

Pour utiliser des "partitions LUKS" ou plutôt des LV de type LUKS, nous 
allons avoir besoin de la clef de recouvrement, et nous allons l'utiliser 
comme clef stockée dans le SLOT 0 de notre LV.

# cryptsetup --batch-mode --hash=sha256 --key-size=256 --cipher=aes \
             --key-file=/root/RecoveryKey luksFormat 
             /dev/mapper/vg_sauv-lv_poggi_crypt \
             /root/RecoveryKey

Maintenant, il faut installer une "clef bidon" pour ne jamais donner la 
clef de recouvrement et surtout pour installer la clef qui sera définie 
par l'utilisateur lors de la phase d'initialisation. Cette dernière phase 
pourra se faire sans l'intervention d'un administrateur et donc rendra le 
processus plus "light".

# echo "clef bidon" | \
cryptsetup --batch-mode --hash=sha256 --key-size=256 \
           --cipher=aes --key-file=/root/RecoveryKey luksAddKey \
           /dev/mapper/vg_sauv-lv_poggi_crypt

Ici, il faut quand même donner la clef de recouvrement, mais ce n'est que 
pour installer la clef "bidon". Évidemment la clef "bidon" étant quand même 
un peu sensible, il est fortement recommandé d'en choisir une un peu mieux. 
Tout en sachant qu'elle va trainer en clair dans un batch d'initialisation 
lancé par l'utilisateur. Attention au droit par conséquent ;-) pas de 777 ou 
autre fantaisie que l'on retrouve de temps en temps en audit ...

Pour être sûr que tout est OK, on peut lancer la sous commande luksDump de
cryptsetup :

# cryptsetup luksDump /dev/mapper/vg_sauv-lv_poggi_crypt
LUKS header information for /dev/mapper/vg_sauv-lv_poggi_crypt

Version:        1
Cipher name:    aes
Cipher mode:    cbc-plain
Hash spec:      sha1
Payload offset: 2056
MK bits:        256
MK digest:      e0 40 4e 1b 03 53 4e 4f 54 8e 10 54 96 87 24 1c 8e 7d 4b 30 
MK salt:        53 70 31 03 60 1f d9 0a ea c2 3c 37 fd 63 36 f2 
                e5 cc 74 2d ac 7d 6c a3 cd f6 3b 74 70 05 39 cb 
MK iterations:  10
UUID:           07ba4f54-0e66-4a38-964d-67a15c0f1722

Key Slot 0: ENABLED
        Iterations:             76853
        Salt:                   19 a1 cc 71 77 38 74 cb 60 74 f7 61 7d 8a ea 7a 
                                6e 73 75 6c 74 61 6e 74 73 03 83 35 f7 81 a8 15 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             69289
        Salt:                   65 72 6f 6d 65 2e 50 6f 67 67 69 40 68 73 63 2e
                                48 65 72 76 65 20 53 63 68 61 75 65 72 20 43 6f
        Key material offset:    264
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Juste en passant, ce ne sont pas les même valeurs que chez moi ;-)

Évidemment, on peut scripter tout ça comme suivant :

#!/bin/sh
CLEF_BIDON_DINITIALISATION="phai1ah7ain6eeLo"
for User in arnault collignon dembour feil poggi
do
  cryptsetup --batch-mode --hash=sha256 --key-size=256 --cipher=aes \
    --key-file=/root/RecoveryKey luksFormat /dev/mapper/vg_sauv-lv_${User}_crypt \
    /root/RecoveryKey
  echo "$CLEF_BIDON_DINITIALISATION" | \
    cryptsetup --batch-mode --hash=sha256 --key-size=256 \
    --cipher=aes --key-file=/root/RecoveryKey luksAddKey \
    /dev/mapper/vg_sauv-lv_${User}_crypt
  cryptsetup luksDump /dev/mapper/vg_sauv-lv_${User}_crypt
done


5.B. Initialisation de la partition coté utilisateur
----------------------------------------------------

Pour l'instant, la partition n'est pas utilisable par l'utilisateur, le
système de fichiers n'est même pas créé. Il va falloir faire les
opérations suivantes :
- Ajout de la clef de chiffrement chiffrée avec la pass-phrase de
  l'utilisateur :
# cryptsetup  --verify-passphrase --batch-mode --hash=sha256 \
	--key-size=256 --cipher=aes \
	--key-file=FichierContenantLaClefTemp luksAddKey \
	/dev/mapper/vg_sauv-lv_poggi_crypt

- Ouverture du conteneur luks avec la pass-phrase de l'utilisateur :
# cryptsetup luksOpen /dev/mapper/vg_sauv-lv_poggi_crypt poggi_clair

- Destruction de la clef temporaire d'initialisation :
# cryptsetup luksDelKey /dev/mapper/vg_sauv-lv_poggi_crypt 1

- Création du système de fichiers :
# /sbin/mkfs.ext2 -q /dev/mapper/poggi_clair

- Montage sur le répertoire destination :
# /bin/mount -o sync /dev/mapper/poggi_clair /home/poggi/crypt

- Changement des droits pour donner à l'utilisateur l'inode une fois
  monté :
# /bin/chown poggi:0 /home/poggi/crypt
# /bin/chmod 700 /home/poggi/crypt
# /bin/chmod u+s /home/poggi/crypt

- démontage et fermeture du conteneur chiffré :
# /bin/umount /dev/mapper/poggi_clair
# cryptsetup remove poggi_clair
  ou
# cryptsetup luksClose poggi_clair

- Protection du conteneur chiffré et marquage du point de montage,
  pour marquer que le conteneur a été initialisé et pour éviter que
  l'utilisateur détruise sans le vouloir ce point de montage ou le
  conteneur : 
# /bin/chown root:root /home/poggi/crypt/.conteneur_chiffre_deja_cree
# /bin/chmod 444 /home/poggi/crypt/.conteneur_chiffre_deja_cree
# echo "Fichier permettant de savoir si le conteneur chiffré a déjà été créé" > \
#       /home/poggi/crypt/.conteneur_chiffre_deja_cree
# echo "NE PAS SUPPRIMMER !!! SINON le programme va détruire le conteneur chiffré !!!" >> \
#       /home/poggi/crypt/.conteneur_chiffre_deja_cree
# /bin/chattr +i /home/poggi/crypt/.conteneur_chiffre_deja_cree

- Ajout du point de montage dans /etc/fstab :
# echo "/dev/mapper/poggi_clair /home/poggi/crypt ext2 noauto,user,sync,rw 0 0" >> /etc/fstab

À partir de ce moment, l'utilisateur peut monter facilement sa partition
sans avoir besoin de quelques connaissances que ce soit.


6 - Scripts de montage / démontage / initialisation
---------------------------------------------------

Ils sont disponibles ici :
MC : Pour monter la partition 
http://www.hsc.fr/~poggi/scripts/MC

UC : pour la démonter
http://www.hsc.fr/~poggi/scripts/UC

InitConteneurChiffre : Pour initialiser la partition
http://www.hsc.fr/~poggi/InitConteneurChiffre
Seul ce script a besoin d'être lancé avec des droits root.

Ici nous utilisons sudo (extrait de /etc/sudoers)

User_Alias      HSC     = arnault collignon dembour feil poggi

Cmnd_Alias      CRYPTSETUP  = /bin/cryptsetup, /usr/local/sbin/InitConteneurChiffre
Cmnd_Alias      TUNE2FSL = /sbin/tune2fs -l /dev/mapper/[a-z]*_clair
Cmnd_Alias      FSCK = /sbin/fsck -C -T -f -a /dev/mapper/[a-z]*_clair
Cmnd_Alias      TUNE2FSC = /sbin/tune2fs -c 30 /dev/mapper/[a-z]*_clair

HSC      ALL=(root)     NOPASSWD: CRYPTSETUP, TUNE2FSL, FSCK, TUNE2FSC

Vous pourrez voir qu'il y a pas mal de code en plus dans les scripts, 
mais c'est pour attraper les erreurs, et autre sorties de programmes ... :-)


7 - L'explication technique
---------------------------

Le challenge était d'avoir une clef de recouvrement, et de donner la 
possibilité à l'utilisateur de choisir son mot de passe quand bon
lui semblait.

Pour cela, nous avons utilisé le slot 0 comme slot pour la clef de
recouvrement. Et les 3 autres sont à disposition de l'utilisateur.

Il est alors possible de permettre à 4 personnes différentes d'accéder 
à un même conteneur chiffré avec 4 mots de passe différents.

En fait, la véritable clef de chiffrement, celle qui sert véritablement
à chiffrer/déchiffrer les données, est stockée dans au moins un des 4 
conteneurs (slot). Et chaque slot (initialisé) est protégé par un mot de 
passe différent.


8 - Références
--------------

- Site de LUKS
  http://luks.endorphin.org/

- Site de pwgen
  http://sourceforge.net/projects/pwgen/

- Site de sudo
  http://www.sudo.ws/



Dernière modification le 30 novembre 2007 à 15:40:18 CET - webmaster@hsc.fr
Informations sur ce serveur - © 1989-2013 Hervé Schauer Consultants