Cryptologie

Fil des billets

14déc. 2008

Chiffrement du filesystem complet (dm-crypt,luks)

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 :

Luks Official Web Site

26mai 2008

/dev/random ou /dev/urandom

Au travers de la mise en place de dm-crypt, je me suis posé la question quant à la différence entre /dev/random et /dev/urandom, voici un récapitulatif des résultats :

   1. /dev/random

C'est un générateur aléatoire qui se base sur l'entropie générée par le système à un instant T Exemple : Bouger la souris remplit le pool d'entropie qui permet d'augmenter le flux de /dev/random, à l'inverse la désactivation des services ou une machine en repos ne génére que peu d'entropie réduisant de ce fait le flux dans /dev/random...

   2. /dev/urandom

/dev/urandom, qui est capable de ne pas se limiter au pool d'entropie présent à l'instant T. Les données qui en sortent sont moins aléatoires que ce qui sort d'un /dev/random.

Tout dépend donc de la qualité des données désirées ...

Lien utile : http://en.wikipedia.org/wiki/Urandom

26mai 2008

Chiffrement d'un disque amovible (dm-crypt,luks)

Ayant besoin de sécurisé quelques données sur support amovible, aujourd'hui on s'attaque à la mise en place de dm-crypt sur une simple carte SD.

Nous utiliserons dans le cas présent 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. Caractéristique intéressante, les partitions LUKS peuvent être accédées également sous Windows grâce à l’outil gratuit FreeOTFE.

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 :

Faisons de cette partition un volume chiffré LUKS :

cryptsetup luksFormat /dev/sdb1

On active le volume chiffré :

cryptsetup luksOpen /dev/sdb1 ext_keys

On formate le volume (classique) :

mke2fs -j -L mycrypt /dev/mapper/ext_keys

On monte le volume (classique également) :

mount /dev/mapper/ext_keys /mnt/mycrypt

On désactive le volume chiffré :

umount /mnt/mycrypt/
 cryptsetup luksClose ext_keys

Nous voici à présent avec un volume chiffré :)

D'après mes premiers tests, j'envisage sous peu de migrer tout le portable vers ce type de chiffrage et d'utiliser la carte SD afin de stocker la clé de déchiffrement afin de me permettre en cas d'absence de la carte de rendre le portable inutilisable :)

Lien utile :

Luks Official Web Site