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.0 | 2003-09-24 | cd |
Publicación inicial, revisada por el LDP. | ||
Revision v0.9 | 2003-09-11 | cd |
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
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í.
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.
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
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
Este comando funciona en todas las distribuciones, incluyendo a Debian, Gentoo, Mandrake y RedHat.
# cp -avx / /mnt
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
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
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
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
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: