Sistema encriptado y apertura con llave USB

Quería comentarles que escribí una guía paso a paso para encriptar todo el sistema, o cualquier partición en particular, usando LUKS. Pueden verla en mi página: http://www.hackan.com.ar/2011/05/linux-sistema-encriptado-y-apertura-con-llave-usb
Aquí hago una transcripción, pero está toda deformada por el tema de formatos html a bbcode, y es muy larga como para editarla completamente...
Si alguno conoce algún buen sitio que convierta de HTML a BBCode, me avisa

Saludos,
HacKan


La idea de este tutorial es explicar paso a paso, detalladamente, el cómo encriptar todas las particiones de tu linux usando LUKS. Este sistema es tan seguro como podría ser, dado que emplea distintos algoritmos reconocidos como p.e.: AES, Serpent, y otros.

Y la mejor parte es evitar el fastidio de tener que recordar una o varias claves, dado que la idea es también desencriptar el sistema usando un archivo llave ubicado en un dispositivo USB cualquiera, como ser un pendrive.

Además, se explicará cómo hacer para poder hibernar, algo que considero infaltable en cualquier sistema, sea portable o no. La mayoría de los tutoriales que hay por la red no explican bien - o directamente ni lo mencionan - acerca de cómo hacer que la hibernación funcione.

Esta guía está orientada a Ubuntu, y está probado para Ubuntu 10.04 y 10.10, pero se puede hacer con CUALQUIER distro. Yo tengo así encriptados un servidor, una pc de escritorio y una netbook, además de discos externos y demás. En cuanto al rendimiento, les aseguro que no es tan notoria la baja, si bien obviamente el rendimiento del sistema será ligeramente inferior a que si no estuviera encriptado. Puede hacerse más notorio a la hora de realizar gran movimiento de pesados archivos.

Considero que los dispositivos portátiles deberían ser encriptados, dado que es muy factible su pérdida; la privacidad es algo por demás importante, y lo que afecte a la misma afecta de igual manera a la libertad.

Este sistema es, criptográficamente hablando, muy fuerte y seguro, siempre y cuando no caigan en las mismas manos la llave y el dispositivo encriptado. Es por ello que la llave debe estar siempre con nosotros, y oculta preferentemente. También puede emplearse una clave escrita, pero esto implica tener que recordarla y además que la misma nunca será tan fuerte contra ataques de fuerza bruta como podría serlo un archivo pseudoaleatorio de 4096 bytes. Claro que todo depende de lo que nosotros querramos hacer. Precisamente esa es la ventaja de linux: hacemos lo que queremos, de la forma en que querramos hacerlo.

Esta guía tratará de ser flexible, explicando distintas opciones; pero esto no es fácil de realizar y por eso desde ya le pido disculpas, caro lector, si algo no es entendible. Deja un comentario si deseas que clarifique alguna parte.

Se explicará cada cosa por separado y de manera genérica, y en el punto 5 se explicará cómo aplicar todo eso para tener el sistema completamente encriptado.



Indice
[list=1]
  • Consideraciones
  • Backup completo del sistema
    • Restaurando el backup

  • Particionando
  • Creando particiones encriptadas
    • Creando las llaves
    • Borrado seguro de datos
    • Encriptando particiones
    • SWAP encriptado
    • Desencriptar desde USB al iniciar

  • Encriptando todo el sistema
  • Apéndice
    • Deshabilitar y/o agregar llaves
    • Sistema de doble llave
    • Si todo sale mal...
    • Puntos débiles, vulnerabilidades

  • Fuentes de información
  • [/list]



    1. Consideraciones
    Empezaré con lo más importante: ¡HACE BACKUP DE TODA LA INFORMACION ANTES DE CONTINUAR!

    Ahora que ya tienes el backup hecho, continuaré diciendo que es importante leer todo antes de hacer nada: cuando borres algo, formatees una partición, la encriptes o lo que sea, los archivos que se perdieron, se perdieron. Recuperarlos será una tarea muy, muy tediosa, creéme que tengo experiencia; recalco nuevamente: HACER BACKUP. La guía está escrita por partes, y por ello no puedes hacer todo 'de una' sin haber leído la guía completa. El punto 5 sí resume todo, pero no explica nada.

    No me haré responsable si por seguir esta guía pierdes archivos o tu sistema no arranca más. Es importante HACER BACKUP y seguir los pasos con detenimiento, tratando de entender lo que se está haciendo.

    Si tienes un disco externo, o un disco secundario, con espacio libre suficiente, quizá quieras crear una partición encriptada allí y luego mover todos tus archivos para poder trabajar en tu disco principal.

    Para poder encriptar cualquier partición, es necesario, sí o sí, formatear esa partición, y en consecuencia se borrarán todos los archivos que contengan. Entonces, no solo debes tener un backup de la información, sino espacio suficiente donde mover temporalmente esa información para luego reestablecerla.

    Es de vital importancia manejar con cuidado las llaves creadas (se usará el término ‘llave’ para referirse al archivo que desencripta las particiones). Esto es, no solo no deben perderse, sino que ¡no se puede correr el riesgo de tener solo una copia!. Pero claro, es importante que la copia no sea accesible. Por ello escribí el apéndice Sistema de doble llave. Este artículo no cubre acerca de cómo o dónde almacenar una copia de la llave, pero basta con ser ingeniosos: caja de seguridad en un banco, enterrado en el jardín de la casa de campo, etc....

    Two things to remember
    • Security=Usability^-1
    • There is a fine line between being paranoid and not being in touch with reality.



    Extraído de DM-Crypt with LUKS, el artículo no indica quién es el autor.
    Hasta aquí con advertencias, prosigamos. Arranca con tu sistema e instala los paquetes que necesitaremos (puede que tu distro ya los traiga):

    sudo apt-get install cryptsetup libcryptsetup1 libpam-mount

    Cuando termine la instalación reinicia e inicia tu sistema con un LiveCD o LiveUSB de una distro a elección, necesitaremos una consola como mínimo (jaja, bastante obvio, ¿no?) y si lo deseas, interfaz gráfica. Personalmente, uso Ubuntu. NO PUEDES CONTINUAR si has arrancado desde tu sistema, por favor reinicia y vuelve a este sitio desde tu distro Live.

    Puedes leer mi tutorial para crear un pendrive con varias distros, quizá te sirva.

    Puede que debas volver a instalar los paquetes mencionados en tu distro live.

    Aclaración importante: debes entender la diferencia entre el usuario root, la carpeta /root y la raíz del sistema, también llamada root o "/".



    2. Backup completo del sistema
    En este apartado les comentaré cómo hacer un backup de la partición raíz del sistema (root, "/" y de cualquier otra partición.

    En linux, hacer un backup completo del sistema es realmente fácil, increíblemente fácil. Basta con crear un archivo .tar, que no es más que un contenedor de archivos. Esto se hace con el comando tar. Básicamente, un backup se hace copiando TODOS los archivos a otro lado. Para restaurarlo, basta con copiarlos de vuelta. Así podemos llevar o migrar nuestro linux de una PC a otra.

    En este caso, conviene hacer al menos tres backups separados: uno para "/", otro para "/home" y finalmente otro para "/boot". El lugar donde almacenemos dicho backup debe tener espacio suficiente. Te recuerdo que para encriptar una partición, sí o sí habrá que formatear.

    ¿Iniciaste con tu distro live? si no es así, hacelo ahora y luego montá las particiones correspondientes a tu sistema. En Ubuntu, basta con hacerle un click a la partición desde el menú Lugares para que se monten automáticamente en /media/<etiqueta_de_la_partición_o_UUID>
    En cualquier caso, podemos montar la partición 'a mano', abriendo un terminal como root:

    mkdir /media/particionX
    mount /dev/sdXY /media/particionX


    Donde llamé /media/particionX a la carpeta de montaje, te recomiendo usar un nombre significativo como root o home; y /dev/sdXY es la partición que corresponde. Ejecutando fdisk -l como root nos dará un listado de las particiones que tenemos. O ejecutando blkid también como root nos dará info sobre las particiones y su UUID correspondiente.

    Asumiré que vas a hacer un backup a un disco externo, que estará montado de /media/backup. Si este no es tu caso, simplemente cambia la ruta /media/backup por la que uses. Además, llamaré /media/root y /media/home a las particiones de root ("/" y home respectivamente, y asumiré que no hay otras particiones. Ajusta esto como corresponda. Te recuerdo que este proceso puede demorar bastante tiempo, varios minutos u horas, dependiendo de cuánta información vayas a respaldar. Abrí un terminal como root:

    cd /
    tar -cvpzf [b]/media/backup[/b]/root_backup.tar.gz --exclude=[b]/media/root[/b]/proc --exclude=[b]/media/root[/b]/lost+found --exclude=[b]/media/root[/b]/sys --exclude=[b]/media/root[/b]/mnt --exclude=[b]/media/root[/b]/media --exclude=[b]/media/root[/b]/home --exclude=[b]/media/root[/b]/boot [b]/media/root[/b]
    tar -cvpzf [b]/media/backup[/b]/boot_backup.tar.gz [b]/media/root/[/b]boot
    tar -cvpzf [b]/media/backup[/b]/home_backup.tar.gz [b]/media/home[/b]


    Basado en BackupYourSystemTAR de la documentación de la comunidad de Ubuntu; allí se detalla qué hace cada parámetro del comando tar, del cual se puede saber más detalles consultando al manual: man tar. Transcribo del primero:
    • tar - es el comando que genera el paquete

    • c - crear un nuevo archivo de respaldo.
    • v - modo verboso, se imprimirá en pantalla todo lo que suceda.
    • p - preserva los permisos de los archivos (N. del T.: este parámetro es fundamental).
    • z - comprime el archivo con 'gzip' para hacerlo más liviano.
    • f <nombre_archivo> - especifica el nombre del archivo de respaldo a generar, acepta ruta completa como en nuestro ejemplo: /media/backup/algo_backup.tar.gz
    • --exclude=/ruta - Este parámetro define un directorio o ruta particular para excluir. Excluimos directorios que no queremos en ese archivo de respaldo, como p.e. todas las particiones montadas (/mnt y /media) y otras.

    [/list]
    Restaurando el backup
    De esta manera ya tenemos hecho un backup del sistema completo. Para restaurarlo, lo que haremos será desempaquetar los archivos en las particiones que correspondan. Llamaré /media/cryptoroot y /media/cryptohome a las particiones encriptadas (abiertas y montadas allí) de root y home respectivamente, y /media/boot a la de boot (que no estará encriptada). Entonces, usamos nuevamente el comando tar para desempaquetar los backups que creamos con anterioridad (siendo root):

    tar -xvpzf [b]/media/backup[/b]/root_backup.tar.gz -C [b]/media/cryptoroot[/b]
    tar -xvpzf [b]/media/backup[/b]/home_backup.tar.gz -C [b]/media/cryptohome[/b]
    tar -xvpzf [b]/media/backup[/b]/boot_backup.tar.gz -C [b]/media/boot[/b]


    Y listo, ya tenemos nuestro sistema restaurado y encriptado. Ahora debemos reconfigurarlo, cosa que explicaré en el apartado correspondiente.



    3. Particionando
    Si solo deseas encriptar una partición en particular, o bien encriptar una unidad externa, o ya tenés el sistema particionado, pasá al punto 4.


    Si quieres tener todo el sistema encriptado (esto sería todas las particiones, incluyendo home, root y swap) entonces primero debemos preparar dichas particiones.

    Necesitaremos que /boot esté en una partición propia, dado que para arrancar el sistema y desencriptar las demás particiones, esta debe estan sin encriptar. Esto es, en principio, una vulnerabilidad (leer el apéndice correspondiente). Es posible tener /boot en un pendrive, y así eliminamos la vulnerabilidad, pero eso escapa el alcance de esta guía.

    Luego, podemos optar por tener una partición gigante encriptada que sera a su vez reparticionada para root, home y swap, o bien tener tres particiones encriptadas por separado. Según leí, la primera opción es la más sencilla y teóricamente más eficiente, pero no hay nada demostrado. Yo empleo lo segundo, particiones encriptadas por separado, por la simple razón de que lo hice así y luego leí que se podía tener todo en una, qué cómico.

    Los sistemas de archivos en linux funcionan como capas: podemos tener una capa de RAID, una capa de encriptado LUKS, una capa de LVM, y finalmente siempre estará la capa con el formato EXT2/3/4 o HFS o NTFS o el que se desee. Luego, cada capa puede particionarse a gusto. Es por eso que podemos tener tres particiones en una sola encriptada con LUKS. En este caso, haremos dos capas: LUKS la primera y EXT3/4 la segunda, más allá que lo hagamos en una única partición LUKS o en varias.

    A continuación hablaré sobre las particiones y qué directorios haremos en particiones separadas. Para saber más sobre qué hacen o cómo se organizan los directorios de linux, este artículo es muy completo.

    Si no deseas encriptar la partición del sistema, "/", entonces te recomiendo que crees una partición para /tmp (el directorio temporal) y la encriptes, dado que si no sería una brecha de seguridad: tenemos todos los documentos encriptados pero hemos dejado suelto todo lo que haya pasado por el directorio temporal.

    Entonces debemos crear las particiones: para /boot usaremos 200MB, con eso sobra. Allí se ubica el GRUB o el administrador de arranque (boot manager | bootloader) que usemos. Si no encriptamos /, entonces habría que dedicarle unos 5gb a /tmp (suficiente para manejar, p.e., una ISO de un dvd). El resto lo dividiremos en SWAP, / y /home. Para SWAP, debemos decidir si queremos hibernar o no: si vamos a hibernar, SWAP debe tener un tamaño mayor o igual a la cantidad de memoria RAM, p.e. si tenemos 2GB de RAM, SWAP debe tener un tamaño de al menos 2GB (siempre conviene darle un poquito más, 2,1GB); si no vamos a emplear la hibernación, con un swap de 0,5~1GB sobra. Para /, con 20GB estamos de sobra en cualquier distro. Si quieres estar más tranquilo, déjale 30GB; personalmente, nunca vi un linux que ocupe más de 10GB (sin contar /home, claro). Y finalmente usaremos el resto del disco para /home, que es donde estarán todos los archivos y documentos de todos los usuarios. Para el caso de un servidor, también habría que separar /var y /opt, o bien hacer que / contenga a /var y /opt, y darle un mayor tamaño; en este caso, búsca en google más información acerca del tamaño que conviene que tenga este tipo de particionado.

    Les comento que hay dos tipos de particiones, las primarias y las lógicas. Podemos tener hasta un máximo de 4 particiones primarias en un disco. Como claramente esto no alcanza, la solución es hacer que una de ellas sea una partición extendida, y dentro de la extendida se pueden crear tantas particiones lógicas como necesitemos (no recuerdo cuál es la cantidad límite). Las primarias se enumeran normalmente del 1 al 4, y las lógicas comienzan desde el 5.

    Es indiferente hacer que una partición sea primaria o lógica, no hay NINGUNA diferencia en cuanto a uso ni rendimiento. Muchos hacen una primaria y de inmediato una extendida con al menos una lógica dentro. Yo suelo crear tres primarias y luego una extendida con tantas particiones como necesite tener.

    En éste artículo de Wikipedia está bien explicado el tema.

    Recapitulando:
    • /boot: 200MB
    • Si vamos a montar todo en una única partición encriptada, entoces le cedemos a dicha partición el resto del disco, luego creamos el sistema LUKS (ver punto 3) y finalmente particionamos separando /, /home y SWAP como se detalla a continuación.
    • Si no:

    • SWAP

    • Con hibernación: igual al tamaño de la RAM
    • Sin hibernación: 0,5GB ~ 1GB

    [/list]
    • si "/" no estará encriptado

    • /tmp: 5GB
    • /var y /opt para servidores: a convenir

    [/list]
    • con "/" encriptado: 20GB ~ 30GB
    • /home: el resto

    [/list]
    Para crear las particiones, puedes usar el Gparted, una herramienta gráfica muy útil que permite redimensionar, eliminar, crear y demás, varios tipos de particiones (pero ojo, no maneja sistemas encriptados, por lo que solo servirá para crear la partición), o el Palimpsest (utilidad de discos), también muy útil pero no permite redimensionar particiones, aunque sí maneja y permite crear directamente particiones encriptadas con LUKS, aunque esto lo haremos en el punto 3 via la consola.

    Con una rápida búsqueda en Google, el primer sitio explica perfectamente bien cómo usar Gparted para crear las particiones que necesitamos. Con otra búsqueda, éste explica bien cómo usar el fdisk (particionador via consola).



    4. Creando particiones encriptadas
    Ya tenemos el disco preparado y particionado, ahora vamos a crear el sistema de archivos LUKS, para luego reparticionarlo o directamente crear el sistema de archivos EXT2/3/4 o NTFS o el que querramos usar.

    Los dispositivos en linux se encuentran en el directorio virtual /dev. Allí accederemos para manipular los discos y particiones.

    Hay varias formas de hacer referencia una partición: puede ser por etiqueta, si tiene; por UUID, por nombre, por id, etc. Una forma muy común es llamarlas por /dev/sda2, /dev/sdc1, etc., donde el formato es /dev/sdXY, siendo X una letra de la 'a' a la 'z' que hace referencia al disco, e Y siendo un número mayor o igual a 1 que hace referencia al número de partición.

    Antes de encriptar una partición, empezaremos por crear su respectiva llave.
    Creando las llaves
    La idea es generar un archivo con contenido aleatorio (pseudo aleatorio en verdad, pero no entraré en discusiones filosóficas) que usaremos como llave. Este archivo nos permitirá desencriptar las particiones sin necesidad de tipear contraseñas.

    Hay muchísimas formas de hacerlo, una es usando el comando dd (no hace falta ser root):

    dd if=/dev/urandom of=mi_llave.key

    Donde mi_llave.key es el nombre que le daremos al archivo de llave; podemos usar cualquier nombre, el que querramos. Recomiendo usar un nombre que podamos identificar, como p.e.: home.key, mi_pc.key, etc. La extensión no necesariamente debe ser .key, puede ser p.e.: .bin o nada incluso. Al no haber indicado ninguna ruta de salida, el archivo será creado en el directorio en el que estábamos al ejecutar el comando.

    Esta llave debemos guardarla con nosotros. Si se pierde, no habrá forma de recuperar la información, al menos no en los próximos cientos o miles de años. Quizá nuestros tatara-tatara-....-nietos puedan crackear esta encriptación con los sistemas hiperpoderosos de aquel futuro (si la humanidad no se destruye antes, pero no entraré en esa cuestión), pero de momento será imposible desencriptar algo sin la llave.

    Es conveniente crear dos llaves, una maestra y una de uso regular. Esto se explica en el apéndice Sistema de doble llave.
    Borrado seguro de datos
    Criptográficamente hablando, si la partición que estamos encriptando tenía datos, deberíamos primero destruir todo sobreescribiendo la partición con ceros o bytes aleatorios. Este proceso demora mucho tiempo, dependiendo del tamaño de la partición, de la velocidad de escritura del disco y de la potencia de tu PC. Puede que tarde tal vez unos 10 o 20 minutos o varias horas (¡o días!). Este proceso también puede reducir la vida útil del disco si lo repetimos muchas veces.

    Para sobreescribir, podemos nuevamente usar el comando dd o el comando badblocks de distintas maneras (siendo root):

    badblocks -c 10240 -wsvt random /dev/sdXY
    dd if=/dev/zero of=/dev/sdXY
    dd if=/dev/urandom of=/dev/sdXY
    dd if=/dev/random of=/dev/sdXY


    Los ordené de la opción más veloz a la más lenta, a la vez que de la, criptográficamente hablando, menos segura a la más segura. Podemos leer aquí un poco más sobre el tema.
    Encriptando particiones
    Ya tenemos la llave. Ahora, para encriptar una partción ya creada, abrimos una consola o terminal como root (sudo -i o bien sudo su o como más te guste) y ejecutamos:

    cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/sdXY --key-file=mi_llave.key
    -- ATENCION --  ¡Todos los archivos serán eliminados dado que dicha partición será formateada!  Verficá dos veces haber hecho el backup correspondiente y haber indicado correctamente la partición antes de apretar ENTER.  Luego, será muy tarde.
    Donde /dev/sdXY es la partición que vamos a encriptar, como ya expliqué unos párrafos más arriba; y mi_llave.key es el archivo llave que usaremos.

    Podemos especificar otro algoritmo que no sea AES, como p.e.: Serpent o Blowfish, pero eso está fuera del alcance de esta guía. Fijate si esto te sirve.

    Listo, ya tenemos nuestra partición encriptada, así de fácil. Ahora deberíamos abrirla y crear el sistema de archivos o hacer el reparticionado que corresponda.

    Para abrir la unidad encriptada, tipeamos (como root):

    cryptsetup luksOpen /dev/sdXY cryptodata --key-file=mi_llave.key

    Donde indicaremos la ubicación de la partición encriptada y la llave. cryptodata es el nombre que le asignaremos a la partición desencriptada (abierta en verdad, la partición sigue encriptada pero la abrimos para poder usarla). Puede ser cualquier cosa, sin espacios. Este nombre lo usaremos para referirnos a dicha partición abierta, de la forma /dev/mapper/cryptodata

    Luego crea el sistema de archivos en la partición abierta con mkfs:

    mkfs -t ext3 /dev/mapper/cryptodata

    Donde -t indica el sistema de archivos a crear, ext3 en este caso, y luego se indica la ubicación de la partición abierta. Podés crear cualquier sistema de archivos: ext2/3/4, hfs, ntfs, fat, etc. Leer la ayuda para más información: man mkfs

    Podés, si lo necesitas, particionar primero y luego crear el sistema de archivos. En ese caso usaremos Palimsest o fdisk, dado que Gparted no soporta trabajar con unidades encriptadas. Vuelve al punto 2 para más detalles sobre crear las particiones.

    Para cerrar la unidad encriptada, tipeamos (como root):

    cryptsetup luksClose cryptodata

    Debe desmontarse primero si es que estuviese montada: umount /dev/mapper/cryptodata

    SWAP encriptado
    Para encriptar el SWAP, hay al menos dos opciones dependiendo de si vas a usar la hibernación o no.
    Sin hibernación
    Si no usarás hibernación, entonces la idea es hacer que SWAP se genere en cada arranque del sistema, y se encripte con una clave aleatoria. Esto se hace simplemente indicandolo en los archivos de configuración /etc/crypttab y /etc/fstab, y entonces en cada inicio el sistema generará un sistema de archivos de intercambio SWAP encriptado. Por supuesto, esto hace que la hibernación falle, dado que SWAP se destruye en cada inicio.

    Edita el archivo /etc/crypttab como root y agrega:
    [b]cryptoswap /dev/sdSW [/b]/dev/urandom swap
    Donde cryptoswap es el nombre que le has puesto al SWAP abierto y /dev/sdSW es la partición que le asignaste a SWAP.

    Ahora edita /etc/fstab como root y agrega:
    /dev/mapper/[b]cryptoswap[/b] none swap sw 0 0
    Y listo, no tenés que hacer nada con la particion, basta con que la misma esté vacía. En cada inicio, el sistema generará el SWAP y lo encriptará usando una clave aleatoria (/dev/urandom). A su vez, todo lo que exista en esa partición será destruido.

    Aunque no uses la hibernación, nada te impide usar el método que se explicará para la hibernación. Ambos son, criptográficamente hablando, igual de seguros. Si bien podemos admitir que ésta forma es técnicamente más segura, considerando el tiempo que tomaría romper (crackear) uno u otro método, podemos afirmar que ambos son igualmente seguros.
    Con hibernación
    Para este caso lo que haremos será crear una simple partición encriptada con luks, pero la llave no será un archivo, sino que usaremos una partición. Sí, así como leés: usaremos información de una partición, la de root ("/" p.e., para generar la llave.

    ¿Por qué no usar un archivo como en las demás? Bueno, el problema que existe es que si usamos un archivo, seguramente lo guardemos en la partición root o home, dado que boot no está encriptado. Pero cuando el sistema inicia y trata de montar SWAP para restaurar la hibernación, no podrá acceder a la llave, dado que root o home aún siguen encriptados.

    Sí podemos usar un archivo guardado en una unidad externa, pero no lo considero ni práctico ni conveniente, por lo que te dejo la tarea de investigar cómo hacerlo (y luego me cuentas y lo agrego aquí, a tu nombre claro está).

    Entonces, generemos nuestra llave a partir de la partición root. Considero que la misma ya está encriptada y abierta en /dev/mapper/cryptoroot, y que la partición de SWAP es /dev/sdSW (este es un nombre que acabo de inventar, seguramente sea /dev/sda2 o similar). Ejecutamos como root:

    /lib/cryptsetup/scripts/decrypt_derived [b]cryptoroot[/b] > /dev/shm/swap.key

    /dev/shm (en la mayoría de las distros) se trata de un sistema de archivos temporal, alojado solo en la memoria RAM. Esto es, la llave no se escribe al disco (en teoría), lo que debería eliminar los riesgos de ser recuperada.

    Y ahora encriptamos la partición con esa llave:

    cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat [b]/dev/sdSW[/b] --key-file=/dev/shm/swap.key

    La abrimos para luego crear el área de intercambio SWAP:

    cryptsetup luksOpen [b]/dev/sdSW cryptoswap[/b] --key-file=/dev/shm/swap.key
    mkswap -f -L SWAP /dev/mapper/[b]cryptoswap[/b]


    Ya tenemos la partición lista, ahora debemos editar los archivos /etc/fstab y /etc/crypttab como en el caso anterior para indicarle al sistema dónde está el SWAP y cómo desencriptarlo.

    Por cierto, no te preocupes en guardar esa llave, no sirve para nada. Es decir, en ningún momento te va a importar abrir el SWAP manualmente, y si así lo fueses entonces recreas la llave repitiendo lo explicado más arriba y listo.

    El último comando nos devolvió el UUID del área de intercambio SWAP que acabamos de crear, esto lo usaremos para indicar dónde está el SWAP en /etc/crypttab:
    [b]cryptoswap[/b] UUID=[b]a04cd219-2361-ba74-b791-0de0abc7ef66 cryptoroot[/b] luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
    Donde he llamado cryptoswap al SWAP desencriptado (estará entonces en /dev/mapper/cryptoswap) y cryptoroot al root desencriptado (/dev/mapper/cryptoroot). Puedes usar el nombre que quieras, pero debes manter siempre los mismos nombres en todos los archivos de configuración. Resalté el UUID, debes reemplazarlo por el que corresponda.

    Ahora edita /etc/fstab:
    /dev/mapper/[b]cryptoswap[/b] none swap sw 0 0
    Y finalmente edita el archivo /etc/initramfs-tools/conf.d/resume, si es que nuestro sistema utiliza pm-utils para hibernar (Ubuntu usa este por defecto):
    RESUME=/dev/mapper/[b]cryptoswap[/b]
    Aquí haré una pausa para contarte un cuentito: resulta ser que, se supone, al iniciar el sistema leerá este archivo (que terminará dentro de initramfs en /boot) y sabrá que debe recuperar la información de hibernación desde /dev/mapper/cryptoswap. Pues no me preguntes por qué, esto no sucede. Muchas horas de pruebas y no he logrado hacer que esto funcione. Probé usar UUID en lugar de la ruta explícita, pero tampoco. ¿Cuál fue la solución entonces? En algún sitio listado en las fuentes de información leí algo que me prendió la lamparita: pasarle al kernel el parámetro resume=/dev/mapper/cryptoswap. Y funcionó

    Puede que te estés preguntando: ¿pasarle qué al qué? El kernel es el núcleo del sistema, es el linux en sí, propiamente dicho. Luego, tu distro se basa en ese kernel. Al iniciar el sistema, usando GRUB como administrador de arranque p.e., podemos pasarle parámetros al kernel. Ejecuta en tu terminal:

    cat /boot/grub/grub.cfg

    Y fijate en la línea que diga algo como:
    menuentry 'Ubuntu, with Linux 2.6.35-28-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root=(hd0,msdos3)'
    search --no-floppy --fs-uuid --set 3f53ba23-d344-4291-a17b-9d601481a7c4
    linux /vmlinuz-2.6.35-28-generic root=/dev/mapper/croot ro quiet splash
    initrd /initrd.img-2.6.35-28-generic
    }

    la que importa es la que dice "linux /vmlinuz-2.6.35-28-generic root=/dev/mapper/croot", esa es la línea del kernel. Luego, lo que sigue "ro quiet splash" son parámetros que se le pasan al kernel: ro es para montar root como solo lectura, quiet es para no mostrar - o mostrar pocos - mensajes y splash muestra la pantallita de carga.

    En esa misma línea, si nosotros agregamos resume=/dev/mapper/cryptoswap el sistema podrá leer, si existe, la información de hibernación y recuperarla. Si no existe, continúa con el arranque normal.

    Pues entonces, si la primera opción te funciona, y tu sistema vuelve de la hibernación recuperando el estado correctamente, no necesitas hacer nada más. Si no es así, como mi caso, entonces vamos a editar el archivo de configuración del GRUB (o el del BURG, si lo usas): /etc/default/grub (o bien /etc/default/burg). Busca una línea que diga GRUB_CMDLINE_LINUX_DEFAULT= y editala o creala si no existe:
    GRUB_CMDLINE_LINUX_DEFAULT=quiet splash resume=/dev/mapper/[b]cryptoswap[/b]"
    De esta manera, siempre que actualicemos GRUB (o BURG) el archivo de configuración le indicará al kernel que debe resumir la hibernación desde /dev/mapper/cryptoswap. Recordá que si usaste otro nombre, tenés que modificar esta línea acorde.
    Desencriptar desde USB al iniciar
    Esta es la parte más interesante. Se trata de un script con el siguiente copyright:
    # Part of passwordless cryptofs setup in Debian Etch.
    # See: http://wejn.org/how-to-make-passwordless-cryptsetup.html
    # Author: Wejn <wejn at box dot cz>
    #
    # Updated by Rodolfo Garcia (kix) <kix at kix dot com>
    # For multiple partitions
    # http://www.kix.es/
    #
    # Updated by TJ <linux@tjworld.net> 7 July 2008
    # For use with Ubuntu Hardy, usplash, automatic detection of USB devices,
    # detection and examination of *all* partitions on the device (not just partition #1),
    # automatic detection of partition type, refactored, commented, debugging code.
    #
    # Updated by Hendrik van Antwerpen <hendrik at van-antwerpen dot net> 3 Sept 2008
    # For encrypted key device support, also added stty support for not
    # showing your password in console mode.

    # define counter-intuitive shell logic values (based on /bin/true & /bin/false)
    # NB. use FALSE only to *set* something to false, but don't test for
    # equality, because a program might return any non-zero on error

    # Updated by Dominique Bellenger <dev at domesdomain dot de>
    # for usage with Ubuntu 10.04 Lucid Lynx
    # - Removed non working USB device check
    # - changed vol_id to blkid, changed sed expression
    # - changed TRUE and FALSE to be 1 and 0
    # - changed usplash usage to plymouth usage
    # - removed possibility to read from an encrypted device (why would I want to do this? The script is unnecessary if I have to type in a password)

    Está realmente muy bien hecho, me ha funcionado sin tener que hacer cambio alguno. El script completo es muy largo, pueden verlo en la página de donde lo saqué: http://domesdomain.de/blog/2010/06/09/howto-decrypt-luks-partition-with-keyfile-or-password/

    O podés descargarlo desde aquí. Le hice una pequeña modificación para configurar más fácilmente el tiempo de espera para el dispositivo USB. Si ves que al usarlo te dice que no encuentra el dispositivo USB, es porque aún no tuvo tiempo de inicializarlo. Incrementa el valor correspondiente. Con 5 segundos me funcionó bien, pero p.e. en una VM tuve que ponerle 10 segundos.

    Entonces, descarga el archivo y luego descomprime y cambia permisos:

    wget http://www.hackan.com.ar/WP/wp-content/uploads/2011/05/crypto-usb-key.tar.gz
    sudo tar -xvapf crypto-usb-key.tar.gz -C /
    sudo chown root.root /usr/local/sbin/crypto-usb-key.sh
    sudo chmod 0754 /usr/local/sbin/crypto-usb-key.sh


    Y le indicas al sistema que en el inicio debe ejecutar ese script para desencriptar la partición que elijas. Edita /etc/crypttab:
    [b]cryptodata /dev/sdDA mi_llave.key[/b] luks,keyscript=/usr/local/sbin/crypto-usb-key.sh
    Donde cryptodata será el nombre del dispositivo cuando esté abierto, /dev/sdDA es la partición que le corresponde a la partición y mi_llave.key es el nombre que tiene nuestro archivo llave para esa partición. Este archivo debe estar ubicado en la raíz del dispositivo USB que usemos, es decir, tirado así nomás. El script buscará ese archivo en todos los dispositivos USB que encuentre conectados al sistema. No se si se puede usar un subdirectorio y editar crypttab acorde, no lo he probado.

    Debes indicar en /etc/crypttab cada partición que requiera de un archivo llave de esa forma. Yo lo que hice fue hacer que la llave en mi pendrive desencripte la partición raíz ("/" y luego que esta desencripte a las demás. Eso te lo cuento en el punto 5.

    Finalmente hay que recrear el archivo /boot/initrd y luego actualizar el GRUB (usar update-burg para el BURG):

    sudo update-initramfs -u
    sudo update-grub


    Este comando actualiza el initrd del kernel más nuevo. Una vez verificado que esté todo funcionando correctamente, ejecutá:

    sudo update-initramfs -u -k all

    para actualizar todas las versiones del initrd.



    5. Encriptando todo el sistema
    En este apartado mostraré paso a paso cómo crear las particiones, encriptarlas, luego crear los sistemas de archivos, restaurar el baclup y configurar el sistema. Es una recapitulación de lo ya explicado, pero todo junto y seguido. No me detendré a dar detalles.

    Inicia con tu distro live, es decir, con un CD/DVD o USB.

    Te recuerdo que todo lo que esté en el disco desaparecerá.

    Particiona el sistema con la herramienta que quieras. Recuerda crear una aparte para /boot. A continuación comento sobre particionado con fdisk.

    Llamaré /dev/sda al disco principal con el que vamos a trabajar. Si este no es tu caso, entonces modifica las siguientes líneas acorde. Abre una consola o terminal como root y:

    fdisk /dev/sda

    Si tipeamos 'm' nos muestra la lista de opciones.
    Opción 'o' para crear una nueva tabla de particiones, confirmamos si nos lo pide.
    Opción 'w' para aplicar el cambio y salir.

    sync
    partprobe
    fdisk /dev/sda


    Opción 'n' para crear nuestra partición /boot
    Tipeamos 'p' para primaria
    '1', porque será la primera
    Aceptamos el valor inicial por default (ENTER)
    Tipeamos '+200M' para indicarle que debe ser de 200MB, o emplear el valor que deseen
    Y ya tenemos nuestra particion de arranque creada; seguimos.
    Opción 't' para cambiar el tipo de partición
    '1'
    '83'
    Y ya le indicamos que es una partición de linux.
    Opción 'a' para seleccionar la partición de arranque
    '1'
    Y ahora el arranque se dará en esa particion.
    Opción 'n' para crear otra partición más.

    Y repites los pasos salvo lo de la Opción 'a', y creas todas las particiones que desees. Te vuelvo a recomendar este sitio si necesitas más ayuda, o una búsqueda en Google.

    Finalizas con 'w' para escribir los cambios en el disco, y luego haces nuevamente:

    sync
    partprobe 

    Para asegurarse que el sistema tome los cambios del disco. Ahora, es tiempo de encriptar la/s particion/es creada/s, a excepción de /boot, claro está, y luego crear el sistema de archivos. Voy a suponer que el disco quedó así particionado:

    /dev/sda1: /boot
    /dev/sda2: SWAP
    /dev/sda3: /
    /dev/sda5: /home

    Tipea sudo fdisk -l para ver cómo son tus particiones. Supondré también que la llave para "/" se llamará root.key y para /home, home.key; que tienes el disco de backup montado en /media/backup y que los archivos se llaman como ejemplifiqué en el punto 2.

    Pocede a crear las llaves, encriptar las particiones y crear los sistemas de archivos (ejecuta como root):

    dd if=/dev/urandom of=[b]root.key[/b] bs=1024 count=4
    cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat [b]/dev/sda3[/b] --key-file=[b]root.key[/b]
    cryptsetup luksOpen [b]/dev/sda3[/b] [b]cryptoroot[/b] --key-file=[b]root.key[/b]
    mkfs -t ext3 /dev/mapper/[b]cryptoroot
    [/b]mkdir /media/cryptoroot
    mount /dev/mapper/[b]cryptoroot[/b] /media/cryptoroot
    tar -xvpzf [b]/media/backup[/b]/root_backup.tar.gz -C /media/cryptoroot
    mkdir /media/cryptoroot/boot
    mkdir /media/cryptoroot/mnt
    mkdir /media/cryptoroot/media
    mkdir /media/cryptoroot/home
    mkdir /media/cryptoroot/proc
    mkdir /media/cryptoroot/sys


    dd if=/dev/urandom of=[b]home.key[/b] bs=1024 count=4
    cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat [b]/dev/sda5[/b] --key-file=[b]home.key[/b]
    cryptsetup luksOpen [b]/dev/sda5[/b] [b]cryptohome[/b] --key-file=[b]home.key[/b]
    mkfs -t ext3 /dev/mapper/[b]cryptohome
    [/b]mkdir /media/cryptohome
    mount /dev/mapper/
    [b]cryptohome[/b]  /media/ cryptohome
    tar -xvpzf [b]/media/backup[/b]/home_backup.tar.gz -C /media/ cryptohome
    umount /media/cryptohome
    cryptsetup luksClose [b]cryptohome[/b]


    mkdir /media/boot
    mount [b]/dev/sda1[/b] /media/boot
    tar -xvpzf [b]/media/backup[/b]/boot_backup.tar.gz -C /media/boot


    Si vas a hibernar:

    /lib/cryptsetup/scripts/decrypt_derived [b]cryptoroot[/b] |  cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat [b]/dev/sda2[/b] --key-file -
    /lib/cryptsetup/scripts/decrypt_derived [b]cryptoroot[/b] |  cryptsetup luksOpen [b]/dev/sda2 cryptoswap[/b] --key-file -
    mkswap -f -L SWAP /dev/mapper/[b]cryptoswap
    [/b]
    cryptsetup luksClose [b]cryptoswap[/b]

    Ahora, la configuración del sistema. Considero que la opción más cómoda es que con una sola llave desencriptemos todo el sistema. ¿Cómo? Pues simple: haciendo que esa llave abra la raíz del sistema ("/" y que luego eso abra las demás particiones. Esta es la llave que debes copiar a tu dispositivo USB y llevar siempre con vos.

    Entonces, mové la llave para /home a la carpeta que quieras dentro de la raíz, como ser la carpeta /root, que es el home del usario root.

    mv home.key /media/cryptoroot/root
    chown root.root /media/cryptoroot/root/home.key
    chmod 0400 /media/cryptoroot/root/home.key


    Editá el archivo de configuración de particiones encriptadas /etc/crypttab, que estará en /media/cryptoroot/etc/crypttab:
    # <target name>    <source device>        <key file>    <options>
    [b]cryptoswap[/b]    UUID=3df39403-1fed-4ec8-b2d2-2123478c5676    [b]cryptoroot[/b]    luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
    [b]cryptohome[/b]    UUID=a342c698-2231-44cc-d191-0dff3ffdef66    [b]/root/home.key [/b]   luks
    [b]cryptoroot[/b]    UUID=ae2b1f76-ef5a-4b44-ccf7-0dd963e6c6ae    [b]root.key[/b]    luks,keyscript=/usr/local/sbin/crypto-usb-key.sh

    Para hallar los UUID correspondientes, ejecuta blkid como root. Debes usar el UUID de las particiones encriptadas, NO de la particiones abiertas. Puedes usar también la nomenclatura /dev/sdXY, en este ejemplo sería:
    # <target name>    <source device>        <key file>    <options>
    [b]cryptoswap    /dev/sda2    cryptoroot[/b]    luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
    [b]cryptohome    /dev/sda5    /root/home.key [/b]   luks
    [b]cryptoroot    /dev/sda3    root.key[/b]    luks,keyscript=/usr/local/sbin/crypto-usb-key.sh

    Si no vas a hibernar, cambia la primer línea por:
    [b]cryptoswap /dev/sda2[/b] /dev/urandom swap
    En ese caso no uses UUID, dado que cambiará en cada inicio al reformatearse la partición (¡creo!).

    Edita el archivo /etc/fstab que le indica al sistema dónde están las particiones que montará al inicio; te recuerdo que el archivo estará, siguiendo este ejemplo, en /media/cryptoroot/etc/fstab:
    # /etc/fstab: static file system information.
    #
    # Use 'blkid -o value -s UUID' to print the universally unique identifier
    # for a device; this may be used with UUID= as a more robust way to name
    # devices that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    nodev,noexec,nosuid 0       0
    # / on /dev/sda3
    /dev/mapper/[b]cryptoroot[/b]    /    ext3    errors=remount-ro    0    1
    # /boot on /dev/sda1
    [b]/dev/sda1[/b]    /boot    ext3    defaults    0    0
    # /home on /dev/sda5
    /dev/mapper/[b]cryptohome[/b]    /home    ext3    defaults    0    2
    # swap on /dev/sda2
    /dev/mapper/[b]cryptoswap[/b]    none    swap    sw    0    0

    Aquí puedes usar también los UUID, ¡pero de las particiones abiertas! si tienes dudas, deja la nomenclatura que se muestra. Esta configuración es la misma tanto si vas a hibernar o no. La primera línea, que dice proc... la dejé porque así viene en Ubuntu el archivo fstab por defecto. Edítala según creas conveniente.

    Faltaría descargar el script que permite leer la llave desde USB al inicio:

    wget http://www.hackan.com.ar/WP/wp-content/uploads/2011/05/crypto-usb-key.tar.gz
    sudo tar -xvapf crypto-usb-key.tar.gz -C [b]/media/cryptoroot[/b]
    sudo chown root.root 
    [b]/media/cryptoroot[/b] /usr/local/sbin/crypto-usb-key.sh
    sudo chmod 0754 
    [b]/media/cryptoroot[/b] /usr/local/sbin/crypto-usb-key.sh

    Y si vas a hibernar, edita los archivos que corresponden. Empieza por /etc/initramfs-tools/conf.d/resume, que estará en /media/cryptoroot/etc/initramfs-tools/conf.d/resume:
    RESUME=/dev/mapper/[b]cryptoswap[/b]
    Luego, el archivo de configuración del GRUB (o BURG, lo que corresponda) /etc/default/grub, que estará en /media/cryptoroot/etc/default/grub:
    GRUB_CMDLINE_LINUX_DEFAULT=quiet splash resume=/dev/mapper/[b]cryptoswap[/b]"
    Ya sea que utilices hibernación o no, resta actualizar el disco RAM inicial (initrd) y luego actualizar el GRUB (o BURG). Para ello, debes montar la partición de boot dentro de donde está montado la raíz de tu sistema (/media/cryptoroot en este ejemplo), y luego hacer unos arreglos para hacerle creer al sistema actual (recuerda que estás corriendo una distro live) que la raíz actual del sistema está en la partición montada. Si no has entendido ni jota, copia y pega lo siguiente (siempre siendo root):

    mount [b]/dev/sda1 /media/cryptoroot[/b]/boot
    mount --bind /dev [b]/media/cryptoroot[/b]/dev
    mount --bind /proc [b]/media/cryptoroot[/b]/proc
    mount --bind /sys [b]/media/cryptoroot[/b]/sys

    mount --bind /boot [b]/media/cryptoroot[/b]/boot
    chroot [b]/media/cryptoroot[/b]
    update-initramfs -u
    update-grub
    exit


    Pufff, ¡ya estaría todo terminado! Ahora, desmontar todo y reiniciar para verificar que anduvo:

    umount [b]/media/cryptoroot[/b]/dev
    umount [b]/media/cryptoroot[/b]/proc
    umount [b]/media/cryptoroot[/b]/sys
    umount [b]/media/cryptoroot[/b]/boot
    umount [b]/media/cryptoroot[/b]
    cryptsetup luksClose [b]cryptoroot[/b]

    Ahora sí, ya puedes reiniciar



    6. Apéndice
    Deshabilitar y/o agregar llaves
    Una de las grandes cualidades de los sistemas LUKS es que poseen un anillo de llaves, hasta 8 diferentes, para desencriptarse. Esto es muy útil en entornos multiusuario o para sistemas doble llave.

    Para agregar una llave a una partición LUKS:

    sudo cryptsetup luksAddKey [b]/dev/sdXY[/b]

    Donde /dev/sdXY es la partición encriptada. Este comando pedirá que tipees una clave para autenticarte, y luego pedirá que tipees la nueva clave que querés agregar.

    Para agregar un archivo llave:

    sudo cryptsetup luksAddKey [b]/dev/sdXY /ruta/de/la/llave_nueva.key[/b]

    Y en cualquier caso, para autenticarse empleando un archivo de llave ya existente, agregar al final del comando el parámetro --key-file=/ruta/de/la/llave_vieja.key

    Para eliminar una llave, ejecutas:

    sudo cryptsetup luksKillSlot [b]/dev/sdXY Z[/b]

    Donde Z será un número del 0 al 8 que identifica al slot que queres eliminar. Cada llave se guardará en un slot (casillero) distinto; la primera que coloquemos estará en el 0, la segunda en el 1, etc. Pedirá contraseña para autenticar. Nuevamente, para autenticarse empleando un archivo de llave ya existente, agregar al final del comando el parámetro --key-file=/ruta/de/la/llave_vieja.key

    Otra alternativa, si queres eliminar un archivo llave y no recordás en que slot está, podes ejecutar:

    sudo cryptsetup luksRemoveKey /dev/sdXY /ruta/de/la/llave_a_eliminar.key

    Para obtener información de la partición encriptada:

    sudo cryptsetup luksDump /dev/sdXY

    Ese comando imprimirá algo como:
    LUKS header information for /dev/sdXY

    Version: 1
    Cipher name: aes
    Cipher mode: cbc-essiv:sha256
    Hash spec: sha1
    Payload offset: 2056
    MK bits: 256
    MK digest: 79 f8 68 d2 9c 50 aa dd 00 1f 76 22 32 fc df c2 bc 4b 8c 52
    MK salt: f4 44 0c 28 29 cc 66 7a c2 4c c6 36 22 b7 d5 6a a9 2e cd 6c 22 f1 20 26 06 13 35 a4 22 d7 7b a2
    MK iterations: 46875
    UUID: 3df39483-1abc-0ec8-b9d2-249798765676

    Key Slot 0: ENABLED
    Iterations: 187801
    Salt: f0 99 06 48 64 bd 21 32 41 12 01 66 29 75 52 ea ff 98 0b af aa 3e a8 eb 74 da 2b da 07 bf db 24
    Key material offset: 8
    AF stripes: 4000
    Key Slot 1: DISABLED
    Key Slot 2: DISABLED
    Key Slot 3: DISABLED
    Key Slot 4: DISABLED
    Key Slot 5: DISABLED
    Key Slot 6: DISABLED
    Key Slot 7: DISABLED

    Siempre puedes acudir al manual para obtener más información: man cryptsetup
    Sistema de doble llave
    La idea que cada partición encriptada utilice dos llaves para abrirse: una propia a cada uno y otra maestra, común a todas. O también puede ser que cada partición tenga dos llaves propias, elegir lo que convenga.

    El problema surge si perdemos el archivo de llave. Si eso sucede:
    1- El sistema se ve comprometido, es necesario de inmediato cambiar la clave
    2- Si no tenemos copia del archivo, y no hicimos doble llave, entonces bien podemos tirar todo a la basura, o esperar a que la tecnología avance tanto que se pueda romper la clave antes de pasen un par de vidas...

    Para evitar esto, es necesario deshabilitar una de las llaves, que denominaremos 'temporal' y que estará siempre con nostros, en el dispositivo USB; y tener otra llave, denominada 'maestra', que siempre estará almacenada en un lugar seguro (muy seguro y oculto) y no se moverá de allí.

    Entonces, con la llave maestra podemos deshabilitar la temporal y crear una nueva.

    Siguiendo todo lo ya explicado, crear una llave adicional para cada partición, o bien solo una para todas, y agregarlas al anillo de claves de cada partición, para que actúe como llave maestra. Luego, la copiaremos y almacenaremos en algún lugar seguro (la caja de seguridad en tu banco es buena idea).

    Si nos enfrentamos a una situación donde sabemos que nos pueden obligar a desencriptar el sistema (en un paso de frontera p.e.), o el sistema se puede ver comprometido (se perdió el pendrive con el archivo llave), crear de antemano el siguiente archivo (la idea la extraje de aquí, desconozco el nombre del autor):
    /usr/local/bin/emergencykillkey
    #!/bin/bash
    # Config
    KEYUUID=[b]9CD2-B351[/b]
    ROOTDEV=[b]/dev/sda3[/b]
    KEYNAME=[b]key.bin[/b]

    # Main
    # Montar llave usb
    mkdir /tmp/llave
    mount -t vfat /dev/disk/by-uuid/${KEYUUID} /tmp/llave
    # Generar llave temporal
    cd /dev/shm/
    dd if=/dev/urandom of=tempkey.bin bs=1024 count=20
    # Liberar el slot 7 (no deberia estar ocupado!)
    cryptsetup luksKillSlot ${ROOTDEV} 7 --key-file=/tmp/llave/${KEYNAME}
    # Colocar llave temporal en slot 7
    cryptsetup luksAddKey -S7 ${ROOTDEV} tempkey.bin --key-file=/tmp/llave/${KEYNAME}
    # Remover llave usb del llavero
    cryptsetup luksRemoveKey ${ROOTDEV} /tmp/llave/${KEYNAME} --key-file=tempkey.bin
    # Eliminar llave temporal
    shred -uvx tempkey.bin
    # Dejamos la llave usb, total no sirve; alegamos que hubo algun error
    # de esta manera ;)
    umount /tmp/llave
    exit 0
    # --- ---

    ¡Configurar las opciones marcadas en negrita como correspondan! La primera indica el UUID del dispositivo USB que contiene nuestra llave, la segunda el dispositivo al cual se le eliminará la llave temporal asignada y la tercera indica el nombre del archivo llave. Se podría fácilmente editar este script para recibir los parámetros por línea de comandos, y luego crear otros scripts tipo wrapper para cada partición afectada. Finalmente, editar los permisos para que solo root lo ejecute.

    Este script elimina la llave usb del anillo de llaves de la partición, haciendo que la misma sea imposible de desencriptar sin la llave maestra. Es necesario apagar el sistema al concluir.
    A su vez, deja el archivo en el pendrive para que de esta manera nosotros podamos argumentar que ocurrió alguna falla desconocida y bueno, actuar un poco...
    Luego será necesario usar la llave maestra, que NO deberías tener encima, para desencriptar las particiones.
    Si todo sale mal...
    Si reiniciaste y tu sistema no arranca, vuelve a iniciar con una distro live y verifica los archivos de configuración. Espero que hayas seguido esta guía paso a paso para evitar problemas.

    En cualquier caso, si tu problema es que no puedes por X motivo abrir una partición encriptada dado que no acepta la llave, lamento decirte que NO hay forma de recuperar la información. No existe. Fué. Adiós.

    Si puedes montar las particiones y abrirlas para acceder a la información, entonces el problema no es grave. Verifica todas las configuraciones paso a paso para ver por qué no está iniciando. Si te sale algún error, puedes consultar acá. Como última alternativa, puedes formatear todas las particiones y reestablecer toda la información sin encriptar, recuerda eliminar el archivo /etc/crypttab y modificar /etc/fstab acorde a tus nuevas particiones.
    Puntos débiles, vulnerabilidades
    Dado que la partición /boot está desencriptada, es posible que un atacante modifique initrd e inyecte un script que capture nuestra llave. Lo bueno es que en ese punto del arranque no hay acceso posible a internet, por lo que dicho atacante deberá volver para obtener la llave.
    Una forma de evitar esto es configurar la bios tal que:
    • Use contraseña para cambiar la configuración.
    • Arranque directamente al disco correspondiente, desactivando arranques adicionales.
    • Desactivar, si existe, menú de arranque o similares.
    De esta manera, un atacante no tendrá forma de acceder a dicha partición, a menos que pueda remover el disco del sistema, trabajarlo y volverlo a colocar sin que lo notemos (cosa que veo complicada...). Eso podría evitarse configurando la opción “case open alarm” que traen prácticamente todas las BIOS, y metiendo mano en el hardware acorde.
    Si existe otro sistema operativo al cual un atacante puede acceder, entonces podría desde allí afectar dicha partición. Tomar los recaudos necesarios (restricción de permisos, p.e.)

    He leído aquí sobre una utilidad que realiza un chequeo de los archivos de la partición /boot en el arranque, e indica si fueron comprometidos: boot-digest-check
    No logré encontrarla en ningún lado.

    Para los más paranoicos, existen otras opciones:
    • Que la partición /boot esté en el mismo pendrive, y no en el disco. Ningún atacante tendría acceso y no exisitiría vulnerabilidad.
    • Hacer a mano un chequeo con, p.e., md5 antes de apagar el sistema y guardar el resultado en el pendrive. Al regresar, bootear con el pendrive (previa habilitación via BIOS) y verificar los hashes.
    Ambas opciones escapan a este artículo. Y la segunda es realmente tediosa...
    7. Fuentes de información
    Si bien esta guía la escribí yo, he sacado mucha información de la web, en particular de las fuentes aquí listadas.

    Fuentes de Información - Sistema encriptado y apertura con llave USB

    Dar puntos
    89 Puntos
    Votos: 0 - T!score: 0/10
    • 0 Seguidores
    • 6.350 Visitas
    • 23 Favoritos

    13 comentarios - Sistema encriptado y apertura con llave USB

    @Pb_95 Hace más de 3 años -5
    A la mierda... alto post.

    PD: no lei nada xD
    @skymloder Hace más de 3 años +2
    +10 y sigo tu blog por RSS
    @error_32 Hace más de 3 años +1
    buen tema 10 puntos por ello aunq merecesmas
    @Santiag0Ri0IV Hace más de 3 años -1
    Yo tengo todo encriptado con bitlocker de windows 7 no se si es tan bueno
    @isco0092 Hace más de 3 años
    ahh claro, dame 2 de esos por favor.
    @gnom3 Hace más de 3 años
    buen post lo leí todo

    Sistema encriptado y apertura con llave USB
    @Hugo1954 Hace más de 3 años +1
    Muy bueno
    + 5
    @ingente20 Hace más de 2 años
    gracias por la info
    @danielarario Hace más de 1 año +1
    Gracias!!
    Por lo menos, unos puntos!!!
    @Pepe_use Hace más de 1 año
    genial ! muy bueno