<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article PUBLIC '-//OASIS//DTD DocBook XML V4.1.2//EN'
"/usr/share/sgml/docbook/dtd/xml/4.1.2/docbookx.dtd" []>

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

<articleinfo>

    <title>CÓMO configurar un sistema de ficheros raíz encriptado</title>

    <author>
        <firstname>Christophe</firstname>
        <surname>Devine</surname>
    </author>
    <othercredit>
      <firstname>Gabriel</firstname>
      <surname>Rodríguez Alberich</surname>
      <contrib>Traducción</contrib>
    </othercredit>

    <abstract>
        <para>Este breve documento explica cómo asegurar sus datos
	personales encriptando su sistema de ficheros raíz de Linux
	mediante criptografía fuerte.
        </para>
    </abstract>

    <legalnotice>
        <para>Este COMO está publicado bajo la Licencia de Documentación
	Libre (LDP) versión 1.2.
        </para>
    </legalnotice>

    <revhistory>

        <revision>
            <revnumber>v1.0</revnumber>
            <date>2003-09-24</date>
            <authorinitials>cd</authorinitials>
            <revremark>Publicación inicial, revisada por el LDP.</revremark>
        </revision>

        <revision>
            <revnumber>v0.9</revnumber>
            <date>2003-09-11</date>
            <authorinitials>cd</authorinitials>
            <revremark>Actualizado y convertido a DocBook XML.</revremark>
        </revision>

    </revhistory>

</articleinfo>

<sect1 id="partition-layout">
    <title>Establecer la disposición de las particiones</title>
    <para>Su disco duro (hda) debe tener al menos tres particiones:
    <itemizedlist>
        <listitem><para>hda1: esta pequeña (~4 MB) partición pedirá una
	contraseña para poder montar el sistema de ficheros raíz
	encriptado.
        </para></listitem>
        <listitem><para>hda2: esta partición encriptada contendrá su
	partición raíz.
        </para></listitem>
        <listitem><para>hda3: esta partición contiene el sistema GNU/Linux
	en sí.
        </para></listitem>
    </itemizedlist>
    </para>
</sect1>

<sect1 id="enable-strong-crypto">
    <title>Activar la encriptación fuerte en su sistema</title>
    <sect2 id="install-kernel">
        <title>Instalar Linux-2.4.22</title>
	<para>Existen dos proyectos principales que añaden soporte de
	criptografía fuerte en el kernel: CryptoAPI y loop-aes. Este COMO
	utiliza loop-aes, ya que posee una implementación extremadamente
	rápida y muy optimizada de Rijndael en lenguaje ensamblador, y
	por lo tanto proporciona un rendimiento máximo si tiene una CPU
	IA-32 (x86).
        </para><para>Primero descargue y descomprima las fuentes del
	kernel:
        </para><para>
<ulink url="ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.22.tar.bz2"></ulink>
        </para><para>También tiene que descargar y descomprimir:
        </para><para>
<ulink url="http://loop-aes.sourceforge.net/loop-AES/loop-AES-v1.7e.tar.bz2"></ulink>
        </para><para>Luego debe parchear el kernel:
        </para><para>
<screen>linux-2.4.22 $ patch -Np1 -i ../loop-AES-v1.7e/kernel-2.4.22.diff</screen>
        </para><para>Luego, configure su kernel; asegúrese de que activa
	las siguientes opciones:
        </para><para>
<screen>    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</screen>
        </para><para>Configure el mapa de teclado:
        </para><para>
<screen>linux-2.4.22 $ dumpkeys | loadkeys -m - > drivers/char/defkeymap.c</screen>
        </para><para>Compile el kernel, instálelo y reinicie.
        </para>
    </sect2>
    <sect2 id="install-util-linux">
    <title>Instalar util-linux-2.12pre</title>
    <para>El programa <command>losetup</command>, que es parte del paquete
    <literal>util-linux</literal>, debe parchearse y recompilarse para
    poder añadirle soporte para criptografía fuerte.
    </para><para>Descargue y descomprima:
    </para><para>
<ulink url="http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12pre.tar.gz"></ulink>
    </para><para>Entre en el directorio
    <filename>util-linux-2.12pre</filename> y aplique este parche:
    </para><para>
<screen>$ patch -Np1 -i ../loop-AES-v1.7e/util-linux-2.12pre.diff</screen>
    </para><para>Para poder utilizar contraseñas de menos de 20 caracteres,
    introduzca:
    </para><para>
<screen>$ CFLAGS=&quot;-O2 -DLOOP_PASSWORD_MIN_LENGTH=12&quot;; export CFLAGS</screen>
    </para><para>Si la seguridad es importante, por favor, no active las
    contraseñas de menos de 20 caracteres. La seguridad no es gratuita, uno
    tiene que 'pagar' en forma de contraseñas largas.
    </para><para>Compile <command>losetup</command> e instálelo como root:
    </para><para>
<screen>$ ./configure &amp;&amp; make lib mount

# cp mount/losetup /sbin
# rm -f /usr/share/man/man8/losetup.8.gz
# cp mount/losetup.8 /usr/share/man/man8</screen>
    </para>
    </sect2>
</sect1>

<sect1 id="encrypt-root-filesystem">
    <title>Crear el sistema de ficheros raíz encriptado</title>
    <para>Rellene la partición objetivo con datos aleatorios:
    </para><para>
<screen># shred -n 1 -v /dev/hda2</screen>
    </para><para>Configure el dispositivo <literal>loopback</literal>:
    </para><para>
<screen># losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2</screen>
    </para><para>Para una mayor seguridad, es recomendable que use la
    opción <literal>-S xxxxxxxxxx</literal>, donde
    <literal>xxxxxxxxxx</literal> es la semilla que haya elegido
    (aleatoriamente). Esto previene de ataques optimizados con diccionario.
    </para><para>Además, tenga en cuenta que utilizar AES de 256 bits no
    será más seguro, ya que incluso el AES de 128 bits es imposible de
    craquear por fuerza bruta. Por añadidura, AES-256 es un 25% más lento
    que AES-128.
    </para><para>Ahora cree el sistema de ficheros ext2 (o ext3 o
    reiserfs).
    </para><para>
<screen># mke2fs /dev/loop0</screen>
    </para><para>Compruebe que ha introducido correctamente la contraseña:
    </para><para>
<screen># losetup -d /dev/loop0
# losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2
Password:
# mount /dev/loop0 /mnt</screen>
    </para><para>Puede comparar los datos encriptados con los
    desencriptados:
    </para><para>
<screen># xxd /dev/loop0 | less
# xxd /dev/hda2  | less</screen>
    </para>
</sect1>

<sect1 id="system-install">
    <title>Instalar su sistema Linux encriptado</title>
    <sect2 id="regular-distro">
        <title>Si utiliza una distribución de GNU/Linux</title>
        <para>Este comando funciona en todas las distribuciones, incluyendo
	a Debian, Gentoo, Mandrake y RedHat.
        </para><para>
<screen># cp -avx / /mnt</screen>
        </para>
    </sect2>
    <sect2 id="linux-from-scratch">
        <title>Si utiliza el libro Linux Desde Cero</title>
        <para>Proceda como se describe en el manual, con la modificación
	siguiente:
            <itemizedlist>
                <listitem>
<para>Capítulo 6 - Instalación de util-linux:</para>
<para>Aplique el parche de loop-AES tras descomprimir el código fuente.</para>
                </listitem><listitem>
<para>Capítulo 8 - Hacer el sistema LFS arrancable:</para>
<para>Consulte el capítulo 5 de este COMO.</para>
                </listitem>
            </itemizedlist>
        </para>
    </sect2>
</sect1>

<sect1 id="boot-device">
    <title>Configurar el dispositivo de arranque</title>
    <sect2 id="initial-ramdisk">
    <title>Crear el <literal>ramdisk</literal></title>
        <para>Para empezar, haga un <command>chroot</command> a la
	partición encriptada y cree el punto de montaje del dispositivo de
	arranque:
        </para><para>
<screen>chroot /mnt
mkdir /loader</screen>
        </para><para>Luego cree el <literal>ramdisk</literal> inicial
	(<literal>initrd</literal>) que se necesitará más adelante:
        </para><para>
<screen>dd if=/dev/zero of=initrd bs=1k count=4096
mke2fs -F initrd
mkdir ramdisk
mount -o loop initrd ramdisk</screen>
        </para><para>Cree la jerarquía del sistema de ficheros y copie los
	ficheros requeridos dentro de ella:
    </para><para>
<screen>mkdir ramdisk/{bin,dev,lib,mnt,sbin}
cp /bin/{sh,mount,umount} ramdisk/bin/
cp -a /dev/{console,hda2,loop0} ramdisk/dev/
cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2,libncurses.so.5} \
    ramdisk/lib/
cp /sbin/{losetup,pivot_root} ramdisk/sbin/</screen>
    </para><para>Cree el script de inicio (no olvide sustituír
    <literal>xxxxxxxxxx</literal> por la contraseña que haya elegido):
    </para><para>
<screen>cat &gt; ramdisk/sbin/init &lt;&lt; &quot;EOF&quot;
#!/bin/sh

/sbin/losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2
/bin/mount -n -t ext2 /dev/loop0 /mnt

while [ $? -ne 0 ]
do
    /sbin/losetup -d /dev/loop0
    /sbin/losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2
    /bin/mount -n -t ext2 /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>Desmonte el dispositivo <literal>loopback</literal> y
    comprima el <literal>initrd</literal>:
    </para><para>
<screen>umount -d ramdisk
rmdir ramdisk
gzip initrd</screen>
    </para>
    </sect2>
    <sect2 id="boot-partition">
    <title>Configurar la partición de arranque</title>
        <para>Cree y monte el sistema de ficheros ext2:
        </para><para>
<screen>mke2fs /dev/hda1
mount -t ext2 /dev/hda1 /loader</screen>
        </para><para>Copie el kernel compilado en el capítulo 2.1 y el
	<literal>ramdisk</literal> inicial:
        </para><para>
<screen>cp /path/to/vmlinuz /loader/
cp /path/to/initrd.gz /loader/</screen>
        </para><para>Configure y ejecute LILO:
        </para><para>
<screen>mkdir /loader/{boot,dev,etc}
cp /boot/boot.b /loader/boot/
cp -a /dev/{hda,hda1,ram0} /loader/dev/
cat &gt; /loader/etc/lilo.conf &lt;&lt; EOF
lba32
boot=/dev/hda
root=/dev/ram0
vga=4
read-only
image=/vmlinuz
    label=Linux
    initrd=/initrd.gz
EOF
lilo -r /loader</screen>
        </para>
    </sect2>
    <sect2 id="bootable-cd">
    <title>Arrancar desde un CD-ROM</title>
        <para>Puede que elija no utilizar <filename>/dev/hda1</filename>
	como dispositivo de arranque, sino que queme el kernel y el
	<literal>ramdisk</literal> en un CD-ROM arrancable. Descargue y
	descomprima <literal>syslinux</literal>:
        </para><para>
<ulink url="ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.06.tar.gz"></ulink>
        </para><para>Configure el <literal>isolinux</literal>:
        </para><para>
<screen>mkdir bootcd
cp /path/to/vmlinuz bootcd/
cp /path/to/initrd.gz bootcd/
cp syslinux-2.06/isolinux.bin bootcd/
echo &quot;DEFAULT vmlinuz initrd=initrd.gz root=/dev/ram0 vga=4&quot; \
    &gt; bootcd/isolinux.cfg</screen>
        </para><para>Cree y queme la imagen ISO arrancable en el CD:
        </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 16 -v bootcd.iso</screen>
        </para>
    </sect2>
</sect1>

<sect1 id="bootscripts">
    <title>Configurar los scripts de inicio</title>
    <para>Asegúrese de que <filename>/etc/fstab</filename> contiene:
    </para><para>
<screen>/dev/loop0      /      ext2    defaults             0 1</screen>
    </para><para>En este punto, hda3 ya no se necesita, así que puede crear
    un sistema de ficheros encriptado en esta partición y utilizarla como
    copia de seguridad.
    </para><para>Además es una buena idea comprobar la integridad de la
    partición de arranque dentro de la partición encriptada, para poder
    detectar si una agencia gubernamental como el FBI o la NSA ha
    modificado su partición de arranque para intentar coger su contraseña.
    Añada el siguente script, que puede llamarse por ejemplo
    <filename>S00checkloader</filename>, en el directorio de arranque del
    sistema (<filename>/etc/rcS.d/</filename> en Debian):
    </para><para>
<screen>#!/bin/sh

echo -n &quot;Checking master boot record integrity: &quot;
if [ &quot;`dd if=/dev/hda count=1 2&gt;/dev/null | md5sum`&quot; = \
     &quot;e051a4532356709c73b86789acfbdbbd  -&quot; ]
then
    echo &quot;OK.&quot;
else
    echo -n &quot;FAILED! press Enter to continue.&quot;
    read
fi

echo -n &quot;Checking boot partition integrity: &quot;
if [ &quot;`dd if=/dev/hda1 2&gt;/dev/null | md5sum`&quot; = \
     &quot;f3686a17fac8a1090d962bef59c86d3b  -&quot; ]
then
    echo &quot;OK.&quot;
else
    echo -n &quot;FAILED! press Enter to continue.&quot;
    read
fi</screen>
    </para><para>(debe reemplazar las dos <literal>md5sums</literal> de
    arriba por las correctas).
    </para><para>Ahora, si no tiene mucha RAM, necesitará algún espacio de
    intercambio. Supongamos que hda4 contendrá su partición
    de intercambio encriptada; debe crear primero el dispositivo
    <literal>swap</literal>:
    </para><para>
<screen># shred -n 1 -v /dev/hda4
# losetup -e aes128 /dev/loop1 /dev/hda4
# mkswap /dev/loop1</screen>
    </para><para>Luego añada las siguientes líneas al final de
    <filename>S00checkloader:</filename>
    </para><para>
<screen>echo &quot;password chosen above&quot; | \
    losetup -p 0 -e aes128 /dev/loop1 /dev/hda4
swapon /dev/loop1</screen>
    </para>
</sect1>

<sect1 id="about">
    <title>Sobre este COMO</title>
    <para>El "COMO configurar un sistema de ficheros raíz encriptado" fue
    excrito por primera vez en noviembre de 2002 para el proyecto
    <ulink url="http://www.linuxfromscratch.org/lfs/news.html">Linux
    From Scratch</ulink> (<ulink
    url="http://www.escomposlinux.org/lfs-es/">Linux desde cero</ulink>, en
    español). Quiero darle las gracias a la gente que desde entonces me ha
    ayudado a mejorar este COMO (en orden cronológico inverso): Josh
    Purinton, Jari Ruusu y Zibeli Aton.
    </para><para>Por favor, envíeme cualquier comentario a &lt;devine (at)
    cr0.net&gt;.
    </para><para>La última versión de este documento está en:
    </para><para>
<ulink url="http://www.cr0.net:8040/code/crypto/efs-howto.php"></ulink>
    </para>
</sect1>

</article>
