Cifrado extremo en GNU/Linux (Primera Parte)

Si bien es cierto que el tema de cifrado está muy de moda en estos tiempos, también es cierto que me apasiona todo lo referido al mismo y por eso me debía un artículo al respecto. Si has leído alguna de mis publicaciones anteriores ya sabés que la seguridad, la privacidad, el anonimato son prioridades en mi vida por las redes y la informática y me gusta pensar y actuar en este sentido. Por lo tanto, cifro tanto como puedo y si no puedo, también lo cifro. De ahí, el título de este artículo: en esta entrada voy a hacer un recorrido por las distintas etapas del proceso y las herramientas que uso para un cifrado de pies a cabeza en un sistema operativo GNU/Linux.

Etapa 0: pensar antes de actuar

Antes de empezar a meter dedo en el teclado es muy importante tomarse un tiempo para definir objetivos. Esto permitirá optimizar tiempos, elegir las herramientas adecuadas y tener resultados de calidad. Para esto conviene que tengamos claridad respecto de los ataques a los que podemos estar expuestos, el tipo de dispositivo que estamos cifrando (laptop, escritorio, móvil) y el destino o uso que le damos a este dispositivo (servidor, uso hogareño, trabajo).

Por ejemplo, el cifrado que necesitamos en una computadora de escritorio que tengamos en casa no tiene por qué ser el mismo (aunque puede serlo) que para una máquina de las mismas características pero que está en nuestro lugar de trabajo y que compartimos con otros usuarios. Por otro lado, también podemos hacer una distinción si el equipo en casa sólo lo usamos para navegar o escuchar música o si lo usamos para guardar documentos con información de tipo sensible, como documentos legales. Insisto, podremos usar el mismo cifrado, pero no necesariamente debemos hacerlo.

Por lo tanto, en esta etapa de planificación cabrá hacerse preguntas del tipo: ¿Contra qué clase de ataques deseamos protegernos? ¿Cuál será la estrategia apropiada para cifrar? ¿Cómo trataremos los datos temporales como el espacio de intercambio (swap), logs, etcétera? ¿Qué trato se le dará a un sistema con múltiples usuarios? ¿Cómo y en qué momento se accederá a los datos cifrados?

Etapa 1: cifrado total o parcial de un disco duro o de una partición de disco duro

Cifrar el disco duro y los datos de usuarios es primordial para proteger nuestra privacidad. La principal ventaja de cifrar un disco o partición de disco radica en que impide el acceso físico no autorizado a los datos contenidos en dicho dispositivo y su manipulación. Las herramientas que disponemos para realizar este tipo de cifrado están categorizadas de varias maneras. En cuanto a mí, tengo preferencia por dos de ellas: ecryptfs para cifrar directorios y archivos; dm-crypt para cifrar un disco duro completo o alguna de sus particiones.

Por otra parte, muchas distribuciones GNU/Linux como Manjaro, openSUSE, CentOS, Debian y Ubuntu, por nombrar sólo algunas, nos dan la oportunidad de configurar características de cifrado del sistema, particiones y datos de usuario (/home) directamente al el momento de la instalación. En mi opinión esto es algo fantástico y lo he utilizado siempre al trabajar con este tipo de distribuciones.

De manera entonces que no quedan excusas para proteger nuestros datos y nuestro sistema, basta con elegir un método, las herramientas y poner manos a la obra. A continuación voy a realizar una simulación a modo de ejemplo para la cual escogí a Manjaro como distribución. Digamos entonces que ya instalé el sistema escogiendo las opciones de cifrado de mi preferencia quedando mi configuración de la siguiente manera:

/dev/sda1: partición de arranque (/boot) sin cifrar

/dev/sda2: partición raíz (/), cifrada con LUKS

/dev/sda3: directorio de datos de usuario (/home). En este caso lo dejo sin cifrar para hacerlo luego utilizando la herramienta ecryptfs.

/dev/sda4: espacio de intercambio (swap). También quedará sin cifrar en este momento, ya que trataré este punto en la etapa siguiente.

Ahora bien, he iniciado el equipo, ingresé la clave de cifrado para el sistema y estoy en la pantalla del gestor de inicio, esperando para ingresar la contraseña. Lo primero que haremos una vez iniciada la sesión será instalar las actualizaciones del sistema para tenerlo a la fecha para luego buscar e instalar los paquetes necesarios. Abrimos una consola de comandos y ejecutamos:

$ sudo pacman-mirrors -g && sudo pacman -Syy

$ sudo pacman -S manjaro-keyring archlinux-keyring

$ sudo pacman -Syu
(Este comando lo ejecutamos cuando iniciamos Manjaro por primera vez. Lo que hace es: optimizar la lista de mirrors, actualizar la base de datos de repositorios, instalar las claves y firmas de Manjaro y Archlinux, actualizar el sistema)
$ sudo pacman -S ecryptfs-utils keyutils rsync lsof
(Notaremos que estos paquetes ya vienen instalados en Manjaro)

Ahora ya estamos listos para cifrar el directorio /home de nuestro usuario. Para esto, cerramos la sesión de escritorio y abrimos una sesión en tty2 presionando Ctrl+Alt+F2 iniciando como usuario root:

tty2

hostname login: root
Password: ******************
Last Login […]

# killall -u usuario && ps -U usuario
(Es necesario que el usuario a quien vamos a cifrar su directorio /home no tenga ningún proceso en ejecución y que dicho directorio no esté montado)

El siguiente paso consiste en asegurarnos que el nuevo directorio /home cifrado será desbloqueado y montado al momento de que el usuario inicie sesión y no posteriormente como si se tratara de un directorio cualquiera. Para esto, modificaremos el archivo “/etc/pam.d/system-auth” de la siguiente forma:

# nano /etc/pam.d/system-auth

/etc/pam.d/system-auth

Posterior a la línea “auth required pam_unix.so” escribimos

auth     required pam_ecryptfs.so     unwrap

Arriba de la línea “password required pam_unix.so” escribimos

password     optional      pam_ecryptfs.so

Posterior a la línea “session required pam_unix.so” escribimos

session     optional      pam_ecryptfs.so     unwrap

Guardamos y cerramos el archivo

Finalmente, nos encontramos en condiciones de cifrar el directorio:

# modprobe ecryptfs

# ecryptfs-migrate-home -u usuario
Passphrase: ************
(Cargamos el módulo y realizamos la migración a un directorio cifrado. Este proceso puede tomar mucho tiempo dependiendo de la cantidad del tamaño del directorio) (Es muy importante que la Passphrase sea la misma que la clave de inicio de sesión del usuario. Esto servirá para que desbloquee el directorio en forma automática al iniciar sesión)
(Finalizado el proceso, cerramos la sesión y cambiamos a tty1 con Ctrl+Alt+F1 e iniciamos sesión normalmente con el usuario)  (Durante el proceso, ecryptfs hará una copia de seguridad creando un directorio /home/usuario.datos_aleatorios el cual puede ser borrado una vez verificado que todo esté en su lugar)

Hasta acá hemos realizado una instalación en limpio de una distribución GNU/Linux cifrando el directorio raíz al momento de configurar las particiones y luego hemos cifrado el directorio /home/usuario para proteger los datos allí almacenados. Hemos iniciado sesión con este usuario y hemos verificado que esté todo funcionando correctamente. Ahora podremos reiniciar el sistema y pasar a la próxima etapa del proceso…

Etapa 2: tratamiento del espacio de intercambio

En términos muy simples, el espacio de intercambio o swap corresponde a una porción del disco donde van siendo descargados datos temporales desde la memoria de lectura del sistema. Aquí van quedando almacenados datos muy sensibles, como por ejemplo credenciales de sitios web, contraseñas y más. No hay que pensar demasiado para notar las amenazas a la privacidad y la importancia que representa cifrar esta información, sobre todo si consideramos que al hibernar o suspender un equipo, todo va a parar a swap.

Siguiendo con la simulación anterior, vamos ahora a proceder con el cifrado de esta partición. Para esto, simplemente ejecutaremos:

$ sudo ecryptfs-setup-swap -f
(El script modificará el archivo /etc/fstab comentando las líneas que tengan particiones swap automontadas y añadiendo al final “/dev/mapper/cryptwap1 none swap sw 0 0” para montar la nueva partición swap cifrada)
(Además, modificará el archivo /etc/cryptswap añadiendo la línea “cryptswap1 UUID=id_de_la_particion_swap /dev/urandom swap,offset=1024,cipher=aes-xts-plain64”)
$ swapon -s
(Verificamos que haya quedado cifrado correctamente)
Nombre del fichero   Tipo        Tamaño    Utilizado  Prioridad
/dev/dm-1            particion   2097180   164        -1

Breve Pausa: gestión de contraseñas

Aunque las he nombrado a lo largo de toda la entrada, es el momento de hacer una pausa y dedicarle un apartado especial a las contraseñas. Muchos estudios se han realizado al respecto y se ha encontrado que la mayoría de las personas utilizan claves que son muy fácilmente desbloqueables, como por ejemplo la misma palabra que describe al usuario o al sistema operativo (algo así como usuario: root, contraseña: manjaro), fechas de nacimiento, nombre de sus hijos o mascotas y un largo etcétera. Sumado a esto, muchas personas utilizan la misma clave para todo, quizá con algún pequeño cambio.

De nada servirá que cifremos si vamos a utilizar contraseñas de este tipo. Para que cualquier acción que tomemos con el fin de proteger nuestra privacidad y nuestra información tenga sentido debemos utilizar contraseñas fuertes. Mi recomendación al respecto es generar claves de muchos dígitos, en especial si la cantidad es un número primo (19, 31). Además, esta contraseña debe ser una combinación de letras, números y caracteres especiales (siempre que lo permita) y estos números no deben remplazar letras: la clave “milanesasconpure” es tan mala como “m1l4n3545c0n9ur3”.

Claro, una contraseña de las características descritas es muy difícil de recordar. Para ayudarnos tenemos algunos métodos, como por ejemplo, usar una contraseña que responda a los movimientos para piano de una melodía especial. Otra forma que muchos utilizan es cifrar también sus contraseñas mediante el uso de una aplicación específica para estos fines, de manera que sólo debemos recordar una única contraseña maestra que sirve para desbloquear (individualmente) las contraseñas cifradas.

Etapa 3: archivos y directorios

Pues bien, ya hemos hablado de las contraseñas y toca ahora que veamos cómo crear un directorio Privado donde podremos almacenar datos de manera cifrada y que, al contrario del cifrado completo del directorio /home, este será desbloqueado y montado sólo al momento en que lo necesitemos para luego ser desmontado nuevamente. Esto nos permitirá tener estos datos resguardados mientras utilizamos el equipo, impidiendo el acceso físico y remoto no autorizado a los mismos. Comenzaremos como siempre, abriendo una consola y ejecutando:

$ ecrytpfs-setup-private --nopwcheck --noautomount
Este script creará los directorios ocultos ~/.Private y ~/.ecryptfs (sin no existen previamente). La opción –nopwcheck sirve para utilizar una contraseña distinta a la de inicio de sesión del usuario; la opción –noautomount se explica a sí misma. Durante el proceso se solicitarán dos claves: una para login y otra para montaje. La segunda será la clave que desbloquee el directorio, la primera será la clave bajo la que será cifrada la clave de montaje, por lo cuál, al momento de montar el directorio, se solicitará únicamente la primera contraseña.

Para montar y desmontar este directorio cifrado, ejecutaremos respectivamente:

$ encryptfs-mount-private

$ encryptfs-umount-private

 

Final de la Primera Parte

En esta entrada hemos visto cómo resguardar los datos en nuestro disco duro (permanentes y temporales) mediante el uso de las herramientas de cifrado que disponemos para optimizar este proceso. Pero para llevar este cifrado al extremo debemos pensar que como usuarios de un sistema efectuamos un gran número de operaciones con nuestros equipos: navegamos por la vasta red de Internet, enviamos y recibimos correo electrónico, guardamos información en servicios de almacenamiento en “nube”, descargamos paquetes que luego instalamos, enviamos mensajes de chat y mucho más.

No es necesario aclarar la importancia que implica realizar estas operaciones de manera segura mediante el cifrado de la información. Quedo entonces comprometido a publicar la Segunda Parte de este artículo donde trataré todos los temas pendientes y sumaré una pequeña perlita sobre herramientas de cifrado para dispositivos móviles.


Fuentes:
https://wiki.archlinux.org/index.php/Disk_encryption
https://wiki.archlinux.org/index.php/Dm-crypt
https://wiki.archlinux.org/index.php/ECryptfs
https://wiki.archlinux.org/index.php/Security#Choosing_secure_passwords

 

Anuncios

Un pensamiento en “Cifrado extremo en GNU/Linux (Primera Parte)

  1. Pingback: Cifrado extremo en GNU/Linux (Segunda Parte) | GNU/Linuxfilia Incurable

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s