Cifrado con pam-mount,dm-crypt y LUKS
17/10/2016
Contents
Cifrado con pam-mount, dm-crypt y LUKS
Vamos a ver como se cifra el '/home' de los usuarios que deseemos, utilizando una única contraseña. La operativa se va a montar sobre un sistema en funcionamiento.
También vamos a cifrar el '/tmp' y el área de intercambio o 'swap', porque en ellas se puden almacenar datos sensibles.
Este procedimiento es ideal para portátiles y máquinas personales donde el número de usuarios ronde la unidad.
Ventajas
- Se puede conseguir cifrar directorios de usuarios sin afectar al resto del sistema.
- La operativa es muy sencilla. Una única password soluciona todos los problemas.
- El sistema arranca sin intervención del usuario.
- Los ficheros dentro del sistema cifrado conservan todos los atributos, funcionando igual que si no estubieran cifrados
Inconvenientes
- La operativa de cambio de password se complica.
- En sistemas multiusuario, otros usuarios con permisos pueden ver el contenido de la unidad cifrada mientras esta esté utilizándose.
- Los datos sensibles alamcenados en '/tmp' o en la 'swap' puden estar accesiblea a otros usuarios con los permisos suficientes mientras el sistema no se apague o reinicie.
Sistemas utilizados
Debian Squeeze, Wheezy, Jessie, Stretch
Los sistemas utilizan LVM. En caso de no usar LVM, sustituir en los ejemplos los volúmenes lógicos por las particiones afectadas.
Requerimientos
Se requieren los siguientes paquetes:
- cryptsetup
- dmsetup
- libpam-mount
aptitude install cryptsetup dmsetup libpam-mount cryptmount
Cifrando unidades
Ahora vamos a describir cómo cifrar el '/home' de un usuario, así como el '/tmp' y el 'swap'.
Cifrar swap
Hay que cifrar el area de intercambio o swap, porque es un área donde los programas pueden dejar datos sensibles en algunos momentos. Esta area se cifra en cada arranque con una password aleatoria creada para tal menester, sin que el usuario tenga que intervenir.
- Dejamos de utilizar 'swap'
swapoff -a
- Cambiamos la línea del fstab:
/dev/mapper/VG-swap none swap sw 0 0
- Por ésta otra:
/dev/mapper/cryptswap none swap sw 0 0
- Añadimos al fichero '/etc/crypttab' la siguiente línea:
cryptswap /dev/mapper/VG-swap /dev/urandom swap,cipher=aes-cbc-plain,size=128,hash=ripemd160,precheck=/bin/true
- Recargamos los discos cifrados para que coja los cambios
/etc/init.d/cryptdisks restart
- En distribuciones modernas lo tenemos que hacer "a mano"
cryptdisks_start cryptswap
- Volvemos a activar el 'swap'
swapon -a
Cifrar '/tmp'
Hay que cifrar el '/tmp', al poder éste contener ficheros temporales generados por los progamas del usuario. Esta area se cifra y formatea en cada arranque con una password aleatoria creada para tal menester, sin que el usuario tenga que intervenir.
- Cambiamos la línea del fstab:
/dev/mapper/VG-tmp /tmp ext4 defaults 0 0
- Por ésta otra:
/dev/mapper/crypttmp /tmp auto defaults 0 0
- Añadimos al fichero '/etc/crypttab' la siguiente línea:
crypttmp /dev/mapper/VG-tmp /dev/urandom tmp,cipher=aes-cbc-plain,size=128,hash=ripemd160,precheck=/bin/true
Podemos intentar no utilizar el /tmp, e inicializarlo igual que el área de swap, o realizar un reinicio.
Cifrar el $HOME de un usuario
Ahora vamos a cifrar el home de un usuario, el usuario foo. Para ello vamos a crear un nuevo volumen cifrado. Los ejemplos utilizan LVM, pero se puede aplicar este procedimiento a particiones físicas.
- Creamos el volumen, en este caso uno de 10G. Colocamos una 'c_' delante para saber que éste es el cifrado.
lvcreate -L 10G -n c_foo VG Logical volume "foo" created
- Lo llenamos de información aleatoria (esto tarda un rato laaaarrgoooo):
dd if=/dev/urandom of=/dev/mapper/VG-c_foo 20971521+0 records in 20971520+0 records out 10737418240 bytes (11 GB) copied, 6451.76 s, 1.7 MB/s
Si deseamos ver el progreso de dd, podemos utilizar el comando kill, recordando que la salida saldrá reflejada en la consola que hayamos lanzado el dd:
kill -USR1 `pidof dd` 2845409+0 records in 2845409+0 records out 1456849408 bytes (1.5 GB) copied, 484.983 s, 3.0 MB/s
- Creamos el volumen "Luks". La clave que introduzcamos será nuestra clave de cifrado.
cryptsetup luksFormat /dev/mapper/VG-c_foo WARNING! ======== This will overwrite data on /dev/mapper/VG-c_foo irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: Verify passphrase:
- "Abrimos" el volumen con la clave.
cryptsetup luksOpen /dev/mapper/VG-c_foo foo Enter passphrase for /dev/mapper/VG-c_foo
En estos momentos tenemos dos volúmenes, 'c_foo' cifrado, y 'foo' para poder acceder al mismo con la contraseña deseada.
- Formateamos el volumen
mkfs.ext4 /dev/mapper/foo mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621183 blocks 131059 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 36 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
- Montamos el volumen de manera temporal
mount /dev/mapper/foo /mnt
- Ponemos los permisos del usuario al volumen
chown foo:foo /mnt
- Desmontamos el volumen
cryptsetup luksClose /dev/mapper/foo
Si el volumen no es nuevo y deseamos mover los datos
Si estamos realizando la instalación sobre un sistema con datos hay que acordarse de realizar éste procedimiento, siempre que deseemos conservarlos.
- "Abrimos" el volumen con la clave.
cryptsetup luksOpen /dev/mapper/VG-c_foo foo Enter passphrase for /dev/mapper/VG-c_foo
- Montamos el volumen de manera temporal, para poder copiar los datos antiguos
mount /dev/mapper/foo /mnt
- Movemos los datos antiguos al nuevo alojamiento cifrado
mv ~foo/* ~foo/.* /mnt
- Desmontamos el volumen temporal
umount /mnt
Opciones utilizadas en '/etc/crypttab'
- swap
- Genera la unidad como swap
- cipher=
- Indica el algoritmo de cifrado utilizado. Para saber los algoritmos disponibles se puede invocar a la ayuda de 'cryptsetup':
/sbin/cryptsetup --help . . . . . . Default compiled-in device cipher parameters: plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160 LUKS1: aes-cbc-essiv:sha256, Key: 256 bits, LUKS header hashing: sha1
- tmp=ext2
- Forzamos el formato de sistema de ficheros. Según la versión, el valor por defecto (si ponemos tmp a secas) varía.
- size=
- Tamaño de la clave a utilizar.
- hash=
- El algoritmo de "resumen" utilizado para las passwords.
- precheck=/bin/true
- Indicamos que las unidades SIEMPRE se van a formatear/cifrar en el arranque. Con ésto evitamos que tras algún error, como hibernar el sistema, queden datos sensibles en los mismos.
Configurar pam_mount
Vamos a configurar pam_mount para que sea éste el que monte automáticamente los volúmenes cifrados de los usuarios.
/etc/security/pam_mount.conf.xml
Es el fichero donde se configura pam_mount. También se puede realizar en un fichero no xml (pam_mount.conf).
- Añadimos la siguiente línea tras "<!-- Volume definitions -->"
<volume mountpoint="~" path="/dev/mapper/VG-c_%(USER)" fstype="crypt" options="exec,fsck,nodev,nosuid" />
Con ésto conseguimos que el volumen se monte en el "home" del usuario, y que cualquier usuario pueda tenerlo cifrado, siempre que tenga un volumen con el nombre adecuado (en nuestro caso c_foo).
Parámetros interesantes
Del fichero /etc/security/pam_mount.conf.xml nos pueden interesar los siguientes parámetros
- <debug enable="1" />
Nos permite activar la depuración, dejando infinidad de logs, ya sea por consola o en el syslog, para poder detectar y solucionar problemas.
- <mkmountpoint enable="1" remove="true" />
Activado por defecto nos genera el directorio donde se monta el volumen, y lo destruye tras su utilización
pam_mount.so
Al instalar libpam-mount se añaden las líneas necesarias a los ficheros /etc/pam.d/common-auth y /etc/pam.d/common-session, que resumiendo son:
auth optional pam_mount.so
Esta línea colocada en último lugar tras los modulos de recoge la contraseña y la utiliza para montar los volúmenes que necesitemos.
session optional pam_mount.so
Con ésta, también colocada en último lugar tras los múdulos "session", conseguimos, por ejemplo, que se cree el directorio si no existe, o generar las claves adecuadas para autenticar vía gdm.
TODO
¿Será necesario cifrar también '/var/tmp'?
Referencias
http://ubuntuforums.org/archive/index.php/t-456891.html
http://www.besy.co.uk/debian/how_to_setup_file_system_encryption_with_dm-crypt