Sunday 6 July 2008

Cifrar particiones y datos en OpenBSD

Todos los sistemas operativos modernos disponen de soporte kernel-space para cifrado de datos: Linux (cryptoloop para 2.4, dm-crypt en 2.6, loop-aes 2.4/2.6), FreeBSD (GEOM_BDE, o a partir de 6.0 el nuevo GEOM_ELI), Mac OS X (FileVault), etc, aunque últimamente se han popularizado sistemas user-space por su facilidad como TrueCrypt, algunos siendo además multiplataforma.
Sobre algunos de ellos me gustaría hablar aquí, en concreto sobre loop-aes y GEOM_ELI, pero llevo queriendo hablar de estos temas desde que abrí el blog, así que tiempo al tiempo.

openbsd logoHoy el tema que nos ocupa es el cifrado de datos en OpenBSD, esta sistema operativo de tipo Unix está basado en BSD4.4 y es descendiente directo de NetBSD, pero con un enfoque especial hacia la seguridad y criptografía.
Actualmente la última versión disponible es la versión 4.3 y su slogan "Free, Functional & Secure" destaca sus mayores virtudes: libre, funcional y seguro. Está liberada bajo licenia BSD, al igual que sus hermanas (FreeBSD, NetBSD...).

Para poder usar este soporte de cifrado no es necesario recompilar el kernel (a diferencia de FreeBSD por ejemplo) y se puede hacer de manera muy sencilla.

Podemos realizar el proceso de dos maneras diferentes, creando una partición del disco duro y cifrandola, o bien creando un fichero y usandolo como una partición virtual, gracias a vnconfig el cual nos permite configurar dispositivos para swapping y pseudo sistemas de ficheros.

En esta pequeña guía voy a utilizar la segunda aproximación por ser más sencilla para alguién que empieza y no tener que tocar el disco físicamente, de esta manera cualquier problema será mucho menos doloroso.

Empezamos, en primer lugar vamos a crear un fichero con contenido aleatorio del tamaño que queramos para nuestra partición cifrada, en este ejemplo voy a poner 100 MB. Crearemos el fichero con este comando:

dd if=/dev/prandom of=/path/to/file bs=1048576 count=100

El parámetro count indica el número de MB que tendrá la partición, el parametro of indica el path y fichero de destino.

Vereis algo similar a esto:


# dd if=/dev/prandom of=/path/to/file bs=1048576 count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 73.364 secs (1429262 bytes/sec)


Bien, ya tenemos el primer paso hecho, ahora vamos a crear el dispositivo especial, más concretamente, lo que vamos a hacer es asociar el dispositivo vnodo encriptado al fichero recién creado, esto lo haremos así:


/usr/sbin/vnconfig -ck -v svnd0 /path/to/file


Nos pedirá la clave de cifrado,


Encryption key:
svnd0: 104857600 bytes on /path/to/file


Cuidado: Debereis teclear la clave conscientemente puesto que sólo la pedirá una vez, si no estais seguros deberéis repetir el proceso, podeis usar svnd1 en adelante, si os indica que svnd0 está ocupado, al igual si creais más de una partición virtual, tendreis que usar distintos dispositivos.

Cuando escribais la clave vereis el mensaje de arriba svnd0: 104857600 bytes on /path/to/file

Una vez linkado el dispositivo cifrado al fichero, pasamos a darle un formato válido para OpenBSD:

# newfs /dev/rsvnd0c
/dev/rsvnd0c: 204800 sectors in 2048 cylinders of 1 tracks, 100 sectors
100.0MB in 2 cyl groups (1568 c/g, 76.56MB/g, 9856 i/g)
super-block backups (for fsck -b #) at:
32, 156832,
#


Nota para usuarios avanzados: Antes de realizar el newfs comprobar que el sistema no se encuentra en securelevel 2, lo podeis hacer mediante:
# sysctl -a|grep kern.securelevel
Si está en ese nivel tendreis que bajar al menos a securelevel 1, de otra manera el sistema no os dejará.
Este aviso es para usuarios que vean un inquietante Operation not permitted siendo root, en ese caso debereis ir a /etc/rc.securelevel y bajar el valor de la etiqueta securelevel a 1, seguido de un reboot.


Seguimos, ya tenemos un formato válido, sólo queda montarlo:

mount /dev/svnd0d /punto/de/montaje

Con df podemos comprobar que se ha montado correctamente, por ejemplo lo podemos montar en /mnt y veremos algo similar a:


# df -h|egrep "Size|svnd"
Filesystem Size Used Avail Capacity Mounted on
/dev/svnd0c 97.5M 2.0K 92.6M 0% /mnt


Ya tenemos nuestros datos cifrados, vnconfig usa el cipher Blowfish antes de escribir en el disco, para más información podeis acceder a la página man de vnconfig: man vnconfig.




Ahora una pequeña chuleta:

Para montar la partición cifrada:

/usr/sbin/vnconfig -ck -v svnd0 /path/to/encrypted/file
mount /dev/svnd0d /punto/montaje


Para desmontarla:

umount /punto/montaje
vnconfig -u -v /dev/svnd0d


Para analiazar la partición:

/usr/sbin/vnconfig -ck -v svnd0 /path/to/encrypted/file
fsck /dev/svnd0c


Error "vnconfig: VNDIOCSET: Device busy"

Si ponemos mal el password, al usar el comando vnconfig, cuando montemos la partición veremos un error como este:

mount_ffs: /dev/svnd0c on /mnt: Invalid argument


Al volver a realizar un vnconfig, veremos


# /usr/sbin/vnconfig -ck -v svnd0 /data/datos/cru
Encryption key:
vnconfig: VNDIOCSET: Device busy


Para solucionarlo tendremos que limpiar ese dispositivo:


# vnconfig -u -v vnd0
vnd0: cleared


Y ya podremos volver a usar vnconfig, otra opción es usar otro dispositivo por ej: svnd1 y svnd1c

Eso es todo amigos.

2 comments:

  1. Cual es el maximo tamaña que puede terner un disco cifrado?
    Si la maquina se cae por cualquier razon y no se desmonta el disco bien, se dañaria esa particio cifrada?

    ReplyDelete
  2. http://www.fencus.net/foros/-indice-manuales-para-openbsd-t-552.html

    ReplyDelete