Encriptando sistemas ya instalados
En este artículo voy a tratar de explicar cómo encriptar todo un sistema Debian (aunque sea fácilmente extraplorable a otros sistemas GNU/Linux o incluso sólo a partes del sistema como /home).
La idea surgió revisando el antiguo contenido de esdebian y en concreto un artículo del blog de BlackRider, éste:
A través de los siguientes pasos se podría conjugar lo que en el mencionado artículo se denomina LA PROPUESTA DEL SOCIÓPATA con el deseo del usuario de mantener sus customizado sistema Debian. En el artículo no me concentraré en el borrado seguro de datos del sistema inicial, sólo en las operaciones necesarias para obtener el resultado deseado, que decir tiene, que si queremos emular al sociópata debemos borrar datos como el sociopata.
Para hacerlo más divertido y cubrir casi toda la posible problemática vamos a partir de un sistema Debian jessie instalado sin ningún tipo de encriptación en una única partición del disco duro. Esto es, como si utilizásemos la opción de todos los datos en una partición (opción para novatos) del instalador de Debian. Es cierto que esta opción nos crea una partición Swap, pero ésta no es relevante y puede ser o bien eliminada en sistemas con suficiente RAM o encriptada convenientemente (opción que se cubrirá en otro artículo).
Problemática:
- Para encriptar el sistema utilizando LUKS necesitamos una partición separada para /boot, y que además no esté encriptada. Esta es mi opción peferida aunque ahora grub2 pueda manejar particiones encriptadas.
- Necesitamos pasar los datos a un disco de almacenamiento intermedio, que nos servirá para pasar los datos de la / no encriptada a la / encriptada.
- Obviamente hay que configurar el sistema para que sea capaz de arrancar bajo esta nueva configuración, para lo cual se necesitará un Live-CD desde el que hacer chroot. Ante la falta de imágenes oficiales en Debian cada cual puede usar la que más le plazca, en este caso SystemRescueCD, pero podrían usarse otras como Porteus.
Comenzamos:
Lo primero es arrancar nuestro sistema incial e instalar cryptsetup. (Todos los comandos se ejecutan como root).
apt install cryptsetup
Usando nuestro HDD externo se procede a realizar una copia de seguridad. Hay muchas maneras de llevar a cabo esta operación. Yo apagaría el sistema inicial, arrancaría con un Live-CD y procedería a copiar via rsync todo el sistema en una partición encriptada del HDD y formateada con el mismo sistema de archivos que el del sistema inicial (Ext4 en el ejemplo). Se puede hacer via tarball, pero los acls son un dolor de muelas y aunque está soportados por las versiones modernas de tar yo no he encontrado resultados satisfactorios. En cualquier caso, en un sistema standard sólo afectaría a /media. Detallaré la opción tar, por ser la que pueda dar más problemas, pero más versatil, al necesitar sólo un archivo y no todo un sistema de archivos. Todos los comandos que siguen se hacen desde la Live-CD de elección.
tar --selinux --acls --xattrs -cvf miarchivotar_en_el_HDD.tar /mnt/Donde_este_montado_el_sistema_inicial
getfacl /media/$USER > $USER_acl.acl ## Esto habría que hacerlo para cada usuario en caso de haber varios
En el código se han incluido además del codigo tar, cómo guardar los acls manualmente, ya que tar no parece manejarlos correctamente (por mi experiencia), la posible configuración de selinux (si lo usas este artículo probablemente te parezca un juego de niños). Para los curiosos:
Ahora que ya tenemos nuestro bonito backup (nunca se puede estresar suficientemente esto para todo backup) COMPROBAR SU INTEGRIDAD Y QUE HA SIDO REALIZADO CORRECTAMENTE.
Posteriormente se reformatea el HDD donde se encontraba el sistema inicial. Yo usaría Gparted, que combina funcionalidad y sencillez, pero otras opciones como fdisk son igualmente válidas. Como resultado, suponemos que nos queda una partición de 400MB formateada en Ext2/3/4 que será nuestro /boot y otra partición con el resto del sistema que dejaremos sin formato. Nótese que se ha eliminado completamente la swap, ya que para entornos de máxima seguridad no es aconsejable, en cualquier caso, se cubrirá esta eventualidad en un artículo posterior.
¡A encriptar se ha dicho!
cryptsetup luksFormat /dev/sda2
## Si nuestro CPU es muy lento, tipo Netbook, podemos disminuir el tamaño de la clave de los 256 bit por defecto
cryptsetup --key-size 128 luksFormat /dev/sda2
#Nos pedirá confirmar la contraseña
cryptsetup luksOpen /dev/sda2 root
mkfs.ext4 /dev/mapper/root
mount /dev/mapper/root /mnt
Ahora ya tenemos nuestro nuevo sistema de ficheros ext4 en un contenedor luks montado en /mnt, sólo queda desempaquetar el archivo tar en el susodicho punto de montaje:
cd /mnt ; tar -xvf /ruta_a/miarchivotar_en_el_HDD.tar
#Movemos el contenido de /boot a su partición
mount /dev/sda1 /media
cd /mnt/boot
cp -r * /media/
rm -r *
cd /
umount /dev/sda1
mount /dev/sda1 /mnt/boot
Esto va tomando forma, ahora solo falta realizar los ajustes necesarios para que el nuevo sistema sea capaz de arrancar, para esto debemos de hacer chroot en el sistema, por esto es importante que nuestro LiveCD sea de la misma arquitectura que el sistema inicial.
cd /mnt
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
mount --rbind /dev/pts dev/pts
cp /etc/resolv.conf etc/resolv.conf
chroot /mnt /bin/bash
#Ahora podríamos restaurar los acls, aunque se puede dejar para cuando tengamos un sistema booteable, que decir tiene que el archivo debe de estar dentro de la estructura del chroot
setfacl --restore=ruta_a_$USER.acl
##Ahora ya estamos en el entorno chroot
blkid #Imporatante conocer el UUID de todas las particiones, output:
/dev/sda1: UUID="uuiddelaparticon_sda1" TYPE="ext2"
/dev/sda2: UUID="uuiddelaparticon_sda2" TYPE="crypto_LUKS"
Pasamos ahora a editar (dentro del chroot) los archivos /etc/fstab y /etc/crypttab, debiendo quedar así respectivamente:
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=uuiddelaparticion_sda1 /boot ext2 defaults 0 2
/dev/mapper/root / ext4 errors=remount-ro 0 1
root UUID=uuiddelaparticion_sda2 none luks
Hecho esto, le estamos diciendo al sistema que la partición encriptada root tiene una UUID, que debe desencriptarla para poder montarla como el sistema raiz. Para que estos cambios se hagan efectivos debemos actualizar el initramfs.
update-initramfs -u -k all
#Ya que estamos lo actualizamos todo, aunque no es necesario ni no hemos cambiado la tabla de particiones
grub-install /dev/sda
update-grub
#Y salimos del chroot
exit
¡Hecho! Ya solo queda disfruta de nuestro mismo sistema pero convenientemente encriptado.
En otro próximo artículo incluiré variaciones como:
- Otra distribución de particiones
- Uso de LVM
- Swap
Fuentes:
Además de los enlaces anteriores, la wike de Arch.
- Inicie sesión o regístrese para comentar
- 311 lecturas
El tema suena interesante, y seguro que da información util, (lo leere en otro momento, ofline, ahora mismo no).
Solo quiero llamar la atención de que según que pais, "encriptar" no es una palabra reconocida, por mucho que
la usen locutores y periodistas, (vergüenza deberia darles hacer mal uso de las herramientas de su profesion).
En España por ejemplo, "encriptar" no está reconocida en el diccionario. Aparece como mucho como vocablo
extranjero "que corre por ahi". Pero tiene categoria de barbarismo.
La palabra reconocida y propuesta por la rae es CIFRAR, cifrado, descifrado, etc. Lo cual en el mundo de los ordenadores,
"really make sense".
Pues eso, y a pesar de las posibles incorreciones, gracias por la aportación.
Gracias por la corrección ortográfica Percontator jaja (Nazi-grammars everywhere)
Podríamos iniciar una bonita discusión sobre si los idiomas requieren de instituciones que determinen que palabras son correctas. Yo en este caso soy muy anglosajón. Pero me remito a la propia RAE... ¿Parece que la realidad ya se ha impuesto?
En todo caso no me gustaría que la cosa deviniese en una discusión ortográfica (que siempre es importante), sino canalizar las energías en la problemática planteada en el artículo y las posibles variaciones. ¡A ver si no me dejo nada en el segundo artículo!
Gracias por comentar igualmente ;)
Comfortably numb