Cifrado con pam-mount,dm-crypt y LUKS

From zerutek.com
Jump to: navigation, search

17/10/2016

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

http://en.gentoo-wiki.com/wiki/DM-Crypt_with_LUKS

man pam_mout.conf