.. _crypto-ext4: 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: #. Comprobar que el tamaño de página que usa el sistema y el tamaño de bloque del sistema de archivos son iguales\ [#]_:: # getconf PAGE_SIZE 4096 # tune2fs -l /dev/sda5 | awk '$0 ~ /^Block size:/ {print $NF}' 4096 .. note:: Suponemos que el sistema de archivos en el que queremos cifrar algunos directorios es :file:`/home` y que éste se encuentra sobre la partición :file:`/dev/sda5` #. 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 #. 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. .. rubric:: 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 :file:`/etc/fscrypt.conf` y en :file:`/.fscrypt`, y la segunda se requiere para poder usar otro tipo de claves para el cifrado. .. rubric:: 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. .. note:: 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 .. note:: Es posible añadir claves de desbloqueo extras a un directorio ya cifrado (p.e. a :file:`~/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 :file:`~/privado`. .. rubric:: 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 :program:`shred` para eliminar todo rastro de los archivos sin cifrar. .. note:: 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. .. rubric:: Notas al pie .. [#] Al crear el sistema de archivos, :ref:`mkfs.ext4 ` escoge un tamaño de bloque. Normalmente el tamaño es **4096**, pero puede ser menor, si la partición es muy pequeña. En cualquier caso, puede forzarse el tamaño con la opción :kbd:`-b`.