Suite à mon billet du 26 Mai 2008 , je vais comme promis procéder au chiffrement complet (hors /boot) de mon laptop toujours grâce à dm-crypt. Sans le mot de passe associé (passphrase), le portable ne pourra booter.
Bien entendu, nous utiliserons toujours la norme LUKS (Linux Unified Key Setup) :
Le projet LUKS, développé par Clemens Fruhwirth de l’université de Vienne, vise à standardiser le chiffrement de systèmes de fichiers par la définition et l’implémentation d’un format standard.
En fournissant une norme sur l'encryption disque, il ne se contente pas de faciliter la compatibilité entre les distributions, mais aussi fournir une gestion sûre des multiples mots de passe utilisateur.
Prérequis :
1. Kernel :
Device Drivers --> RAID and LVM Support --> [*] Multiple devices driver support (RAID and LVM) <*> Device mapper support <*> Crypt target support
Cryptographic Options --> <*> AES cipher algorithms (x86_64) <*> SHA256 digest algorithm <*> SHA384 and SHA512 digest algorithms
2. Outil :
sys-fs/cryptsetup
Mise en place :
Nous allons supprimé toutes les trace des données qui sont actuellement sur le disque dur. Il existe des outils dit de "forensic" comme TCT, qui peuvent retrouver des données effacées. Une donnée sur un disque dur disparait au bout d'environ sept écritures au même endroit, il existe un outil nommé shred (sys-apps/coreutils) qui effectue se genre de chose.
shred -n 10 -v /dev/sda2 shred -n 10 -v /dev/sda3 shred -n 10 -v /dev/sda4
Shred n'etant pas efficace pour la génération d'entropie (reproduit toujours la même séquence), on va donc généré de l'entropie depuis /dev/urandom
dd if=/dev/urandom of=/dev/sda2 dd if=/dev/urandom of=/dev/sda3 dd if=/dev/urandom of=/dev/sda4
On crée à présent la partition crypté LUKS en y définissant une passphrase.
cryptsetup -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda4
On dévérouille la partition crypté
cryptsetup luksOpen /dev/sda4 racine
luksOpen créé un mapping pour la partition crypté, /dev/sda4 devient /dev/mapper/racine. On formate ce mapping (par ailleurs je revient en ext3).
mke2fs -j /dev/mapper/racine
Je crée le cryptage de la swap
cryptsetup -d /dev/urandom create swap /dev/sda3
Je formate la swap
mkswap /dev/mapper/swap
Je prépare la partition /boot
mke2fs /dev/sda2
On monte les partitions de manière classique
mount /dev/mapper/racine /mnt/gentoo mkdir /mnt/gentoo/boot mount /dev/sda2 /mnt/gentoo/boot
Je restaure mes données :)
tar xvjpf backup.tar.bz2 -C /mnt/gentoo
On configure le fstab
/dev/sda2 /boot ext2 noauto,noatime 1 2 /dev/mapper/racine / ext3 noatime 0 1 /dev/mapper/swap none swap sw 0 0 shm/dev/shm tmpfs nodev,nosuid,noexec 0 0
On déclare les partitions crypté pour le device mapper
- /etc/conf.d/dmcrypt
swap=swap source='/dev/sda3' target=racine source='/dev/sda4'
On va créer l'initramfs
1) On crée la structure
cd /mnt/ mkdir -p work/initramfs/{bin,sbin,etc,proc,sys,newroot} cd work touch initramfs/etc/mdev.conf
2) Mise en place de busybox
wget http://blog.yacoubi.fr/scripts/busybox/busybox-1.10.1-static.bz2 -O - | bunzip2 > initramfs/bin/busybox chmod +x initramfs/bin/busybox ln -s busybox initramfs/bin/sh
3) Mise en place du script d'init
touch initramfs/init chmod +x initramfs/init
- initramfs/init
#!/bin/sh #Mount things needed by this script mount -t proc proc /proc mount -t sysfs sysfs /sys #Disable kernel messages from popping onto the screen echo 0 > /proc/sys/kernel/printk #Clear the screen clear #Create all the symlinks to /bin/busybox busybox --install -s #Create device nodes mknod /dev/null c 1 3 mknod /dev/tty c 5 0 mdev -s #Function for parsing command line options with "=" in them # get_opt("init=/sbin/init") will return "/sbin/init" get_opt() { echo "$@" | cut -d "=" -f 2 } #Defaults init="/sbin/init" root="/dev/mapper/racine" enc_root=/dev/sda4 #Process command line options for i in $(cat /proc/cmdline); do case "${i}" in root\=*) root=$(get_opt $i) ;; init\=*) init=$(get_opt $i) ;; enc_root\=*) enc_root=$(get_opt $i) ;; esac done #Open encrypted partition to create /dev/mapper/racine cryptsetup luksOpen "${enc_root}" racine if [ $? -ne 0 ] then exec /sbin/halt else #Mount the root device mount "${root}" /newroot fi #Unmount all other mounts so that the ram used by #the initramfs can be cleared after switch_root umount /sys /proc #Switch to the new root and execute init if [[ -x "/newroot/${init}" ]] ; then exec switch_root /newroot "${init}" fi #This will only be run if the above line failed echo "Failed to switch_root, dropping to a shell" exec sh
4) Copie de l'executable cryptsetup
cp /sbin/cryptsetup initramfs/bin/
5) Construction de l'image
cd initramfs find . | cpio -H newc -o > ../initramfs.cpio cd .. cat initramfs.cpio | gzip > initramfs.igz
6) Configuration de grub
title=Gentoo Linux root (hd0,1) kernel /boot/linux initrd /initramfs.igz
A présent on redémarre, la passphrase devrait vous être demandé, à ce sujet la configuration clavier sera alors en QWERTY et non en AZERTY donc attention au caractère spéciaux. Votre filesystem ainsi que votre swap sont à présent crypté ;)
Lien utile :