Intuyo que que el descifrado lo realiza el gestor de arranque GRUB o algo así.
Existen un montonazo de formas de cifrar un ordenador con Linux. Hay métodos que tienen la partición /boot
cifrada y entonces sí, se encargaría el GRUB de descifrarla. Pero no todos los métodos tienen esa peculiaridad. De hecho, el método que has mencionado es bastante complejo y un poco impráctico. Al fin y al cabo, quieres reducir la superficie de ataque, no aumentarla con un GRUB por medio. Échale un vistazo a esta entrada en la wiki de Arch Linux para ver qué otras alternativas tienes.
Me consta haber encontrado alguna vez alguna guía de instalación para Arch Linux en donde se usa Secure Boot y cifrado. Pero mi gran duda siempre es si, al final, hay que exponer algo, por pequeño que sea, para que el sistema arranque. Sea lo que sea, el kernel, GRUB, EFI, lo que sea. Rompiendo así la cadena de confianza en algún punto.
Lo ideal es cifrar todo lo que puedas y dejar sin cifrar lo mínimo necesario para arrancar. Usando alguno de los métodos que hay, podrías dejar todo cifrado a excepción del kernel, cmdline y el initrd. No tendrías ni siquiera que usar un gestor de arranque si no quieres, ya que Linux puede arrancarse él solito usando algo llamado EFISTUB.
Pero tú firmas absolutamente todo lo que vayas a usar entre que arrancas el ordenador y llegas al kernel. Esto es, el propio firmware EFI, el gestor de arranque si es que vas a usar uno y el propio kernel junto con el cmdline y el initrd (luego te explico esto). Es decir, no rompes la cadena de confianza en ningún punto. Lo que no está cifrado (porque no es confidencial), está firmado (porque tenemos que asegurarnos de que nadie lo ha alterado).
Pero realmente en Windows ocurre lo mismo con Bitlocker. La partición EFI, donde está el software necesario para arrancar Windows y descifrar la partición del sistema, está descifrado, lógicamente, para que el ordenador pueda leerlo y ejecutar esas instrucciones. Lo bueno es que va a estar firmado, así que te aseguras de que nadie haya podido alterar el contenido de la partición EFI. No necesitas que sea confidencial, puesto que ahí no vas a guardar ningún elemento privado como claves.
Hablando de elementos privados, existen dos formas de obtener la contraseña para descifrar la partición del sistema una vez has arrancado el ordenador y el kernel se está ejecutando: o bien la obtienes de un TPM (físico o integrado) o bien le pides al usuario que por favor la introduzca de alguna manera (ya sea con un pendrive con una clave, a mano, etc). En el primer caso, si el TPM detecta que algún elemento de la cadena de confianza que te expliqué antes ha sido vulnerado, no va a soltar la clave y todos contentos. El problema de este método es si consigues interceptar de alguna manera el tráfico entre el TPM y el resto del ordenador porque este esté separado físicamente del resto de componentes, ya que podrías obtener la clave de descifrado, aunque para esto necesitarías acceder físicamente al ordenador durante un buen rato. Hace tiempo se hizo famoso un vídeo que atacaba un ordenador con Bitlocker justo de la forma que te estoy diciendo. Ya te puedes imaginar que la culpa aquí no es de Bitlocker, sino de usar un TPM que no esté integrado en el procesador (esto haría al menos un poco más difícil el interceptar las comunicaciones del TPM al estar dentro de otro chip).
Entiendo que esto no ocurre en Windows, ¿Es así? Es decir, que un Windows cifrado y con Secure Boot te garantiza que nadie ha podido manipularlo o leerlo. Aún teniendo acceso físico a la máquina (para simplificar dejaremos de lado ideas peregrinas como la de un actor malicioso instalando un chip milagroso cuando no estás mirando).
Con lo que te he explicado arriba verás que esto es igual en Windows y en Linux. Tú cifras todo menos la porción necesaria para descifrar el disco duro. Te aseguras de que esa pequeña porción de software no ha sido alterada de ninguna forma gracias al arranque seguro, que verifica la firma del binario y asegura que nadie ha podido alterarlo. Y arriba también te he mencionado un ejemplo de ataque físico si almacenas las claves en un TPM físico. Otro posible ataque físico es usando Thunderbolt o leyendo la memoria RAM mientras el dispositivo está en reposo.
Vale, ¿y cómo puñetas cifras una instalación de Arch Linux (u otra distribución, en realidad) moderna?
En primer lugar, vas a usar solo EFI desactivando el modo de compatibilidad con BIOS y activas la contraseña para entrar en los ajustes de la BIOS (si no, cualquiera podría coger y desactivar el Secure Boot y eso no es lo que queremos), generas tus propias claves de firmado (la clave privada la debes almacenar o otro dispositivo o cifrada, para evitar que un software malicioso pueda leerlas y firmar su propio software malicioso) y las cargas en la BIOS. Finalmente, activas el arranque seguro.
Vas a tener dos particiones:
Primero, una partición EFI que tendrás sin cifrar y que contendrá tu gestor de arranque favorito (a mí el que más me gusta usar es systemd-boot
) si es que quieres usar uno, porque como te he dicho antes podrías arrancar el kernel directamente. Eso sí, tendrás que firmarlo con la clave que generaste antes. Por otro lado, tendrás el kernel también firmado. ¿Qué pasa? Que el kernel no arranca por sí solo. Necesita un pequeño sistema de ficheros temporal para cargar todas las utilidades que pueda necesitar para, entre otras cosas, montar (y descifrar) tu partición principal. A esto se le llama initrd
. Finalmente, también necesitarás un cmdline
, que le diga al kernel alguna información que pueda necesitar.
Quizá ves el problema, ¿verdad? De nada sirve firmar el kernel si luego vas a tener dos componentes extra de los que depende que están a su libre albedrío. Para eso se inventaron las UKI, o Unified Kernel Image, una imagen que almacena el kernel, el initrd
, el cmdline
e incluso otros elementos que puedas necesitar. Ahora sí que podemos firmar la imagen al completo y nos aseguraremos de que no se pueda manipular de ninguna manera.
Por otro lado, tendrás otra partición con tus datos cifrados de la manera que te dé la gana. Tu pedazo de UKI se encargará de descifrarla. Y, como ves, todo está o bien cifrado o bien firmado, asegurándote de que nadie pueda leer lo que esté cifrado o alterar lo que esté firmado. Y nadie podría sustituir un elemento de arranque por otro malicioso, ya que entonces el firmware EFI no dejaría arrancar y el TPM (si lo usas) no proporcionaría la clave necesaria para descifrar el resto del disco duro.
Si hay algo que no entiendas o que he explicado demasiado rápido, avísame y te lo aclaro. Por supuesto, nada de lo que he escrito sirve de nada si un atacante usa otro tipo de técnicas.