Kernel international

La meilleure méthode pour éviter la lecture de vos messages par des personnes peu scrupuleuses est le cryptage. De tout temps, cette méthode a fait ses preuves. Il en va de même pour les fichiers et en particulier pour les systèmes de fichiers. Un lecteur a relevé un jour ce qu'il a pris pour une faille de sécurité dans le système GNU / Linux. Il s'étonnait de pouvoir lire depuis Windows sa partition ext2 et surtout, de pouvoir lister le contenu de fichiers personnels du root ...

La solution est pourtant simple pour éviter ce type de manipulations, qui est en effet un risque encouru par bien des utilisateurs. Imaginez que vous stockiez des informations sensibles sur votre serveur GNU / Linux et que celui-ci vous soit volé. Le criminel aura ensuite tout le loisir de sortir vos disques du serveur pour y accéder depuis son propre système à l'aide d'une simple commande mount. Dans le cas de la plupart des systèmes, les informations stockées sont d'une importance minime, tout au plus quelques courriers ou notes à propos de vos employeurs, collègues ou petit(e)s ami(e)s ;-) : bref, rien de très grave. Dans le cas d'une comptabilité ou de documents stratégiques pour une entreprise, il en va autrement. Il faut prévenir le risque d'accès frauduleux à vos données. La solution proposée ici se met en place au niveau kernel : il s'agit tout simplement de la version internationale du Kernel Officiel (Kerneli). Il existe, bien sûr, d'autres projets de systèmes de fichiers cryptés mais celui-ci est sans doute le plus souple et le plus performant.

Principe de fonctionnement

Les fonctionnalités d'encryptage du kernel international sont basées sur une nouvelle version du périphérique loopback. Ce type de périphérique permet habituellement l'émulation d'un périphérique physique. L'exemple le plus courant est le montage d'une image de fichier ISO9660 (CD-Rom) dans un répertoire de l'arborescence.

mount -t iso9660 -o ro,loop=/dev/loop0 cd_image /cdrom

Cette commande permet de monter une image (cd_image) de type ISO (-t iso9660) via le périphérique loopback (/dev/loop0) dans le répertoire /cdrom. Il est ensuite possible de naviguer dans l'image ISO comme on le ferait avec le CD-Rom une fois gravé et monté de manière habituelle. Le même procédé s'applique de la même façon avec une image de disquette.

Dans le cas du cryptage, on crée de toute pièce une image d'un système de fichiers ext2, à laquelle on accédera via une version modifiée du périphérique loopback et des utilitaires associés. Le périphérique loopback aura la charge du cryptage / décryptage selon un algorithme de votre choix (DES, IDEA, blowfish, rc62, rc5, serpent, mars...).

Lorsque vous créerez le lien entre l'image ext2 et le périphérique avec les commandes que nous allons voir, vous allez créer un canal de communication décrypté vers cette image. Vous pourrez ensuite la monter comme une image ISO et y lire et écrire des fichiers. Si l'image vous est dérobée, elle sera inutilisable sans le mot de passe adéquat.

Installation

Notre exemple suit les recommandations du Howto disponible sur www.kerneli.org. Nous avons donc fait nos essais avec une version 2.2.10 du kernel et un patch version 2.2.10-4. Seule légère différence, les sources util-linux utilisées ici sont en version 2.9z et non 2.9s ou v comme l'indique le document pilote. De plus, par souci de précision, les sources du kernel 2.2.10 proviennent d'une distribution SuSE 6.2 où certaines modifications ont été apportées (support multilingue de l'interface de configuration du kernel). Nous tenons à apporter ces précisions car il est possible que les explications qui vont suivre ne correspondent pas exactement à votre configuration. Dans tous les cas : FAITES DES SAUVEGARDES et PREPAREZ UNE DISQUETTE DE BOOT DE SECOURS ! La modification d'un noyau à l'aide d'un patch n'est pas une chose à prendre à la légère. Nous vous conseillons fortement de faire vos essais (comme nous l'avons fait) sur un système GNU / Linux différent de celui que vous utilisez chaque jour.

Kernel

Récupérez sur le site http://www.kernel.org/pub/linux/kernel/crypto/ le patch correspondant à votre version du kernel. Créez un lien symbolique /usr/src/lin.x.x.x pointant vers /usr/src/linux, où x.x.x est le numéro de version du kernel (ici 2.2.10). Décompactez et appliquez le patch depuis /usr/src.

Exemple :

Z:/usr/src# gzip -d patch-int-2.2.10.4.gz
Z:/usr/src# patch -p0 < patch-int-2.2.10.4

A présent, lancez la configuration des sources (make config, menuconfig ou xconfig). Dans la section "Code maturity level options", activez "Prompt for développement and/or incomplete code/drivers". Dans la section "Crypto options", activez "Crypto ciphers" et une des méthodes de cryptage (ici "Serpent cipher"). Enfin, dans la section "Block devices", activez "Loop device support", "Use relative block numbers as basis bus transfer fonctions (RECOMMANDED)" et "General encryption support (EXPERIMENTAL)". Vous avez le choix entre une compilation "en dur" ou sous forme de modules. Nous avons choisi cette dernière solution dans notre exemple par souci de souplesse. Sauvegardez vos choix et compilez ce qu'il vous faut (kernel ou modules) selon la méthode habituelle. Si vous avez opté pour les modules, ajoutez ces alias dans votre /etc/conf.modules :

alias loop-xfer-gen-0 loop_gen
alias loop-xfer-gen-10 loop_gen
alias cipher-2 des
alias cipher-4 blowfish
alias cipher-6 idea
alias cipher-7 serp6f
alias cipher-8 mars6
alias cipher-11 rc62
alias cipher-15 dfc2
alias cipher-16 rijndael
alias cipher-17 rc5

Enfin, n'oubliez pas de lancer un petit depmod -a pour remettre à jour les dépendances.

Utilitaires :

Procurez-vous le package util-linux-2.9v, décompactez l'archive et appliquez-y le patch /usr/src/linux/Documentation/crypto/util-linux-2.9s.patch. Comme vous pouvez le constater, les lettres en fin de numéro de version sont différentes. Ceci ne semble pas poser de problème. Nous avons appliqué le patch "s" sur des sources "z" alors que le Howto recommande des sources "v" et ce, sans le moindre incident.

ATTENTION : util-linux comprend des utilitaires vitaux pour le démarrage et fonctionnement du système (init, mount, login...). Lisez plusieurs fois la documentation incluse avec ces sources ainsi que le fichier MCONFIG. Un mauvais paramétrage peut empêcher le fonctionnement de votre système. N'hésitez pas à sombrer dans la paranoïa la plus totale ! Compilez ces sources et... C'est là que les opinions divergent. Le Howto conseille une installation des utilitaires mais les deux seuls utilitaires qui nous intéressent sont mount et losteup. Nous avons choisi de simplement recopier les deux fichiers binaires aux bons endroits. Ce n'est pas élégant, mais c'est rapide et cela nous semble plus sécurisant. A vous de voir...

Utilisation

Maintenant que tout est en place, nous pouvons nous amuser un peu. Commencez par charger les modules adéquats :

Z:/# modprobe loop-xfer-gen-0
Z:/# modprobe cipher-7

Votre système est prêt à utiliser le système de fichiers cryptés selon une méthode de cryptage serpent. Comme expliqué plus haut, ce système de fichiers est stocké dans un fichier image. Il faut donc le créer :

Z:/# dd if=/dev/zero of=/etc/crypt.image bs=1k count 100000

Ceci créera un fichier /etc/crypt.image de 100 Mo rempli de... rien. Configurez ensuite le canal d'accès à l'image par le nouveau périphérique loopback :

Z:/# losetup -e serpent /dev/loop0 /etc/crypt.image

Un mot de passe vous sera alors demandé. Choisissez intelligemment quelque chose de long et de délibérément sans signification. Ceci permettra de déjouer une tentative d'attaque brutale (essais automatisés de mots de passe au hasard). Chose faite, vous pourrez initialiser le système de fichiers :

Z:/# mkfs -t ext2 /dev/loop0

Puis, montez-le dans le répertoire de votre choix (ici /mnt/crypt) :

Z:/# mount -t ext2 /dev/loop0 /mnt/crypt

Vous pouvez maintenant copier, supprimer, déplacer vos fichiers à mettre à l'abri des regards indiscrets. Pour protéger vos informations, démontez le système de fichiers et fermez le canal vers le périphérique loopback :

Z:/# umount /mnt/crypt
Z:/# losetup -d /dev/loop0

A partir de ce moment, le contenu du fichier image ne pourra être lu qu'avec le mot de passe correspondant. Dans le cas contraire, la commande losetup ne donnera pas de message d'erreur mais l'image semblera corrompue au moment du montage. En effet, le mot de passe étant incorrect, le système de fichiers ne sera pas décrypté et la commande mount n'y trouvera aucun système de fichiers connu.

Il existe d'autres méthodes pour crypter un système de fichiers : citons simplement CFS et TCFS utilisant un démon basé sur NFS. Vous trouverez toutes les informations nécessaires dans le Security-Howto.

Linux Magazine France n° 12 - Novembre 99