Encriptando todo un filesystem al vuelo

Imagen de Epe

Encriptar un archivo a veces se hace molestoso.

Usando cryptsetup en RHEL/CentOS/Fedora es mucho mejor decirle a nuestro kernel que encripte particiones.

De esta forma el kernel mismo se ocupará de encriptar toda la información que se escriba a una partición y no tenemos que entrar en detalles sobre qué archivo encriptar y cuál no.

El encriptar la partición al vuelo de todas formas la hace vulnerable para cuando el sistema está funcionando, si alguien obtiene un shell en nuestro sistema ya funcionando, podrá ver la partición. Lo interesante de ésta idea que plantearé ahora es que si el sistema está apagado, para poder montar una partición necesitas conocer la clave.

Básicamente lo que haremos son los siguientes pasos:
1. Crearemos un dispositivo virtual que se ocupará de encriptar/desencriptar la información que escribimos/leemos hacia/desde la partición.
2. Asociaremos este dispositivo con la partición que estará encriptada
3. Asignaremos una clave que será usada para encriptar/desencriptar la información

En mi caso escogí la partición /dev/sda3, puede ser una partición con datos pues podremos convertir esos datos y encriptarlos al vuelo para evitar que sean leidos.

Esta partición que escojamos debe estar desmontada.


cryptsetup --verbose --verify-passphrase create sda3 /dev/sda3
Enter passphrase:
Verify passphrase:

Lo que hacemos es llamar a la utilería cryptsetup con la opción de que cree (create) el dispositivo virtual que se llamará sda3 y que lo asociaremos con la partición /dev/sda3, le pediremos que verifique la frase de encriptación para evitar que nos equivoquemos.

Al terminar no dirá nada, sencillamente creará el dispositivo en /dev/mapper


[root@hd-t2419cl ~]# ll /dev/mapper/
total 0
crw------- 1 root root 10, 63 Oct 11 12:46 control
brw-r----- 1 root root 253, 0 Oct 11 23:27 sda3

perfecto en /dev/mapper/sda3 tenemos el enlace que nos permitirá leer/escribir hacia o desde la partición real (que estará encriptada) llamada /dev/sda3

La primera vez formateamos la partición para poderla usar:


mkfs.ext4 /dev/mapper/sda3

[b]EN CASO DE QUE LA PARTICION YA CONTENGA DATOS:[/b]
No formateamos!, sino que hacemos una copia de la partición original (/dev/sda3) hacia el mapper (enlace):


dd if=/dev/sda3 of=/dev/mapper/sda3

Este comando copia exactamente los contenidos de /dev/sda3 hacia /dev/mapper/sda3 y quedarán de esta forma automáticamente transferidos los datos desde la partición antigua hacia ella misma pero de forma encriptada.

La partición /dev/sda3 ya no se monta, se monta el enlace este pues es el que tiene todo el código para encriptar/desencriptar:


mount /dev/mapper/sda3 /mnt/

Ahora, hemos montado la partición de forma manual... cómo haríamos para que automáticamente se monte al arrancar nuestro Linux? Cómo crearíamos el mapper al arrancar? Para ello editamos el archivo: /etc/crypttab y agregamos lo siguiente:
sda3 /dev/sda3
El archivo /etc/crypttab es leído al arrancar el sistema y se creará un mapper con el contenido de la primera columna (sda3) conectado a la partición que está en la segunda columna (/dev/sda3). Lógicamente se te pedirá la clave del mapper al arrancar el Linux.

Luego editamos el archivo /etc/fstab y comentamos agregamos (o modificamos si ya existe) la línea para montar el mapper, digamos que la queremos montar en /home, pues vamos a /etc/fstab y le dejamos la línea referente a /home así:

/dev/mapper/sda3 /home ext4 defaults 1 2

Y ya, si todo lo hiciste bien, prueba reiniciar la máquina y a mitad del arranque se quedará en blanco esperando por la clave del mapper al arrancar.. le pones la clave y montará el mapper en /home como en este ejemplo.

Repito: Debemos quitar la antigua partición (/dev/sda3 o el UUID que hace referencia a ella en mi caso) de /etc/fstab pues no se montará de la forma tradicional.

Bueno para laptops o cualquier otro medio que tenga que ser transportado y pueda ser robado. Yo lo uso en mi laptop, tengo todo /home encriptado y por supuesto es en /home donde guardo mis cosas.

[b]¿Qué debemos encriptar?[/b]
Debemos encriptar las parciciones que contienen datos propios de nuestra empresa como /home o /var; no tiene mucha utilidad encriptar / o /usr pues tienen binarios que no tenemos por qué ocultar.

[b]Performance[/b]
Las particiones encriptadas generan un impacto en el performance del sistema pues hay que encriptar y desencriptar los datos. Pero definitivamente ofrecen más seguridad que no tenerlas encriptadas. Sugiero se realicen pruebas y se valore perfectamente si se debe o no encriptar una partición dado el impacto que a su caso en particular podría representar para el servidor.

En mi caso no noto mayor diferencia en el performance, y al menos tengo mis datos seguros.

Comentarios

Really Cool !!!

Imagen de deathUser

Really Cool !!!

La verdad es que esto evoluciona super rápido la vez que me tocó hacer algo por el estilo hubo que parchear con unos cuantos hacks el kernel y compilarlo, etc, etc, etc ....

Es una opción muy interesnate al menos si tienes tu servidor alojado en un datacenter y si tienes tus discos hotplug con RAID1 te podrian tranquilamente sacar un disco sin que te des ni cuenta...

Alguien ha visto un artículo o un estudio sobre el impacto en el performance que pueda tener en un sistema con bastante carga de transacciones de Lectura/Escritura en disco ???

bye
:)

Bien, en algún lugar leí

Imagen de Epe

Bien, en algún lugar leí (ahora no lo encuentro pero lo seguiré buscando) una comparativa.

usando aes256 en lectura era idéntico de rápido. aes256 está programado en ensamblador y VUELA.

Ahora, en escrituras pierdes hasta un 30% de performance quiéralo o no..

Yo realmente no lo recomendaría para un servidor, al menos no para uno realmente cpu bound, sino para una laptop o para algún tipo de máuqina que la CPU no se use mucho y que no te apure el escribir.

En cuanto encuentre la comparativa te aviso.

En efecto, hace unos dos años tuve que usar crypto-loop, fue una LABOR de verdad.. pero desde que salió el kernel 2.6 se incluyó no cryptoloop pero sí dmcrypt que es a la final todo lo que aqui expongo. yo realmente quería cryptoloop, de hecho colaboré con ellos para corregir un error que había en la programación, pero linus decidió por dmcrypt y me parece una buena idea también.
--
EcuaLinux.com
Ecuador: (02)3412402 - (09)9246504
USA: + 1 404 795 0321

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

Apareció!

Imagen de Epe

[url]http://www.saout.de/tikiwiki/tiki-index.php?page=UserPageChonhulio[/url]

Aquí está mi resumen en español para mis estudiantes (yo enseño linux de verdad):
Por defecto cryptsetup usa el protocolo AES, específicamente la función AES_i586 que está hecha en ensamblador, por lo que la velocidad de procesamiento es mucho más rápido que el usado si se hubiera intentado en un lenguaje de alto nivel.

En este sitio podemos ver una pequeña comparativa entre los diferentes algoritmos de encriptación.

La tasa de transferencia de una partición sin encriptar es:

* Lectura: 37.98 MB/s
* Escritura: 30.21 MB/s

Bien, básicamente siempre las escrituras son más lentas que las lecturas.

En el caso de que la partición esté trabajando con encriptación AES_i586 estos son los parámetros de medición:

* Lectura: 25.00 MB/s
* Escritura: 29.13 MB/s

En efecto, en lectura obtenemos un 35% menos de desempeño, el sistema es un 35% más lento que lo normal. Sin embargo en escritura es aproximadamente de la misma velocidad. ¿Por qué?

En todo caso, en efecto si usaremos una partición encriptada para leer más que para escribir. Es decir la usamos constantemente en lecturas mas no para almacenar datos, entonces debemos considerar no usar partición encriptada. Sin embargo si usamos la partición encriptada para guardar datos que infrecuentemente serán leídos, posiblemente sí nos interese usar la partición encriptada ya que las escrituras son muy rápidas y no leeremos mucho.

La parte más interesante es que la encriptación que usamos no es de 128bits, sino que por defecto se usa de 256bits, pero si miramos en el sitio de la comparativa, veremos que el usar 256bits no desmejora mucho más el impacto en performance que si usáramos 128bits.

--
EcuaLinux.com
Ecuador: (02)3412402 - (09)9246504
USA: + 1 404 795 0321

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre