9.1.3.6.3. Cifrado con el sistema de archivos

Desde la versión 4.1 del kernel de Linux, ext4 soporta el cifrado transparente, así que podemos utilizar las capacidades del propio sistema de archivos para cifrar de forma transparente uno o alguno de sus directorios.

En consecuencia:

  • Es el propio sistema de archivos el que se encarga del cifrado, lo que mejora el rendimiento respecto a la solución anterior.

  • El sistema de archivos debe ser forzosamente ext4. Otros sistemas de archivos también pueden soportar cifrado, pero en ese caso, tendremos que estudiar cómo se cifra con ellos.

  • Como el anterior, es un método apropiado para cifrar datos de usuario.

Antes de empezar es necesario:

  1. Comprobar que el tamaño de página que usa el sistema y el tamaño de bloque del sistema de archivos son iguales[1]:

    # getconf PAGE_SIZE
    4096
    # tune2fs -l /dev/sda5 | awk '$0 ~ /^Block size:/ {print $NF}'
    4096
    

    Nota

    Suponemos que el sistema de archivos en el que queremos cifrar algunos directorios es /home y que éste se encuentra sobre la partición /dev/sda5

  2. Habilitar el cifrado para el sistema de archivos:

    # tune2fs -l /dev/sda5 | grep -q crypt && echo "Habilitado"
    # tune2fs -O encrypt /dev/sda5
    # tune2fs -l /dev/sda5 | grep -q crypt && echo "Habilitado"
    Habilitado
    
  3. Instalar el software adecuado:

    # apt install fscrypt libpam-fscrypt
    

    En puridad sólo necesitamos el primer paquete, pero el segundo permite desbloquear de forma transparente los directorios cifrados al autenticarse el usuario en el sistema.

Preparación

Antes de cifrar cualquier directorio es necesario crear las estructuras necesarias:

# fscrypt setup
# fscrypt setup /home

La primera orden crea la configuración /etc/fscrypt.conf y en /.fscrypt, y la segunda se requiere para poder usar otro tipo de claves para el cifrado.

Operativa

Para cifrar un directorio basta con que el usuario haga:

$ mkdir ~/privado
$ fscrypt encrypt ~/privado --source=pam_passphrase

que usará como clave su propia contraseña de usuario.

Nota

Sin embargo, al detectar la orden que nuestro directorio personal se encuentra en un sistema de archivos diferente al raíz, nos da la posibilidad de crear una clave extra que podremos usar para desbloquear el sistema en caso de que formateemos la partición raíz.

Además, de preparar el directorio para que se almacenen cifrados los datos, lo desbloquea, lo que significa que podremos escribir y leer dentro de él de forma transparente, aunque lo datos se guarden cifrados:

$ fscrypt status ~/privado
"/home/usuario/privado/" is encrypted with fscrypt.

Policy:  7892f8f9c076a98feac6ba4b22956021
Unlocked: Yes

Protected with 2 protector:
PROTECTOR         LINKED   DESCRIPTION
c53864a71dd271b8  Yes (/)  login protector for usuario
89fa83d5083aaf35  No       custom protector "Recovery passphrase for privado"

La ventaja de usar la contraseña de usuario es doble:

  • Al autenticarse en el sistema, todos los directorios cifrados con la contraseña de usuario, se desbloquearán automáticamente.

  • Al modificar la contraseña de usuario, cambiará solidariamente la clave de cifrado de todos esos directorios.

También puede usarse una clave distinta a la de usuario:

$ mkdir ~/secreto
$ fscrypt encrypt ~/secreto --source=custom_passphrase --name="miclave"
$ fscrypt status ~/secreto
"secreto/" is encrypted with fscrypt.

Policy:   6d6a13b4f0372393bf145dd5b82a41ea
Options:  padding:32 contents:AES_256_XTS filenames:AES_256_CTS policy_version:2
Unlocked: Yes

Protected with 1 protector:
PROTECTOR         LINKED  DESCRIPTION
ce8e40654e96553d  No      custom protector "miclave"

En este caso se ha usado una frase personalizada de nombre «miclave». En futuros reinicios, el directorio estará bloqueado y habrá que desbloquearlo explícitamente proporcionando la contraseña:

$ fscrypt unlock ~/secreto

Por otro lado, si se quiere cambiar la contraseña, habrá que ejecutar lo siguiente:

$ fscrypt metadata change-passphrase --protector=/home:ce8e40654e96553d

Nota

Es posible añadir claves de desbloqueo extras a un directorio ya cifrado (p.e. a ~/privado):

$ fscrypt metadata create protector /home --name="protector extra" --source=custom_passphrase
Create new protector on "/home" [Y/n] y
Enter custom passphrase for protector "protector extra":
Confirm passphrase:
Protector 1097fd3459807989 created on filesystem "/home".
$ fscrypt metadata add-protector-to-policy --protector=/home:1097fd3459807989 --policy=/home:7892f8f9c076a98feac6ba4b22956021

donde para policy hemos indicado la asociada a ~/privado.

Cifrado del propio directorio de usuario

Un caso muy socorrido es cifrar el directorio personal del usuario con la clave del propio usuario. Esta tarea debe llevarla a cabo el administrador y es conveniente que se lleve a cabo en el proceso de alta del usuario. En cualquier caso, puede obrarse del siguiente modo:

# mkdir /home/usuario.new
# chown usuario:usuario /home/usuario.new
# fscrypt encrypt /home/usuario.new --user=usuario
# cp -aT /home/usuario /home/usuario.new
# rm -rf /home/usuario
# mv /home/usuario.new /home/usuario

El tercer paso exige que el administrador proporcione la contraseña del usuario, o sea, que la conozca. Esto en realidad no es problema, porque después de la operación, el usuario podrá modificar la contraseña. El quinto paso, en puridad, requeriría el uso de una herramienta como shred para eliminar todo rastro de los archivos sin cifrar.

Nota

Lo lógico si se desea que los usuarios tengan cifrado su directorio es crear un script para que el alta incluya el cifrado de tal directorio.

Notas al pie