miércoles, 4 de agosto de 2004

Guia rapida de DM-CRYPT + LVM

+---------------------------------------------------------------+
| Guia rapida de DMCRYPT + LVM A. Ramos |
| 29/Jul/2004 v1.0 aramosf@unsec.net |
+---------------------------------------------------------------+


/ 1.- Introduccion /
+--------------------+

El proposito de esta guia es crear un volumen logico con LVM2
(Logical Volume Manager) y este a su vez cifrado con el algoritmo AES.
Se van a utilizar dos discos; uno de ellos de sistema, y el otro completamente.

Toda la documentacion y pruebas se han realizado en un Linux Fedora core 2,
con kernel 2.6.7 y lvm version 2. Aunque evidentemente, el proceso es igual
o muy parecido para otras distribuciones.


/ 2.- Requisitos /
+------------------+

Partimos de la base de que utilizamos un sistema con un kernel con soporte
dm-crypt que viene incluido apartir de la version 2.6.4 o superior, ademas de
soporte loopback, lvm y device-mapper

Las opciones necesarias en el kernel son:

Device Drivers --->
Block devices --->
Loopback device support

Multi-device support (RAID and LVM) --->
RAID support
Device mapper support
Crypt target support


Estas opciones se pueden incluir estaticas o como modulos.


/ 3.- Dispositivos /
+---------------------+

En el ejemplo se supone que hda2 es el directorio raiz, y hdd un disco duro
adicional, ambos tienen un tamaño de 80Gbs y su distribucion seria:


hda hdd
.··---··. .··---··.
·..___..· ·..___..·
hda1 | swap | ] 256Mb | | -+
|-------| -+ | | |
| | | | hdd | | 80Gbs
hda2 | / | | 72Gb | | |
| | | | | |
·..___..· -+ ·..___..· -+



/ 4.- Configuracion /
+----------------------+

A continuacion se presentan todos los comandos que son necesarios y su
la accion que realiza.

Se crea un archivo de 54gbs dentro del directorio /datos para el lvm, el
resto de espacio de esta unidad se deja para el sistema operativo:

# dd if=/dev/urandom of=/datos/datos1 bs=1M count=54000

Este comando crea un fichero con un contenido de bytes al azar, de un tamanyo
54000Mb y de nombre "datos1".

Se asigna al dispositivo loop0 el fichero creado:

# losetup /dev/loop0 /datos/datos1

Ahora se crea el primer PV (physical volume) del LVM:

# lvm pvcreate /dev/loop0
No physical volume label read from /dev/loop0
Physical volume "/dev/loop0" successfully created

Una vez terminado con la parte del primer disco duro, se empieza con el
segundo, eliminando la tabla de particiones de "hdd":

# shred -n 1 -v /dev/hdd

Para la creacion del segundo PV en el disco duro hdd:

# lvm pvcreate /dev/hdd
No physical volume label read from /dev/hdd
Physical volume "/dev/hdd" successfully created

Comprobacion de que ambos PVs han sido creados correctamente:

# lvm pvs
PV VG Fmt Attr PSize PFree
/dev/hdd lvm2 -- 74.53G 74.53G
/dev/loop0 lvm2 -- 53.71G 53.71G

Una vez terminado con los PVs, se realiza la creacion del VG (volume group)
de nombre "aes":

# lvm vgcreate aes /dev/loop0 /dev/hdd
Volume group "aes" successfully created

Para terminar con el LVM, se añade el LV (logical volume) de nombre "rules",
usando como tamanyo la suma de los PVs que se han creado anteriormente:
74.5Gb + 53.7

# lvm lvcreate -n rules aes -L128.20G
Rounding up size to full physical extent 128.20 GB
Logical volume "rules" created

Tras realizar todas estas operaciones se obtine el volumen logico creado
al que podemos acceder en: /dev/aes/rules con un tamaño de 128.20 Gbs.

Cifrar el volumen es sencillo, primero hay que asignarlo nuevamente
a un volumen loop, en este caso seria el numero 1, ya que el 0 se esta
utilizando en el propio LVM.

# losetup /dev/loop1 /dev/aes/rules

Tras esto, se utiliza la utilidad cryptsetup, para crear el volumen cifrado.
Esta utilidad es una manera sencilla de configurar volumenes en dmcrypt sin
tener que utilizar "dmsetup".

Cryptsetup es una utilidad que proporciona el autor de dm-crypt. Para Fedora
Core 2, existe el paquete en rpm llamado: cryptsetup_0.1-1_i386.rpm. Para otras
distribuciones o bien se busca el adecuado o se compila desde:
http://www.saout.de/misc/dm-crypt/cryptsetup-0.1.tar.bz2

# cryptsetup -c aes -y create crypt /dev/loop1
Enter passphrase:
Verify passphrase:

En este comando, "crypt" es el nombre que se asigna al volumen cifrado. Al
ejecutarlo ha de asignarse una contraseña para cada vez que se desee crear y
eliminar el dispositivo.

Una vez creado el nuevo dispositivo cifrado: /dev/mapper/crypt, tan solo
es necesario formatearlo y montarlo para poder disfrutar de el:

# mke2fs -j /dev/mapper/crypt
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
16809984 inodes, 33607680 blocks
1680384 blocks (5.00%) reserved for the super user
First data block=0
1026 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.


# mount /dev/mapper/crypt /crypt

Comprobacion de que el montaje es correcto:

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda2 72G 58G 11G 85% /
none 252M 0 252M 0% /dev/shm
/dev/mapper/crypt 127G 33M 120G 1% /crypt


/ 5.- Consideraciones /
+------------------------+

Hay que tener en cuenta, que si se desmonta el volumen /crypt, se podra
acceder a el sin ninguna contrasenya al no ser que se ejecute el comando:

# cryptsetup remove crypt

De esta forma se elimina el volumen "crypt" pero no su contenido.

Una vez que se reinicie el sistema o se desmonte completamente, tanto el LVM
como el dm-crypt, para recuperar los datos hay que ejecutar:

# losetup /dev/loop0 /datos/datos1
# lvm vgchange -a y
# losetup /dev/loop1 /dev/aes/rules
# cryptsetup -c aes -y create crypt /dev/loop1
Enter passphrase:
Verify passphrase:
# mount /dev/mapper/crypt /crypt

Los dos primeros comandos configuran nuevamente el LVM, y los dos siguientes
el volumen cifrado. Con el ultimo se monta el dispositivo.


/ 6.- Otras utilidades - ideas /
+--------------------------------+

Es una buena idea utilizar dm-crypt para otras utilidades como por ejemplo
cifrar los logs del sistema, el directorio tmp o la memoria swap.

Para cifrar la swap es tan sencillo como ejecutar:

# swapoff -a
# cryptsetup --key-file=/dev/urandom create swap /dev/hda1
# mkswap /dev/mapper/swap
# swapon /dev/mapper/swap

El primer comando desactiva la swap para que no haya problemas.
El segundo crea un dispositivo "swap" con la particion hda1, y con
una contrasenya aleatoria que nos es indiferente, ya que en el proximo reinicio,
no queremos recuperar los datos.
El tercer comando crea el area swap en el nuevo dispositivo cifrado:
/dev/mapper/swap.
El ultimo comando activa la nueva swap.

Si ya existe un volumen cifrado con mucho espacio libre y no se desea
repetir varias veces el proceso de agregar nuevos volumenes, la solucion
es utilizar enlaces de sistema, o puntos de montaje:

# mkdir /crypt/logs /crypt/tmp
# chmod 1777 /crypt/tmp
# ln -s /crypt/tmp /tmp
# mount --bind /crypt/logs /var/log

Estos comandos realizan las siguientes acciones:
- Creacion de los directorios "logs" y "tmp" dentro de "crypt"
- Se anyade el bit "sticky" al directorio /crypt/tmp
- Se crea un enlace simbolico de /crypt/tmp a /tmp
- Se monta el directorio /crypt/logs sobre /var/log

Notese que en un ejemplo se utiliza la opcion --bind de mount, y en otro
el comando "ln", esto es indiferente y es el administrador quien decidira
cual de ellos es mas conveniente.

Si por el contrario no se dispone de ninguna unidad cifrada y unicamente
se quiere cifrar los logs del sistema, las ejecuciones serian:

Creacion de un archivo dentro de /datos con nombre "logs":

# dd if=/dev/urandom of=/datos/logs count=100 bs=1M

Se asigna al loopback 0:

# losetup /dev/loop0 /datos/logs

Creacion del mapper cifrado de nombre "logs", nos pedira que introduzcamos
una contrasenya dos veces. Hay que destacar que cuando se quiera desmontar y
no utilizar mas el volumen cifrado hay que volver a llamar a cryptsetup, con la
opcion "remove", como se explico anteriormente.

# cryptsetup -c aes -y create logs /dev/loop0
Enter passphrase:
Verify passphrase:

Formateo con sistema de ficheros ext3 y montaje en el directorio final:

# mkfs.ext3 /dev/mapper/logs
# mount /dev/mapper/logs /var/log

/ 6.- Referencias /
+-------------------+

http://tldp.org/HOWTO/LVM-HOWTO/
http://www.saout.de/misc/dm-crypt/
http://www.saout.de/tikiwiki/
http://www.saout.de/misc/dm-crypt/cryptsetup-0.1.tar.bz2