From: Michel Bouissou To: open-crypto@bouissou.net Date: Sun, 7 Apr 2002 19:03:09 +0200 Subject: [open-crypto] Mandrake 8.2 et chiffrement du swap Bonsoir, La Mandrake 8.2, qui inclut le système loop-aes, permet supposément de chiffrer les partitions de swap de manière très facile. Malheureusement, un bug dans /etc/rc.d/rc.sysinit fait que cela ne fonctionne pas. J'ai trouvé le bug, et écrit un patch correctif que je joins en attachement de ce message. Mode d'emploi pour appliquer ce patch, et passer facilement d'un swap normal en swap chiffré: 1) Copier le patch joint dans /etc/rc.d/ 2) Console root: cd /etc/rc.d patch < rc.sysinit.diff => Le fichier rc.sysinit est patché 3) Editer /etc/fstab, et modifier la ou les lignes définissant la ou les partitions de swap, comme suit: /dev/hda4 swap swap defaults 0 0 devient /dev/hda4 swap swap encrypted 0 0 4) Rebooter. Et voilà ! Au reboot, on verra des messages comme: Creating encrypted swap space on /dev/loop0: succeeded Activating swap on /dev/loop0: succeeded Enabling swap space: succeeded Vérification une fois booté: [root@totor etc]# swapon -s Filename Type Size Used Priority /dev/loop/0 partition 128512 0 0 /dev/loop/1 partition 128512 0 0 ..montre que désormais le swap est sur des loop devices [root@totor etc]# losetup /dev/loop0 /dev/loop0 : [0007]:447 (/dev/hda4) décalage 0, AES128 cryptage [root@totor etc]# losetup /dev/loop1 /dev/loop1 : [0007]:747 (/dev/sda3) décalage 0, AES128 cryptage ..montre sur quoi pointent ces loop devices, et qu'elles sont effectivement chiffrées. (Le swap est chiffré avec une clé de session aléatoire, différente à chaque boot, sans intervention de l'utilisateur) Seul (petit) problème: Aux reboots ultérieurs, la première tentative de monter les swaps (juste après le remontage de la racine en RW) résulte en un message d'erreur, et je n'y peux rien; cette erreur est sans conséquence. Le swap chiffré est monté normalement à une étape ultérieure du boot. Cordialement. -- Michel Bouissou OpenPGP ID 0x5C2BEE8F ---------------------------------------------------------------------------- Pour poster sur cette liste: open-crypto@bouissou.net Désabonnement de la liste: open-crypto-unsubscribe@bouissou.net Homepage liste et archives: https://www.bouissou.net/wws/info/open-crypto --- rc.sysinit.Original.mdk82 Sun Apr 7 16:51:39 2002 +++ rc.sysinit Sun Apr 7 16:59:35 2002 @@ -1111,17 +1111,41 @@ # Delete Postgres sockets rm -f /tmp/.s.PGSQL.* -#Detect encrypted swap +#Detect and create/activate encrypted swap +#Changed by Michel Bouissou on 2002/04/07 if [[ -n $encrypted_swap ]];then - for loop in ${encrypted_swap};do - losetup -d /dev/loop0 2>/dev/null >/dev/null ||: - mcookie|losetup -p 0 AES128 /dev/loop0 ${loop} 2>/dev/null >/dev/null - sync - mkswap ${loop} 2>/dev/null >/dev/null - sync - action "Making encrypted swap for %s: " ${loop} swapon ${loop} - sync - done + loop=NONE + action "Testing insertion of loop module" modprobe loop + if [ $? == 0 ]; then + for (( s = 1; s <= 10; s++ )); do + if [ -b /dev/loop0 ]; then + loop=OK + s=11 + else + sleep 1 + fi + done + fi + if [ $loop == OK ]; then + for swdev in ${encrypted_swap}; do + loop=NONE + for l in `echo /dev/loop[0-9]`; do + if [ $loop == NONE ] && ! grep -q $l /proc/mounts && ! { losetup $l &> /dev/null; }; then + loop=$l + fi + done + if [ $loop != NONE ]; then + swapoff $swdev > /dev/null 2>&1 + mcookie | losetup -p 0 -e AES128 $loop $swdev > /dev/null 2>&1 + if [ $? == 0 ]; then + action "Creating encrypted swap space on %s:" $loop mkswap $loop + if [ $? == 0 ]; then + action "Activating swap on %s:" $loop swapon -p 0 $loop + fi + fi + fi + done + fi fi # Now turn on swap in case we swap to files. ---------------------------------------------------------- From: Michel Bouissou To: open-crypto@bouissou.net Subject: Re: [open-crypto] Mandrake 8.2 et chiffrement du swap Date: Mon, 8 Apr 2002 10:54:03 +0200 (...) Mais j'ai trouvé une parade en m'inspirant pour rc.sysinit de la méthode utilisée par Jari Ruusu dans ses patches à util-linux: Seeder mcookie en utilisant une combinaison de dev/urandom, et du contenu des 40 premiers Ko de l'ancienne partition chiffrée, avant d'effacer ce contenu avec de nouveaux "zéros chiffrés" (avec la nouvelle clé de session). En effet, mcookie peut être seedé avec un fichier d'entropie supplémentaire, ce qui me permet d'utiliser dans rc.sysinit une commande comme. [root@totor rc.d]# dd if=/dev/hda4 bs=1024 count=40 2>/dev/null | mcookie -v -f /dev/stdin 40960 octets reçus de /dev/stdin 64 octets reçus de /dev/urandom 9bbad8801d5f38cbd9f25707f98de363 (...) Ce qui fait que j'ai produit un nouveau (petit) patch à rc.sysinit, à appliquer après le patch que j'ai pondu hier. Ce nouveau patch est en attachement. APRÈS avoir appliqué le patch d'hier, Copier le nouveau patch dans /etc/rc.d, puis cd /etc/rc.d patch < rc.sysinit.diff.2 Au prochain boot, la clé de chiffrement du swap sera obtenue avec un random seedé de manière hybride (via mcookie) par /dev/urandom et par les 40 premiers Ko de l'ancien swap chiffré, avant que ceux-ci ne soient immédiatement écrasés. Qu'en pensez-vous ? Cordialement. -- Michel Bouissou OpenPGP ID 0x5C2BEE8F --- rc.sysinit.patch.MiB.1 Mon Apr 8 10:02:37 2002 +++ rc.sysinit Mon Apr 8 10:30:27 2002 @@ -1112,7 +1112,7 @@ rm -f /tmp/.s.PGSQL.* #Detect and create/activate encrypted swap -#Changed by Michel Bouissou on 2002/04/07 +#Changed by Michel Bouissou on 2002/04/08 if [[ -n $encrypted_swap ]];then loop=NONE action "Testing insertion of loop module" modprobe loop @@ -1136,8 +1136,10 @@ done if [ $loop != NONE ]; then swapoff $swdev > /dev/null 2>&1 - mcookie | losetup -p 0 -e AES128 $loop $swdev > /dev/null 2>&1 + dd if=$swdev bs=1024 count=40 2>/dev/null |\ + mcookie -f /dev/stdin | losetup -p 0 -e AES128 $loop $swdev > /dev/null 2>&1 if [ $? == 0 ]; then + dd if=/dev/zero of=$loop bs=1024 count=40 > /dev/null 2>&1 action "Creating encrypted swap space on %s:" $loop mkswap $loop if [ $? == 0 ]; then action "Activating swap on %s:" $loop swapon -p 0 $loop ----------------------------------------------------------