<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://docbook.org/xml/4.2/docbookx.dtd"[]>

<article class="whitepaper" id="Encrypted-Root-Filesystem-HOWTO">

<articleinfo>

    <title>Encrypted Root Filesystem HOWTO</title>

    <author>
        <firstname>Christophe</firstname>
        <surname>Devine</surname>
    </author>

<author>
	<firstname>Vertaald door: Ellen</firstname>
	<surname>Bokhorst</surname>
</author>

    <abstract>
        <para>
In dit document wordt uitgelegd hoe je persoonlijke data te beveiligen door
met behulp van sterke cryptografie je Linux rootbestandssysteem te
versleutelen.
        </para>
    </abstract>

    <legalnotice>
        <para>
Deze HOWTO is uitgegeven onder de GNU Free Documentation License
Versie 1.2.
        </para>
    </legalnotice>

    <revhistory>
	    <revision>
		    <revnumber>v1.3</revnumber>
		    <date>13 mrt 2005</date>
		    <authorinitials>cd</authorinitials>
		    <revremark>Versie van de pakketten bijgewerkt</revremark>
	    </revision>

        <revision>
            <revnumber>v1.2</revnumber>
            <date>20 okt 2004</date>
            <authorinitials>cd</authorinitials>
            <revremark>De versie van pakketten bijgewerkt.</revremark>
        </revision>

        <revision>
            <revnumber>v1.1</revnumber>
            <date>1 dec 2003</date>
            <authorinitials>cd</authorinitials>
            <revremark>Ondersteuning toegevoegd voor GRUB.</revremark>
        </revision>

        <revision>
            <revnumber>v1.0</revnumber>
            <date>24 sep 2003</date>
            <authorinitials>cd</authorinitials>
            <revremark>Initi&euml;le release, voorbeschouwd door de LDP.</revremark>
        </revision>

        <revision>
            <revnumber>v0.9</revnumber>
            <date>11 sep 2003</date>
            <authorinitials>cd</authorinitials>
            <revremark>Bijgewerkt en omgezet in DocBook XML.</revremark>
        </revision>

    </revhistory>

</articleinfo>

<sect1 id="preparing-system">
    <title>Voorbereiden van het systeem</title>

    <sect2 id="partition-layout">
        <title>Opzetten van de partitielay-out</title>
        <para>
Op je harddisk (hda) dienen op z'n minst drie partities voor te komen:
        <itemizedlist>
            <listitem><para>
hda1: deze kleine niet versleutelde partitie zal om een wachtwoord
vragen om het versleutelde rootbestandssysteem te kunnen mounten.
            </para></listitem>
            <listitem><para>
hda2: deze partitie zal je versleutelde rootbestandssysteem bevatten;
zorg dat het groot genoeg is.
            </para></listitem>
            <listitem><para>
hda3: deze partitie bevat het huidige GNU/Linux-systeem.
            </para></listitem>
        </itemizedlist>
        </para><para>
Op dit moment zijn hda1 en hda2 ongebruikt. hda3 is waar je Linux distributie
thans is ge&iuml;nstalleerd; /usr en /boot moeten
<emphasis>niet</emphasis> worden gescheiden van deze partitie.
        </para><para>
Hier is een voorbeeld hoe je partitielay-out eruit zou kunnen zien:
        </para><para>
<screen># fdisk -l /dev/hda

Disk /dev/hda: 255 heads, 63 sectors, 2432 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1             1         1      8001   83  Linux
/dev/hda2             2       263   2104515   83  Linux
/dev/hda3           264       525   2104515   83  Linux
/dev/hda4           526      2047  12225465   83  Linux</screen>
    </para>
    </sect2>

    <sect2 id="debian-packages">
        <title>Benodigde pakketten</title>
        <para>
Bij gebruik van Debian zijn de volgende pakketten verplicht:
        </para><para>
<screen>apt-get install gcc make libncurses5-dev patch bzip2 wget</screen>
        </para><para>
	Ter vereenvoudiging van het kopi&euml;ren en plakkeen, installeer je tevens:
        </para><para>
<screen>apt-get install lynx gpm</screen>
        </para>
    </sect2>


    <sect2 id="install-kernel-2.4">
        <title>Linux 2.4.29 installeren</title>
        <para>
Er bestaan twee hoofdprojecten die loopback versleutelingsondersteuning
in de kernel toevoegen: cryptoloop en loop-AES. Deze howto is gebaseerd op
loop-AES, gezien het een uiterst snel en hoog geoptimaliseerde implementatie
van Rijndael in assembleertaal kenmerkt en daarom voorziet in een maximum
performance als je een IA-32 (x86) hebt. Bovendien zijn er een aantal
<ulink url="http://groups.google.com/groups?selm=1emrG-1Ck-25%40gated-at.bofh.it">beveiligingskwesties</ulink> met betrekking tot cryptoloop.
        </para><para>
Download als eerste het loop-AES pakket en pak het uit:
        </para><para>
	<screen>
		cd /usr/src
		wget http://loop-aes.sourceforge.net/loop-AES/loop-AES-v3.0b.tar.bz2
tar -xvjf loop-AES-v3.0b.tar.bz2</screen>
        </para><para>
Vervolgens moet je de kernelbroncode downloaden en patchen:
        </para><para>
<screen>wget http://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.29.tar.bz2
tar -xvjf linux-2.4.29.tar.bz2
cd linux-2.4.29
rm include/linux/loop.h drivers/block/loop.c
patch -Np1 -i ../loop-AES-v3.0b/kernel-2.4.28.diff</screen>
        </para><para>
Stel de toetsenbordindeling in:
        </para><para>
<screen>dumpkeys | loadkeys -m - > drivers/char/defkeymap.c</screen>
        </para><para>
Configureer vervolgens je kernel; zorg dat de volgende opties zijn gezet:
        </para><para>
<screen>make menuconfig

    Block devices  ---&gt;

        &lt;*&gt; Loopback device support
        [*]   AES encrypted loop device support (NEW)

        &lt;*&gt; RAM disk support
        (4096)   Default RAM disk size (NEW)
        [*]   Initial RAM disk (initrd) support

    File systems  ---&gt;

        &lt;*&gt; Ext3 journalling file system support
        &lt;*&gt; Second extended fs support

(belangrijke noot: activeer niet de de ondersteuning voor het /dev 
bestandssysteem)</screen>
        </para><para>
Compileer de kernel het installeer het:
        </para><para>
<screen>make dep bzImage
make modules modules_install
cp arch/i386/boot/bzImage /boot/vmlinuz</screen>
        </para><para>
Als grub je bootloader is, werk dan /boot/grub/menu.lst of /boot/grub/grub.conf
bij:
        </para><para>
<screen>cat &gt; /boot/grub/menu.lst &lt;&lt; EOF
default 0
timeout 10
color green/black light-green/black
title Linux
    root (hd0,2)
    kernel /boot/vmlinuz ro root=/dev/hda3
EOF</screen>
        </para><para>
Werk anders /etc/lilo.conf bij en start lilo op:
        </para><para>
<screen>cat &gt; /etc/lilo.conf &lt;&lt; EOF
lba32
boot=/dev/hda
prompt
timeout=60
image=/boot/vmlinuz
    label=Linux
    read-only
    root=/dev/hda3
EOF
lilo</screen>
        </para><para>
Je kunt nu het systeem herstarten.
        </para>
    </sect2>

    <sect2 id="install-kernel-2.6">
        <title>Installeren van Linux-2.6.10</title>
        <para>
Ga verder zoals beschreven in de vorige sectie, daarvoor in de plaats
gebruik makend van loop-aes' <emphasis>kernel-2.6.10.diff</emphasis> patch
en zorg ervoor dat de ondersteuning voor cryptoloop <emphasis>niet</emphasis>
is geactiveerd. 
De ondersteuning van modules vereist dat het pakket module-init-tools is
ge&iuml;nstalleerd.
        </para>
    </sect2>

    <sect2 id="install-util-linux">
        <title>Installeren van util-linux-2.12p</title>
        <para>
Op het programma losetup, dat onderdeel uitmaakt van het pakket util-linux,
moet een patch worden toegepast en het moet voor het toevoegen van
ondersteuning voor krachtige cryptografie opnieuw worden gecompileerd.
Download util-linux en pas de patch toe:
        </para><para>
	<screen>
		cd /usr/src
		wget http://ftp.kernel.org/pub/linux/utils/util-linux/util-linux-2.12p.tar.bz2
tar -xvjf util-linux-2.12p.tar.bz2
cd util-linux-2.12p
patch -Np1 -i ../loop-AES-v3.0b/util-linux-2.12p.diff</screen>
        </para><para>
Voer voor het gebruik van wachtwoorden korter dan 20 tekens in:
        </para><para>
<screen>CFLAGS=&quot;-O2 -DLOOP_PASSWORD_MIN_LENGTH=8&quot;; export CFLAGS</screen>
        </para><para>
De beveiliging is vast en zeker &eacute;&eacute;n van je belangrijkste
interesses. Activeer om dit reden alsjeblieft geen wachtwoorden bestaande uit
minder dan 20 tekens. De privacy van gegevens krijg je niet voor niets,
men moet hiervoor 'betalen' in de vorm van lange wachtwoorden.
        </para><para>
Compileer losetup en installeer het als root:
        </para><para>
<screen>./configure &amp;&amp; make lib mount
mv -f /sbin/losetup /sbin/losetup~
rm -f /usr/share/man/man8/losetup.8*
cd mount
gzip losetup.8
cp losetup /sbin
cp losetup.8.gz /usr/share/man/man8/
chattr +i /sbin/losetup</screen>
        </para>
    </sect2>
</sect1>

<sect1 id="encrypt-root-filesystem">
    <title>Aanmaken van het versleutelde rootbestandssysteem</title>
    <para>
Vul de doelpartitie met willekeurige data:
    </para><para>
<screen>shred -n 1 -v /dev/hda2</screen>
    </para><para>
Stel het versleutelde loopbackdevice in:
    </para><para>
<screen>losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2</screen>
    </para><para>
Ter voorkoming van geoptimaliseerde dictionary attacks, is het aan te bevelen
de optie -S xxxxxx toe te voegen, waarbij "xxxxxx" staat voor je willekeurig
gekozen wachtwoord (je zou bijvoorbeeld "gPk4lA" kunnen kiezen). Schrijf het
op een stukje papier zodat je het later nog weet.
Om problemen tijdens het booten met de toetsenbordindeling te voorkomen,
kun je beter geen niet-ASCII tekens gebruiken (accenten, enz) in je
wachtwoord. De site
<ulink url="http://www.diceware.com/">Diceware</ulink> biedt
een simpele manier om krachtige, en toch eenvoudig te onthouden wachtwoorden
te cre&euml;eren.
    </para><para>
Maak nu het ext3 bestandssysteem aan:
    </para><para>
<screen>mke2fs -j /dev/loop0</screen>
    </para><para>
Controleer of het wachtwoord dat je invoerde correct is:
    </para><para>
<screen>losetup -d /dev/loop0
losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2</screen>
    </para><para>
<screen>mkdir /mnt/efs
mount /dev/loop0 /mnt/efs</screen>
    </para><para>
Je kunt de versleutelde en niet versleutelde data vergelijken:
    </para><para>
<screen>xxd /dev/hda2  | less
xxd /dev/loop0 | less</screen>
    </para><para>
Je bent nu zover je versleutelde Linux-systeem te gaan installeren. Gebruik je
een GNU/Linux distributie (zoals Debian, Slackware, Gentoo, Mandrake,
RedHat/Fedora, SuSE, enz.) geef dan de volgende opdracht:
    </para><para>
<screen>cp -avx / /mnt/efs</screen>
    </para><para>
Als je gebruik maakt van het boek Linux From Scratch, ga dan verder zoals
beschreven in de handleiding, met onderstaande aanpassingen:
        <itemizedlist>
            <listitem>
<para>Hoofdstuk 6 - Installeren van util-linux:</para>
<para>Pas de loop-AES patch toe na het uitpakken van de broncode.</para>
                </listitem><listitem>
<para>Hoofdstuk 8 - Maak het LFS systeem opstartbaar:</para>
<para>Raadpleeg de volgende sectie (Instellen van het bootdevice).</para>
            </listitem>
        </itemizedlist>
    </para>
</sect1>

<sect1 id="setup-boot-device">
    <title>Instellen van het bootdevice</title>
    <sect2 id="initial-ramdisk">
    <title>Aanmaken van de ramdisk</title>
        <para>
Om mee te beginnen, ga je middels chroot naar de versleutelde partitie
en maakt het mountpoint aan voor het bootdevice:
        </para><para>
<screen>chroot /mnt/efs
mkdir /loader</screen>
        </para><para>
Maak vervolgens de initi&euml;le ramdisk (initrd) aan, welke daarna nodig
zal zijn:
        </para><para>
<screen>cd
dd if=/dev/zero of=initrd bs=1k count=4096
mke2fs -F initrd
mkdir ramdisk
mount -o loop initrd ramdisk</screen>
        </para><para>
Als je gebruik maakt van grsecurity, dan kun je de foutmelding
"Permission denied" krijgen; in dat geval moet je buiten de chroot-omgeving
om de mount opdracht uitvoeren.
        </para><para>
Maak de bestandssysteemhi&euml;rarchie aan en kopieer hier de vereiste
bestanden naartoe:
    </para><para>
<screen>mkdir ramdisk/{bin,dev,lib,mnt,sbin}
cp /bin/{bash,mount} ramdisk/bin/
ln -s bash ramdisk/bin/sh
mknod -m 600 ramdisk/dev/console c 5 1
mknod -m 600 ramdisk/dev/hda2    b 3 2
mknod -m 600 ramdisk/dev/loop0   b 7 0
cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/
cp /lib/{libncurses.so.5,libtermcap.so.2}    ramdisk/lib/
cp /sbin/{losetup,pivot_root} ramdisk/sbin/</screen>
    </para><para>
Het is in orde als je een melding te zien krijgt als 
"/lib/libncurses.so.5: No such file or directory", of 
"/lib/libtermcap.so.2: No such file or directory";
bash vereist slechts &eacute;&eacute;n van deze twee library's. 
Je kunt nagaan welke daadwerkelijk is vereist met:
    </para><para>
<screen>ldd /bin/bash</screen>
    </para><para>
Compileer het sleep programma, dat zal voorkomen dat de password prompt
zal worden overspoeld door kernelmeldingen
(zoals usb apparaten die worden geregistreerd).
    </para><para>
<screen>cat &gt; sleep.c &lt;&lt; &quot;EOF&quot;
#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;

int main( int argc, char *argv[] )
{
    if( argc == 2 )
        sleep( atoi( argv[1] ) );

    return( 0 );
}
EOF

gcc -s sleep.c -o ramdisk/bin/sleep
rm sleep.c</screen>
    </para><para>
    Maak het initscript aan:
    </para><para>

<screen>cat &gt; ramdisk/sbin/init &lt;&lt; &quot;EOF&quot;
#!/bin/sh

/bin/sleep 3

echo -n "Enter seed value: "
read SEED

/sbin/losetup -e aes256 -S $SEED /dev/loop0 /dev/hda2
/bin/mount -r -n -t ext3 /dev/loop0 /mnt

while [ $? -ne 0 ]
do
    /sbin/losetup -d /dev/loop0
    /sbin/losetup -e aes256 -S $SEED /dev/loop0 /dev/hda2
    /bin/mount -r -n -t ext3 /dev/loop0 /mnt
done

cd /mnt
/sbin/pivot_root . loader
exec /usr/sbin/chroot . /sbin/init
EOF

chmod 755 ramdisk/sbin/init</screen>


    </para><para>
Ontkoppel het loopback device en comprimeer initrd:
    </para><para>
<screen>umount -d ramdisk
rmdir ramdisk
gzip initrd
mv initrd.gz /boot/</screen>
    </para>
    </sect2>
    <sect2 id="bootable-cd">
    <title>Booten vanaf een CD-ROM</title>
        <para>
Ik adviseer je het systeem met read-only media, zoals een opstartbare
CD-ROM, op te starten.
        </para><para>
Download syslinux en pak het uit:
        </para><para>
<screen>wget http://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.07.tar.bz2
tar -xvjf syslinux-3.07.tar.bz2</screen>
        </para><para>
Configureer isolinux:
        </para><para>
<screen>mkdir bootcd
cp /boot/{vmlinuz,initrd.gz} syslinux-3.07/isolinux.bin bootcd
echo &quot;DEFAULT /vmlinuz initrd=initrd.gz ro root=/dev/ram0&quot; \
    &gt; bootcd/isolinux.cfg</screen>
        </para><para>
Maak en brand een opstartbaar cd-rom iso-image:
        </para><para>
<screen>mkisofs -o bootcd.iso -b isolinux.bin -c boot.cat \
        -no-emul-boot -boot-load-size 4 -boot-info-table \
        -J -hide-rr-moved -R bootcd/

cdrecord -dev 0,0,0 -speed 4 -v bootcd.iso

rm -rf bootcd{,.iso}</screen>
        </para>
    </sect2>

    <sect2 id="boot-partition">
    <title>Booten vanaf een HD partitie</title>
        <para>
De bootpartitie kan van pas komen mocht je je opstartbare CD kwijtraken.
<emphasis>Denk eraan dat hda1 schrijfbaar en dus onveilig is; gebruik
het alleen in geval van nood!
</emphasis>
        </para><para>
Maak het ext2 bestandssysteem aan en mount het:
        </para><para>
<screen>dd if=/dev/zero of=/dev/hda1 bs=8192
mke2fs /dev/hda1
mount /dev/hda1 /loader</screen>
        </para><para>
Kopieer de kernel en de initi&euml;le ramdisk:
        </para><para>
<screen>cp /boot/{vmlinuz,initrd.gz} /loader</screen>
        </para><para>
Als je gebruik maakt van grub:
        </para><para>
<screen>mkdir /loader/boot
cp -av /boot/grub /loader/boot/
cat &gt; /loader/boot/grub/menu.lst &lt;&lt; EOF
default 0
timeout 10
color green/black light-green/black
title Linux
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/ram0
    initrd /initrd.gz
EOF
grub-install --root-directory=/loader /dev/hda
umount /loader</screen>
        </para><para>
Als je gebruik maakt van lilo:
        </para><para>
<screen>mkdir /loader/{boot,dev,etc}
cp /boot/boot.b /loader/boot/
mknod -m 600 /loader/dev/hda  b 3 0
mknod -m 600 /loader/dev/hda1 b 3 1
mknod -m 600 /loader/dev/hda2 b 3 2
mknod -m 600 /loader/dev/hda3 b 3 3
mknod -m 600 /loader/dev/hda4 b 3 4
mknod -m 600 /loader/dev/ram0 b 1 0
cat &gt; /loader/etc/lilo.conf &lt;&lt; EOF
lba32
boot=/dev/hda
prompt
timeout=60
image=/vmlinuz
    label=Linux
    initrd=/initrd.gz
    read-only
    root=/dev/ram0
EOF
lilo -r /loader
umount /loader</screen>
        </para>
    </sect2>
</sect1>

<sect1 id="final-steps">
    <title>Laatste stappen</title>
    <para>
Pas nog steeds in chroot, /etc/fstab aan zodat hierin komt te staan:
    </para><para>
<screen>/dev/loop0      /               ext3    defaults       0       1</screen>
    </para><para>
Verwijder /etc/mtab en ga uit chroot. Geef tenslotte de opdracht 
"umount -d /mnt/efs" en herstart. Als er iets fout gaat, dan kun je
nog altijd je versleutelde partitie booten door het achter de LILO:
prompt invoeren van "Linux root=/dev/hda3".
    </para><para>
Als alles goed ging, dan kun je nu je disk herpartitioneren en hda3 als ook
hda4 versleutelen. In de volgende scripts, veronderstellen we dat hda3
het swapdevice bevat en hda4 /home; initialiseer als eerste beide partities:
    </para><para>
<screen>shred -n 1 -v /dev/hda3
shred -n 1 -v /dev/hda4
losetup -e aes256 -S xxxxxx /dev/loop1 /dev/hda3
losetup -e aes256 -S xxxxxx /dev/loop2 /dev/hda4
mkswap /dev/loop1
mke2fs -j /dev/loop2</screen>
    </para><para>
Maak vervolgens een script aan in de systeemopstartdirectory en werk
fstab bij:
    </para><para>
<screen>cat &gt; /etc/init.d/loop &lt;&lt; &quot;EOF&quot;
#!/bin/sh

if [ "`/usr/bin/md5sum /dev/hda1`" != \
     "5671cebdb3bed87c3b3c345f0101d016  /dev/hda1" ]
then
    echo -n "WARNING! hda1 integrity verification FAILED - press enter."
    read
fi

echo &quot;1st password chosen above&quot; | \
    /sbin/losetup -p 0 -e aes256 -S xxxxxx /dev/loop1 /dev/hda3

echo &quot;2nd password chosen above&quot; | \
    /sbin/losetup -p 0 -e aes256 -S xxxxxx /dev/loop2 /dev/hda4

/sbin/swapon /dev/loop1

for i in `seq 0 63`
do
    echo -n -e "\33[10;10]\33[11;10]" > /dev/tty$i
done

EOF

chmod 700 /etc/init.d/loop
ln -s ../init.d/loop /etc/rcS.d/S00loop
vi /etc/fstab
...
/dev/loop2      /home           ext3    defaults       0       2</screen>
    </para>
</sect1>

<sect1 id="about">
    <title>Over deze HOWTO</title>
    <para>
De Encrypted Root Filesystem HOWTO werd voor het eerst geschreven in november
2002 voor het
<ulink url="http://www.linuxfromscratch.org/lfs/news.html">Linux From Scratch</ulink>

project. Ik zou graag de vele mensen willen bedanken die me hielpen dit 
document te verbeteren (in omgekeerd alfabetische volgorde):
Micha Borrmann, Dennis Lemckert, Oleg Vyushin, Ellen Bokhorst, Daczi L¿zl¿ Gaetano Zappulla,
Guillaume Lehmann, Claude Thomassin, Jean-Philippe Gu¿ard, Luc Vo Van,
Jacobus Brink, Ernesto P¿ez Est¿ez, Matthew Ploessel, Mike Lorek,
Lars Bungum, Michael Shields, Julien Perrot, Grant Stephenson, Cary W. Gilmer,
James Howells, Pedro Baez, Josh Purinton, Jari Ruusu and Zibeli Aton.
    </para><para>
    
    Deze HOWTO is vertaald naar diverse talen:
    <itemizedlist>
      <listitem><para><ulink url="http://www.traduc.org/docs/HOWTO/lecture/Encrypted-Root-Filesystem-HOWTO.html">French</ulink></para></listitem>
        <listitem><para><ulink url="http://www.linux.it/~gaetano/erfs/">Italian</ulink></para></listitem>
        <listitem><para><ulink url="http://tldp.fsf.hu/HOWTO/Encrypted-Root-Filesystem-HOWTO-hu/">Hungarian</ulink></para></listitem>
	<listitem><para><ulink url="http://doc.nl.linux.org/HOWTO/Encrypted-Root-Filesystem-HOWTO-NL/article.html">Nederlands</ulink></para></listitem>
    </itemizedlist>
    </para><para>
Stuur opmerkingen alsjeblieft naar
<ulink url="http://www.cr0.net:8040/about/">Christophe Devine</ulink>.
    </para>
</sect1>

</article>
