Chiffrer une partition d'un disque

Posté le Thursday, 24 August 2006 in SysAdmin

On peut se demander à quoi sert le chiffrage des partitions d'un disque sous Linux. Après tout, avec la gestion des droits on peut empêcher un utilisateur d'accéder à certain endroit du disque.

Maintenant, imaginez que vous travaillez pour une entreprise et que vous possédez des données confidentielles (les documents du dernier prototype de 'chez_pas_quoi', ...). En cas de vol de vos machines, un intrus peut lire le contenu du disque dur, avec un autre système d'exploitation, ou avec un autre Linux dont il aura les droits d'administrateur.

Heureusement, les données confidentielles auront été cachées dans une partition chiffrée du disque dur, et donc non accessible sans la clé de cryptage que vous aurez judicieusement choisie.

Les préparations

  • Il faut d'abord choisir une clé de chiffrage difficile à trouver. Souvent une suite de chiffres et de lettres minuscules/majuscules mélangées n'ayant aucune signification, constitue une véritable clé, difficilement cassable. Sont à proscrire les noms, les prénoms, les dates, ou tout autre événement lié à votre vie ou à la vie de l'entreprise.
  • Une partition vide. Cette partition doit être complètement vide de données afin de pouvoir la reformater dans un autre système de fichier. Il vous faudra donc utiliser un logiciel tel que Gnu/Parted, QtParted, Fdisk, LVM pour créer votre partition, ou utiliser un fichier à l'aide de l'interface Loop. Dans les exemples ci-dessous nous utiliserons un volume logique issu de LVM. Il aura été créé à l'aide de la commande

    lvcreate -L10G -n secure-close debian
    
  • Posséder un noyau 2.6 compiler avec le support Device-Manager, et DM-Crypt, ainsi que les utilitaires dmsetup et cryptsetup que vous installez sous Gnu/Debian Sarge à l'aide de la commande :

    apt-get install dmsetup cryptsetup openssl
    

Préparation de la partition2

Cas d'une partition

Si vous stockez des données chiffrées sur une partition contenant à l'origine des données non cryptées ou des blancs, il sera très facile de repérer les données chiffrées et les données claires, de voir la quantité de données chiffrées, voire même de les décrypter plus facilement. Nous allons donc nettoyer la partition en y écrivant des données aléatoires 1 :

dd if=/dev/urandom of=/dev/debian/secure-close

Cas d'un fichier

Vous pouvez aussi décider d'enregistrer vos données chiffrées dans un fichier (parce que vous n'avez plus d'espace libre pour une nouvelle partition par exemple). Pour cela, vous pouvez utiliser les commandes suivantes. Il vous faudra alors utiliser le périphérique /dev/loop0 dans la suite de l'article.

dd if=/dev/urandom of=/home/secure_close.img bs=1M count=10000
losetup /dev/loop0 /home/secure_close.img

Chiffrement de la partition et création du système de fichier

Nous allons maintenant ouvrir notre partition en tant que système chiffré et formater son contenu. Vous pourrez formater la partition avec le système de fichier de votre choix (ReiserFS, Ext3FS, Ext2FS, XFS, ....)

Sous Gnu/Debian Sarge :

openssl rand -base64 64 | head -n 1 | openssl aes-256-ecb > /home/secure_close.key

Cette ligne de commande va créer une clé de chiffrage dans le fichier secure_close.key et le protéger à l'aide de votre mot de passe. Cela vous permettra de changer votre mot de passe, sans reformater la partition. Cette commande vous demandera alors votre mot de passe, il ne faut maintenant plus l'oublier.

Maintenant nous allons chiffrer la partition à proprement parlé :

openssl enc -d -aes-256-ecb -in /home/secure_close.key | cryptsetup create secure-open /dev/debian/secure-close

Vous pourrez alors retrouver votre partition déchiffrée dans /dev/mapper/secure-open. Il ne vous reste plus qu'a créer le système de fichier, monter la partition et copier les fichiers à protéger. (Vous pouvez utiliser aussi un utilitaire d'effacement spécialisé pour écraser les fichiers avec un contenu aléatoire avant de réellement le supprimer.)

Sous Debian etch/sid :

Sous Debian etch/sid, il est possible d'utiliser Luks pour le chiffrage. Cela permet de stocker la clé au début de la partition, et de pouvoir la modifier ultérieurement sans reformater. Cela permet de ne plus avoir de fichier séparé avec la clé.Pour formater une partition au format Luks et ainsi l'initialiser avec le mot de passe de protection, il faut utiliser la commande suivante (Attention à ne pas oublier le mot de passe) :

cryptsetup luksFormat /dev/debian/secure-close

Après cela, on se retrouve avec une partition chiffré vierge. Il faut donc l'ouvrir pour pouvoir ensuite y installer un système de fichier et des fichiers. Pour cela, on utilise la commande suivante qui va associer à notre partition chiffrée une partition déchiffrée (virtuelle)

cryptsetup luksOpen /dev/debian/secure-close secure-open

Préparation et protection des données

mke2fs -j /dev/mapper/secure-open
mount -t ext3 /dev/mapper/secure-open /mnt
cp -a dossiers_confidentiels/* /mnt/

Une fois que vous avez fini, vous pouvez démonter la partition, et supprimer l'accès au contenu déchiffré.

umount /mnt

Si vous n'utilisez pas Luks (sous Gnu/Debian Sarge) :

cryptsetup remove secure-open

Si vous utilisez Luks, la commande est

cryptsetup luksClose secure-open

Et si vous avez créé un périphérique loop :

losetup -d /dev/loop0

Utilisation courante :

Dans une utilisation courante vous allez monter la partition quand vous voudrez y accéder, et la démonter quand vous ne l'utiliserez plus.Le montage de la partition se fait à l'aide des commandes ci-dessous, si vous n'utilisez pas Luks :

openssl enc -d -aes-256-ecb -in /home/secure_close.key | cryptsetup create secure-open /dev/debian/secure-close
mount -t ext3 /dev/mapper/secure-open /mnt

et à partir de la commande suivante si vous utilisez Luks

cryptsetup luksOpen /dev/debian/secure-close secure-open
mount -t ext3 /dev/mapper/secure-open /mnt

Le démontage de la partition est identique :

umount /mntcryptsetup remove secure-open

ou

umount /mntcryptsetup luksClose secure-open

Changement de mot de passe

Quand vous souhaitez changer de mot de passe, vous pouvez utiliser la commande suivante :

Sans Luks

echo `openssl enc -d -aes-256-ecb -in /home/secure_close.key` | openssl aes-256-ecb > /home/secure_close.key

Avec Luks

cryptsetup luksDump /dev/debian/secure-close

pour voir quels sont les slots utilisés.puis

cryptsetup luksAddKey /dev/debian/secure-closecryptsetup luksDelKey [ancien slot]

Un script pour le montage et le démontage automatique

Voici un script que vous pouvez utiliser en root ou à l'aide de la commande sudo pour monter et démonter vos partitions chiffrer3 :

#!/bin/sh

if [ -e /dev/mapper/secure-open ] ; then
        umount /home/secure 2> /dev/null
        if [ $? != 0 ] ; then
                kdialog --title KSecure --error "Impossible de démonter le périphérique"
        fi
        if [ -e /dev/mapper/secure-open ] ; then
                /sbin/cryptsetup remove secure-open
                kdialog --title KSecure --msgbox "Suppression du périphérique accomplie"
        fi
 else
        password=`kdialog --title KSecure --password "Clé de déchiffrement"`
        if [ -z $password ] ; then
                password="nopassword"
        fi
        echo "$password" | \
        openssl enc -d -aes-256-ecb -in ~/compte/secure.cle -kfile /dev/stdin | \
        /sbin/cryptsetup create secure-open /dev/debian/secure-close 2> /dev/null
        mount /home/secure 2> /dev/null
        if [ $? -ne  0 ] ; then
                kdialog --title KSecure --error "Clé incorrecte"
                /sbin/cryptsetup remove secure-open
        fi
fi

  1. Attention, cela détruira le contenu de la partition que vous assainissez. 

  2. Les différentes commandes sont inspirés du site http://docisland.blogspot.com/

  3. Vous pourrez trouver un script pour le format Luks dans les commentaires ou dans la partie Script du site. 

Commentaires

1. Le 2006-02-23 18:33:46+01:00 par Nicolas

je viens de parcourrir ta documentation et j'ai quelques soucis.

Voila, je suis en master 2 Sécurité des Systèmes Informatiques et j'ai un projet de fin d'études à réaliser. Il consiste, entre autres, à sécuriser les données d'utilisateurs.

Pour celà, nous avons installé un serveur de clefs couplé à un annuaire LDAP et nous devons sécuriser les données du home des utilisateurs sous Debian.

Style :

/home
---/toto
------/donnéesNonCryptées
------/donnéesCryptées
---/autreUser
------ etc...

Cependant je ne vois pas comment crypter seulement un dossier de chaque home. Pourrais-tu me conseiller, car il me semble que tu maitrises bien dmcrypt.

Merci d'avance.

Nicolas

2. Le 2006-02-25 11:50:13+01:00 par Diplodocus

Bonjour,

Deux solutions sont possible :

  • Si vous voulez que chaque home de chaque utilisateurs soit chiffré et monté au moment de la connexion avec le mot de passe de l'utilisateur, vous pouvez regarder du coté de libpam-mount. Il vous faudra alors faire un fichier chiffré par utilisateur ainsi qu'un fichier contenant la clé (chiffré avec le mot de passe de l'utilisateur) par utilisateur également.

    Pour installer libpam-mount et dmsetup, vous pouvez utilisez, sous Debian la commande suivante :

    apt-get install libpam-mount cryptsetup openssl
    

    Ensuite à la fin du fichier /etc/pam.d/common-auth, vous ajoutez, s'il n'existe pas déjà :

    auth    optional        pam_mount.so use_first_pass
    

    Pareil pour le fichier /etc/pam.d/common-session

    session optional        pam_mount.so
    

    Et mettre dans le fichier /etc/login.def:

    CLOSE_SESSIONS yes
    

    Et dans le cas d'un utilisateur s'appelant phoenix, vous pouvez ajoutez la ligne suivante dans le fichier /etc/security/pam_mount.conf :

    volume phoenix crypt - /dev/hda4 /home/phoenix cipher=aes aes-256-ecb /home/phoenix.key
    

    Le problème de cette solution, c'est que c'est le dossier utilisateur complet qui est chiffré et non un des dossiers de l'utilisateur. Je ne pense pas que cela corresponde vraiment à ce que vous cherché, mais peut peut-être vous aider.

  • La seconde solution, c'est de chiffrer un fichier (mis dans la partie donnéesNonCryptées) qui sera monté par l'utilisateur lui-même, ou un scripte qui à la possibilité de connaître le mot de passe.

    Le but sera alors d'écrire un script qui demandera le mot de passe à l'utilisateur ou qu'il ira récupérer par LDAP par exemple si celui-ci est accessible par ce moyen. Une fois le mot de passe obtenue, le script peut utiliser les outils pour monter le fichier /home/$LOGNAME/donneesNonCryptees/$LOGNAME.part dans /home/$LOGNAME/donneesCryptees comme expliqué au dessus.

    Ensuite on peux utiliser sudo pour permettre à l'utilisateur d'appeler la commande avec les droits de l'administrateur (donc d'utiliser cryptsetup) sans mot de passe, mais il faut veiller qu'il n'y ai pas de faille dans le script.

    Si la base LDAP connais le mot de passe, vous pouvez modifier le script pour qu'il aille chercher le mot de passe sur l'annuaire LDAP au lieu de le demander à l'utilisateur. Tu peux ainsi ajouter cette commande dans le fichier /etc/bash.bashrc pour qu'elle soit exécuté automatiquement lorsque l'utilisateur se connecte. (Il faut aussi à penser à démonter la partition lorsque l'utilisateur se déconnecte.)

Par ailleurs dans la version instable de Debian, la version de cryptsetup utilise LUKS. Voici une modification du scripte que j'ai fais (pas forcément bien sécurisé), passant par kdialog pour demander le mot de passe

#!/bin/sh

DISK=$1
DISKOPEN="$DISK-open"
DISKCLOSE="$DISK-close"

if [ -e /dev/mapper/$DISKOPEN ] ; then
    umount /dev/mapper/$DISKOPEN 2> /dev/null
    if [ $? != 0 ] ; then
        kdialog --title KSecure --error "Impossible de démonter le périphérique $DISK"
    fi
    if [ -e /dev/mapper/$DISKOPEN ] ; then
        /sbin/cryptsetup luksClose $DISKOPEN
        kdialog --title KSecure --msgbox "Suppression du périphérique $DISK accomplie"
    fi
else
    password=`kdialog --title KSecure --password "Clé de déchiffrement de $DISK"`
    if [ -z $password ] ; then
        password="nopassword"
    fi
    echo "$password" | \
        /sbin/cryptsetup luksOpen /dev/debian/$DISKCLOSE $DISKOPEN 2> /dev/null
    mount /dev/mapper/$DISKOPEN 2> /dev/null
    if [ $? -ne  0 ] ; then
      kdialog --title KSecure --error "Clé incorrecte"
    fi
fi

3. Le 2006-03-23 15:36:30+01:00 par mitch

Bonjour,

c'est marrant mais les lignes de commande de création de la partition chiffrée avec cryptsetup, openssl, head, me disent quelque chose :) les noms aussi ... ;)

4. Le 2006-03-23 15:47:03+01:00 par Diplodocus

Ce n’est pas faux, ton site me dit aussi quelque chose.

Je m'en suis inspiré (de lui mais aussi de d'autre) pour faire des essais sur mon propre disque, après avoir pris des notes. Mais ensuite je n'ai pas retrouvé d'où j'avais pris mes notes :(

Ensuite j'en ai fais un scripte, si cela t'intéresse.

5. Le 2006-04-06 23:14:05+02:00 par Tante Dominique

C'est de la musique ? LOL Si c'est un accord parfait, tu chiffres 5, pour son premier renversement, tu chiffres 6, pour le 2ème renversement tu chiffres 6 et 4, ;-( pour un accord de septième, tu chiffres 5 et 7, 8-O 7+ si c'est une septième majeure, etc... ;-( Demande à Aliénor LOL , elle comprend mieux que toi.... ;-(

Gros Bisous à Tertous, dominique ;-(

6. Le 2006-04-07 19:47:42+02:00 par Diplodocus

Maiiiiis nooooonnnnn ! Rien avoir avec la musique, mais avec les partitions d'un disque dur :) Bien plus intéressant ;)

7. Le 2006-04-19 23:13:20+02:00 par Tante Dominique

;-) Ah! Ah! Je le savais bien, va ! Mais c'était une farce ! Et si tu dis que la musique, c'est pas interessant, ;-( Fabien et ;-( Cynthia vont pleurer.i ;-(

8. Le 2006-08-20 20:33:24+02:00 par mx

Bonjour,

J'ai suivi ton document pour chiffrer une partition. N'étant pas informaticien, j'ai buté assez rapidement sur des problèmes. Je me permets d'écrire pour faire part de mon expérience de simple utilisateur néophyte.

Sur debian testing (etch) :

# apt-get install dm-setup dm-crypt

ne donne rien, les paquets n'existent pas.

#apt-get install dmsetup cryptsetup

fonctionne sur debian etch

La ligne :

#openssl enc -d aes-256-ecb -in /home/secure_close.key | cryptsetup secure-open /dev/debian/secure-close

ne fonctionne pas, cryptsetup est invoqué sans options

Je suppose (cf. man) que ce doit être :

#[...]cryptsetup create secure-open /dev/debian/secure-close

voila, après ça je suis arrivé au bout de la manip.

Merci pour c'est aide en ligne.

mx

9. Le 2006-08-22 09:54:46+02:00 par Diplodocus

Oui, c'est vrai

Sur mon ordinateur personnel, je suis sur la distribution instable de Debian. Et il est vrai que mes scripts ont évolué avec la distribution mais pas mon blog :( .

Je vais essayé d'éclaircir ce point pendant mes vacances, les commandes ci-dessous concernant sarge (avec des peut-être des erreurs), si je ne me trompe (voir même woody)

Enfin cela reste à vérifier, je verrais des tests chez moi, et modifier l'article en conséquence

Merci pour tes précisions

10. Le 2006-08-24 16:20:24+02:00 par Diplodocus

L'article a été corrigé pour prendre en compte les remarques et l'évolution des distributions. Les commandes concernés bien sarge mais était un peu fausse.

J'ai aussi ajouté une partie sur Luks qui est apparu avec etch

11. Le 2007-08-19 14:17:12+02:00 par NosTroMo

merci

12. Le 2008-02-22 15:59:42+01:00 par MrBark

saut, sympa ton blog ! vraiment agréable de lire ttes billets. pour en revenir à ce billet, parfois cedrtaines parenthèsés en disent bien + que le reste de la phrase:v "attention a ne pas oublier le mot de passe" :)