Tu penses avoir une protection à toute épreuve contre l'accès aux données de tes disques durs : tu les caches sous ton oreiller et dans tes piles de t-shirts (sales ou pas, ça dépend du niveau de protection souhaitée). Ce que tu ne sais pas, c'est que même le chat des voisins sait où tu les ranges. Et tellement la routine de ces actions te saoule que tu as fini par capituler et les laisser en place dans leurs boîtiers.
Heureusement, il existe plus seyant et plus pratique que les immondes disques durs dans des caddies extractibles, et tu vas pouvoir te balader l'esprit plus tranquille pour les données de ton notebook ou celles de ta workstation, si jamais tu venais à en être séparé malgré toi.
À compter de maintenant, si tu continues à te faire piquer tes billes par les copains de récré, c'est que tu l'auras bien voulu !
NetBSD : CGD
Qu'est-ce que CGD ?
CGD signifie cryptographic disk driver. La jolie page de man le décrivant se trouve là : http://netbsd.gw.com/
cgi-bin/man-cgi?cgd.
C'est un système d'encryption par bloc implémenté au niveau du kernel. Les algorithmes disponibles sont :
- aes-cbc ;
- 3des-cbc ;
- blowfish-cbc.
L'outil pour manipuler CGD s'appelle cgdconfig. Sa page de man est ici : http://netbsd.gw.com/cgi-bin/
man-cgi?cgdconfig.
Il est nécessaire que le support pour CDG soit ajouté à la configuration de votre kernel avant de pouvoir l'utiliser (on s'en douterait m'ame Michu, mais c'est un rappel pour ceux qui ne sont pas allé lire les liens ci-dessus).
Le chapitre dédié à CGD dans le Guide NetBSD se trouve à cette URL : http://www.netbsd.org/guide/en/
chap-cgd.html. Il est très complet et bien détaillé.
Dans le vif du sujet
On va utiliser une partition disponible et déjà prête. La commande suivante crée le fichier de paramètres (paramsfile) /etc/cgd/wd1e, utilisant l'algorythme aes-cbc, une méthode de vérification disklabel et une clé d'une taille de 256 bits.
# cgdconfig -g -V disklabel -o /etc/cgd/wd1e aes-cbc 256
Du fait du choix de la méthode de vérification (disklabel) et de l'absence dudit disklabel sur le disque logique, on doit " forcer " le mécanisme de vérification pour la première configuration de CGD.
# cgdconfig -V re-enter cgd0 /dev/wd1e /dev/wd1e's passphrase: <password> re-enter device's passphrase: <password>
On vérifie le disklabel :
# disklabel -e -I cgd0 # /dev/rcgd0d: type: cgd disk: cgd label: fictitious flags: bytes/sector: 512 sectors/track: 2048 tracks/cylinder: 1 sectors/cylinder: 2048 cylinders: 13703 total sectors: 28065492 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 28065492 0 4.2BSD 0 0 0 # (Cyl.0-13703*) d: 28065492 0 unused 0 0 # (Cyl.0-13703*)
Et on formate la partition encryptée.
# newfs /dev/cgd0a
/dev/cgd0a: 13703.9MB (28065492 sectors) block size 16384,
fragment size 2048
using 75 cylinder groups of 182.72MB, 11694 blks,
23040 inodes.
super-block backups (for fsck_ffs -b #) at:
32, 374240, 748448, 1122656, 1496864, 1871072, 2245280,
2619488, 2993696, 3367904, 3742112, 4116320, 4490528,
4864736, 5238944,
.........................................................
On fait un fsck sur le volume encrypté, on le mounte et on y met un fichier témoin.
# fsck -t ffs /dev/cgd0a /dev/rcgd0a File system is clean; not checking # mount -t ffs /dev/cgd0a /mnt # touch /mnt/test.txt
Vérification de la détection du volume par les scripts de boot :
- on ajoute
cgd=YESdans le fichier/etc/rc.conf. - on configure le fichier
/etc/cgd/cgd.conf.
cgd0 /dev/wd1e
- on ajoute le point de montage dans
/etc/fstab.
/dev/cgd0a /crypted ffs rw,softdep,noatime,nodevmtime,nocoredump 2 2
On vérifie que le script /etc/rc.d/cgd retrouve ses petits :
# /etc/rc.d/cgd start
Configuring CGD devices.
/dev/wd1e's passphrase:
# mount -a
# mount
/dev/cgd0a on /crypted type ffs
(nocoredump, noatime, nodevmtime,
soft dependencies, local)
Voilà , on vient de vérifier que notre configuration CGD était reconnue par le système. Il reste à procéder à un test grandeur nature en redémarrant sa machine.
Si tout est configuré correctement, le système demandera ta passphrase (ATTENTION, le clavier est alors en qwerty) et devrait monter la partition encryptée.
Une fois que tu es content du résultat, il te reste à mettre tes données sur /crypted.
Encrypter la partition de swap
Les exemples de partition de swap encryptée que l'on trouve sur http://www.s-mackie.demon.co.uk/
unix-notes/NetBSD-CGD-Setup.html et http://www.nycbug.org/uploads/_netbsdcgd.html utilisent une partition de swap en tant que partition d'un volume crypté. Je m'explique.
Une partition complète est associée à un device cgdX et dans ce " disque logique " cgdX sont créées diverses partitions dont celle de swap de la même manière que l'on procède sur un disque normal wdX : a, b, e, f, g...
Premières manipulations : vérifier que tout ceci fonctionne manuellement. La commande swapctl permet de vérifier le swap actuellement configuré.
# swapctl -l Device 512-blocks Used Avail Capacity Priority /dev/wd0b 263088 0 263088 0% 0
# cgdconfig -g -o /etc/cgd/wd1i -V none \ -k randomkey blowfish-cbc # cgdconfig cgd1 /dev/wd1i # disklabel -e -I cgd1 # /dev/rcgd1d: type: cgd disk: cgd label: fictitious flags: bytes/sector: 512 sectors/track: 2048 tracks/cylinder: 1 sectors/cylinder: 2048 cylinders: 619 total sectors: 1269072 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 4 partitions: # size offset fstype [fsize bsize cpg/sgs] b: 1269072 0 swap # (Cyl.0-619*) d: 1269072 0 unused 0 0 # (Cyl.0-619*) # swapctl -a /dev/cgd1b # swapctl -l Device 512-blocks Used Avail Capacity Priority /dev/wd0b 263088 0 263088 0% 0 /dev/cgd1b 1269072 0 1269072 0% 0 Total 1532160 0 1532160 0%
Maintenant, essayons de rendre tout ceci automatique.
Dans un premier temps, on va sauvegarder le disklabel de cgd1 pour que swapctl ne se plaigne pas de ne pas trouver de label.
# disklabel -r cgd1 > /etc/cgd/cgd1.disklabel
Ensuite, on crée le fichier /etc/rc.conf/cgd qui sera chargé de remettre le label sur le disque encrypté cgd1 à chaque reboot :
swap_device="cgd"
swap_disklabel="/etc/cgd/cgd1.disklabel"
start_postcmd="cgd_swap"
cgd_swap()
{
if [ -f $swap_disklabel ]; then
disklabel -R -r $swap_device $swap_disklabel
fi
}
On ajoute la ligne suivante au fichier etc/fstab :
/dev/cgd1b none swap sw 0 0
On vérifie avec les scripts de démarrage :
# /etc/rc.d/cgd start Configuring CGD devices. /dev/wd1e's passphrase: # swapctl -l no swap devices configured # /etc/rc.d/swap1 start swapctl: adding /dev/wd0b as swap device at priority 0 swapctl: adding /dev/cgd1b as swap device at priority 0
Naturellement, ici, avoir une seconde partition de swap encryptée en sus de la première qui ne l'est pas ne rime pas à grand-chose.
Un administrateur soucieux de la confidentialité de ses données s'attachera donc à appliquer les différentes commandes vues dans ce chapitre pour sécuriser /dev/wd0b.
Contrairement à GELI (FreeBSD), CGD ne permet pas de distribuer la sécurité du volume encrypté vers une passphrase et un fichier de " clés " combinés. Par contre, CGD permet " facilement " de manipuler des CD et DVD qu'on aura au préalable encryptés.
FreeBSD : GELI
Hop, te voilà en jambe avec la première partie pour NetBSD. Ne t'assieds pas, on continue.
Qu'est-ce que GELI ?
GELI signifie tout simplement GEOM ELI. GEOM est un framework modulaire de transformation d'I/O sur les disques. Dit plus simplement, c'est une surcouche de manipulation des objets " disques " qui va permettre d'effectuer des opérations différentes dans un " environnement unifié ".
Les pages de manuel à lire sont les suivantes :
http://www.freebsd.org/cgi/man.cgi?query=geom&sektion=4
http://www.freebsd.org/cgi/man.cgi?query=geli&sektion=8
Encrypter son swap
Enfin, surtout celui de sa machine. Tout d'abord, on vérifie l'utilisation d'une partition de swap :
# swapinfo Device 1K-blocks Used Avail Capacity /dev/ad0s1b 1048576 0 1048576 0%
On le désactiver et on vérifie :
# swapoff /dev/da0b # swapinfo Device 1K-blocks Used Avail Capacity (rien)
Le fichier /etc/defaults/rc.conf nous indique les valeurs par défaut des différentes options passées à GELI pour le montage du swap au boot.
# Options for GELI-encrypted swap partitions. geli_swap_flags="-a aes -l 256 -s 4096 -d"
Ces valeurs conviennent parfaitement, mais dans le cas où il faudrait les modifier, c'est dans le fichier /etc/rc.conf qu'elles devront être changées.
On modifie le fichier /etc/fstab pour indiquer qu'on va vouloir utiliser une partition de swap encryptée avec GELI (on ajoute simplement .eli à la fin de la partition de swap).
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.eli none swap sw 0 0
Et maintenant, que se passe-t-il ? On reboote et on voit ce qu'il se passe ? Eh bien non, on exécute les scripts suivants :
# /etc/rc.d/ecnswap start
# ls -al /dev/ad0s1b*
crw-r----- 1 root operator 0, 96 Jan 3 21:04 /dev/ad0s1b
crw-r----- 1 root operator 0,106 Jan 3 21:04 /dev/ad0s1b.eli
# /etc/rc.d/swap1 start
swapon: adding /dev/ad0s1b.eli as swap device
# swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.eli 1048576 0 1048576 0%
# geli status
Name Status Components
ad0s1b.eli N/A ad0s1b
Ah !!! On obtient un swap encrypté via GELI et " mounté ". Évidemment, lors du prochain reboot, il est plus que recommandé de vérifier que le swap est bien toujours encrypté, mais, cette fois, de manière complètement automatique, y compris le montage.
Encrypter une partition : /home
À partir d'ici, il est INDISPENSABLE d'avoir des backups des données de la partition sur laquelle les différentes commandes seront exécutées.
On choisit d'encrypter une partition existante /home. Si tu as des utilisateurs, le plus simple est de rebooter en single user et de ne pas monter /home après le fsck : ils ne pourront plus se loguer, ni lancer de processes qui modifieraient des fichiers sur cette partition.
Initialisation de GELI pour la partition /home :
# geli init -a aes -l 256 ad0s1f Enter new passphrase: <password> Reenter new passphrase: <password>
Il faut maintenant formater le volume pointé par la partition encryptée :
# newfs -U -O2 /dev/ad0s1f.eli geli attach ad0s18
Modification de /etc/fstab pour prendre en compte cette partition " GELI-fiée "
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1f /home ufs rw 2 2
qui devient :
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1f.eli /home ufs rw 2 2
On définit ensuite les informations sur notre partition encryptée dans le fichier /etc/rc.conf :
geli_devices="ad0s1f" geli_ad0s1f_flags=""
Il nous reste à vérifier que les scripts de démarrage ont bien toutes les informations nécessaires pour mounter la partition /home encryptée :
# /etc/rc.d/geli start Configuring Disk Encryption for ad0s1f. Enter passphrase: <password> # mount /dev/ad0s1f.eli on /home (ufs, local, soft-updates)
Enfin, on va vérifier que la partition est de nouveau mountée après un reboot et il faudra restaurer les backups pour retrouver les données qui s'y trouvaient.
Afin de ne pas limiter la sécurité du volume crypté à une seule passphrase, il est possible de modifier un volume GELI existant, via geli setkey, l'utilisation de fichier de clé, combiné ou non à la passphrase initiale.
- passphrase ;
- fichier de clé (keyfile) ;
- passphrase et fichier de clé : dans ce cas, il faut les deux éléments pour accéder au volume protégé.
Note importante pour ceux qui ont un clavier avec un autre layout que celui par défaut lors du boot : au moment de la demande de la passphrase, le clavier est en qwerty ; si tu veux avoir un clavier différent de qwerty dans les phases de boot de ton FreeBSD, il te faut suivre le lien suivant, section clavier : http://imil.net/docs/
sexy-FreeBSD.txt.
Limites et conclusion
Comme dans tout système de protection (ici protection à l'accès des données), il faut bien avoir à l'esprit ce qui est réellement protégé.
Un système Unix possède des données importantes dans bien des endroits, /etc et tous ses sous-répertoires pour n'en citer qu'un, pourtant aucun de ces fichiers ne sera protégé par une partition encryptée.
Aujourd'hui, aucun système d'encryption de partition ne permet d'avoir l'ensemble les partitions encryptées : il faut au moins charger le kernel et ses modules, lire la fstab et exécuter les scripts de démarrage.
Personnellement, je n'encrypte que le swap et la partition /home, mais j'ai activé la protection de l'accès au disque par mot de passe dans le bios de mon Lappy.
Je souhaite que cet article t'ait démontré l'utilisation des partitions protégées au quotidien et t'ait convaincu qu'en cas de vol cela limite la perte à une perte matérielle sans y ajouter la crainte que ces données ne soient accessibles à n'importe qui (à condition d'avoir des sauvegardes récentes).
Une suite de cet article pourrait être la mise en place d'un système entièrement encrypté, où le kernel et ses modules se trouveraient sur une clé USB.
Références
Les pages de man et URL citées dans le présent article, ainsi que http://sclo.retiaire.org/wiki/doku.php?id=slash:freebsd:geli.


