Guia rapida de DM-CRYPT + LVM +---------------------------------------------------------------+ | Guia rapida de DMCRYPT + LVM Alex aka dab | | 29/Jul/2004 v1.0 aramosf@unsec.net | | http://www.digitalsec.es | +---------------------------------------------------------------+ / 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