CÓMO configurar un sistema de ficheros raíz encriptado

Christophe Devine

Traducción: Gabriel Rodríguez Alberich

Este COMO está publicado bajo la Licencia de Documentación Libre (LDP) versión 1.2.

Revision History
Revision v1.02003-09-24cd
Publicación inicial, revisada por el LDP.
Revision v0.92003-09-11cd
Actualizado y convertido a DocBook XML.

Abstract

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


Table of Contents

Establecer la disposición de las particiones
Activar la encriptación fuerte en su sistema
Instalar Linux-2.4.22
Instalar util-linux-2.12pre
Crear el sistema de ficheros raíz encriptado
Instalar su sistema Linux encriptado
Si utiliza una distribución de GNU/Linux
Si utiliza el libro Linux Desde Cero
Configurar el dispositivo de arranque
Crear el ramdisk
Configurar la partición de arranque
Arrancar desde un CD-ROM
Configurar los scripts de inicio
Sobre este COMO

Establecer la disposición de las particiones

Su disco duro (hda) debe tener al menos tres particiones:

  • hda1: esta pequeña (~4 MB) partición pedirá una contraseña para poder montar el sistema de ficheros raíz encriptado.

  • hda2: esta partición encriptada contendrá su partición raíz.

  • hda3: esta partición contiene el sistema GNU/Linux en sí.

Activar la encriptación fuerte en su sistema

Instalar Linux-2.4.22

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).

Primero descargue y descomprima las fuentes del kernel:

ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.22.tar.bz2

También tiene que descargar y descomprimir:

http://loop-aes.sourceforge.net/loop-AES/loop-AES-v1.7e.tar.bz2

Luego debe parchear el kernel:

linux-2.4.22 $ patch -Np1 -i ../loop-AES-v1.7e/kernel-2.4.22.diff

Luego, configure su kernel; asegúrese de que activa las siguientes opciones:

    Block devices  --->

        <*> Loopback device support
        [*]   AES encrypted loop device support (NEW)

        <*> RAM disk support
        (4096)   Default RAM disk size (NEW)
        [*]   Initial RAM disk (initrd) support

Configure el mapa de teclado:

linux-2.4.22 $ dumpkeys | loadkeys -m - > drivers/char/defkeymap.c

Compile el kernel, instálelo y reinicie.

Instalar util-linux-2.12pre

El programa losetup, que es parte del paquete util-linux, debe parchearse y recompilarse para poder añadirle soporte para criptografía fuerte.

Descargue y descomprima:

http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12pre.tar.gz

Entre en el directorio util-linux-2.12pre y aplique este parche:

$ patch -Np1 -i ../loop-AES-v1.7e/util-linux-2.12pre.diff

Para poder utilizar contraseñas de menos de 20 caracteres, introduzca:

$ CFLAGS="-O2 -DLOOP_PASSWORD_MIN_LENGTH=12"; export CFLAGS

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.

Compile losetup e instálelo como root:

$ ./configure && make lib mount

# cp mount/losetup /sbin
# rm -f /usr/share/man/man8/losetup.8.gz
# cp mount/losetup.8 /usr/share/man/man8

Crear el sistema de ficheros raíz encriptado

Rellene la partición objetivo con datos aleatorios:

# shred -n 1 -v /dev/hda2

Configure el dispositivo loopback:

# losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2

Para una mayor seguridad, es recomendable que use la opción -S xxxxxxxxxx, donde xxxxxxxxxx es la semilla que haya elegido (aleatoriamente). Esto previene de ataques optimizados con diccionario.

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.

Ahora cree el sistema de ficheros ext2 (o ext3 o reiserfs).

# mke2fs /dev/loop0

Compruebe que ha introducido correctamente la contraseña:

# losetup -d /dev/loop0
# losetup -e aes128 -S xxxxxxxxxx /dev/loop0 /dev/hda2
Password:
# mount /dev/loop0 /mnt

Puede comparar los datos encriptados con los desencriptados:

# xxd /dev/loop0 | less
# xxd /dev/hda2  | less

Instalar su sistema Linux encriptado

Si utiliza una distribución de GNU/Linux

Este comando funciona en todas las distribuciones, incluyendo a Debian, Gentoo, Mandrake y RedHat.

# cp -avx / /mnt

Si utiliza el libro Linux Desde Cero

Proceda como se describe en el manual, con la modificación siguiente:

  • Capítulo 6 - Instalación de util-linux:

    Aplique el parche de loop-AES tras descomprimir el código fuente.

  • Capítulo 8 - Hacer el sistema LFS arrancable:

    Consulte el capítulo 5 de este COMO.

Configurar el dispositivo de arranque

Crear el ramdisk

Para empezar, haga un chroot a la partición encriptada y cree el punto de montaje del dispositivo de arranque:

chroot /mnt
mkdir /loader

Luego cree el ramdisk inicial (initrd) que se necesitará más adelante:

dd if=/dev/zero of=initrd bs=1k count=4096
mke2fs -F initrd
mkdir ramdisk
mount -o loop initrd ramdisk

Cree la jerarquía del sistema de ficheros y copie los ficheros requeridos dentro de ella:

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/

Cree el script de inicio (no olvide sustituír xxxxxxxxxx por la contraseña que haya elegido):

cat > ramdisk/sbin/init << "EOF"
#!/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

Desmonte el dispositivo loopback y comprima el initrd:

umount -d ramdisk
rmdir ramdisk
gzip initrd

Configurar la partición de arranque

Cree y monte el sistema de ficheros ext2:

mke2fs /dev/hda1
mount -t ext2 /dev/hda1 /loader

Copie el kernel compilado en el capítulo 2.1 y el ramdisk inicial:

cp /path/to/vmlinuz /loader/
cp /path/to/initrd.gz /loader/

Configure y ejecute LILO:

mkdir /loader/{boot,dev,etc}
cp /boot/boot.b /loader/boot/
cp -a /dev/{hda,hda1,ram0} /loader/dev/
cat > /loader/etc/lilo.conf << EOF
lba32
boot=/dev/hda
root=/dev/ram0
vga=4
read-only
image=/vmlinuz
    label=Linux
    initrd=/initrd.gz
EOF
lilo -r /loader

Arrancar desde un CD-ROM

Puede que elija no utilizar /dev/hda1 como dispositivo de arranque, sino que queme el kernel y el ramdisk en un CD-ROM arrancable. Descargue y descomprima syslinux:

ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.06.tar.gz

Configure el isolinux:

mkdir bootcd
cp /path/to/vmlinuz bootcd/
cp /path/to/initrd.gz bootcd/
cp syslinux-2.06/isolinux.bin bootcd/
echo "DEFAULT vmlinuz initrd=initrd.gz root=/dev/ram0 vga=4" \
    > bootcd/isolinux.cfg

Cree y queme la imagen ISO arrancable en el CD:

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

Configurar los scripts de inicio

Asegúrese de que /etc/fstab contiene:

/dev/loop0      /      ext2    defaults             0 1

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.

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 S00checkloader, en el directorio de arranque del sistema (/etc/rcS.d/ en Debian):

#!/bin/sh

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

echo -n "Checking boot partition integrity: "
if [ "`dd if=/dev/hda1 2>/dev/null | md5sum`" = \
     "f3686a17fac8a1090d962bef59c86d3b  -" ]
then
    echo "OK."
else
    echo -n "FAILED! press Enter to continue."
    read
fi

(debe reemplazar las dos md5sums de arriba por las correctas).

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 swap:

# shred -n 1 -v /dev/hda4
# losetup -e aes128 /dev/loop1 /dev/hda4
# mkswap /dev/loop1

Luego añada las siguientes líneas al final de S00checkloader:

echo "password chosen above" | \
    losetup -p 0 -e aes128 /dev/loop1 /dev/hda4
swapon /dev/loop1

Sobre este COMO

El "COMO configurar un sistema de ficheros raíz encriptado" fue excrito por primera vez en noviembre de 2002 para el proyecto Linux From Scratch (Linux desde cero, 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.

Por favor, envíeme cualquier comentario a <devine (at) cr0.net>.

La última versión de este documento está en:

http://www.cr0.net:8040/code/crypto/efs-howto.php