Hace unos días tuve una clase de “Seguridad y alta disponibilidad” muy…. esclarecedora. Me dí cuenta que el profesor no tenía ni idea de lo que estaba explicando, y que como mucho se habia visto un par de tutoriales de ello en Internet. Así que me puse a investigar, y a parte de que aprendí un par de cosas que no sabía del GRUB (el 90% ya lo sabía de cargarme el arranque de Ubuntu hace años), me dio por escribir esta entrada.
Lo que vamos a ver hoy es cómo configurar una contraseña para el arranque de un sistema operativo a través de GRUB. Para ello os voy a dar una pequeña explicación de qué es GRUB y de cómo funciona su configuración.
¿Qué es GRUB?
GRUB (GNU GRand Unified Bootloader) es un gestor de arranque usado en linux que permite arrancar múltiples sistemas operativos. Para que nos entendamos, es el responsable de que os salga esta pantalla al arrancar un ordenador con linux instalado:
Bien, ahora vamos a aprender cómo funciona la configuración de GRUB. Todo lo que sale en la pantalla de la foto es el resultado de un archivo de configuración que se encuentra en /boot/grub/grub.cfg
. Y con todo me refiero a todo (cada entrada, el fondo, el color de las letras,…). Mucha gente cuando tiene que configurar algo de GRUB modifica ese archivo, sin leer las primeras líneas, donde dice claramente “DO NOT EDIT THIS FILE”, y luego se quejan de que Windows ha desaparecido al actualizar Ubuntu y cosas así. Ains…
El archivo /boot/grub/grub.cfg
es un archivo generado a partir del contenido de varios archivos, a saber:
- /etc/default/grub
: en este archivo están configuraciones como tiempos de espera antes de arrancar, sistema operativo preferido, etc…
- /etc/grub.d/*
: en esta carpeta está todo lo demás (entradas, fondo del GRUB, colores,…).
Una vez que hemos modificado algo en estos archivos, ejecutamos sudo update-grub2
y se generará un nuevo archivo de configuración en /boot/grub/grub.cfg
a partir de los archivos anteriores.
¿Y que es eso de las contraseñas que has dicho antes?
Cuando arrancas GRUB, simplemente seleccionas el sistema operativo que quieras usar y le das al Intro. Pero hay situaciones en las que no quieres que ciertas personas arranquen ciertos sistemas operativos. Para estas situaciones se puede hacer que GRUB solicite un usuario y contraseña al darle al Intro, en lugar de arrancar el sistema operativo. Y eso es lo que mi profesor explicó mal (entre otras muchas cosas) y lo que vamos a aprender hoy.
Como hemos dicho, GRUB usa como base los archivos de configuración de la carpeta /etc/grub.d/
. Si miráis en ella os encontraréis varios archivos que comienzan por un número de dos cifras (00_header, 05_debian_theme,…). El orden numérico de esos archivos determina el orden en que son añadidos al archivo /boot/grub/grub.cfg
. Si los abrís os daréis cuenta que no son más que shellscripts que van haciendo cat << EOF......EOF
todo el rato. Cuando ejecutamos sudo update-grub2
lo que ocurre es que se ejecutan todos estos scripts y el resultado (lo que haya entre el cat << EOF
y el siguiente EOF
) se coloca en el /boot/grub/grub.cfg
. Hasta aquí simple, ¿no?. Pues seguimos.
Para hacer que nos pida contraseñas al intentar arrancar algún sistema operativo desde el GRUB, lo primero que vamos a hacer es crear un nuevo shellscript que se encargue de añadir los usuarios y sus contraseñas al archivo /boot/grub/grub.cfg
. Para ello ejecutaremos sudo nano /etc/grub.d/01_password
. Se puede llamar como queramos, pero cosas malas pueden pasar si los usuarios se guardan en el archivo /boot/grub/grub.cfg
después del contenido del archivo 05_debian_theme
(o al menos eso he oido), por lo que debe empezar por un numero menor (01 al 04). El nombre después del número da igual, poned uno que reconozcais y ya está.
Dentro de este archivo añadid los siguiente:
Con eso habremos añadido un usuario llamado “frodo” que usa la contraseña “bolson”. Como podéis ver, la sintaxis usada es sencilla: password nombredelnuevousuario contraseñadelnuevousuario
. Eso es todo lo necesario para crear un usuario.
Muy bien, ya tenemos el usuario creado. Ahora hay que decirle al GRUB qué sistemas operativos puede arrancar nuestro usuario. Para ello debemos editar el archivo /etc/grub.d/10_linux
(si el sistema que queremos que pida contraseña es un linux) y /etc/grub.d/30_os-prober
(si el sistema que queremos que pida contraseña es un Windows o un MacOS). En el caso del archivo de linux, buscamos la línea que diga echo "menuentry ......blablabla"
o algo así (cambia entre versiones del GRUB) y añadimos justo despues de ${CLASS}
--users 'frodo'
. Por si me he explicado mal y no me entendéis, tiene que quedar algo así:
Como podéis ver en la foto, hay dos líneas con menuentry
. La que dice $(echo "$title" | grub_quote)
es la del linux que ha instalado el GRUB (el primer linux que hayais instalado en la máquina). La segunda (la que dice $(echo "$os" | grub_quote)
) es para el resto de linux instalados en el ordenador.
En el caso de Windows o MacOS, la línea cambia un poco:
También hay dos líneas con menuentry
este archivo. La que tiene --class windows
es la de Windows y la que tiene --class darwin
es la de MacOS.
Una vez añadido el --users 'frodo'
a la línea del sistema operativo que queramos, hacemos un sudo update-grub2
. Cuando termine, si reiniciamos y le damos al sistema operativo al que le hemos puesto --users 'frodo'
nos pedirá un usuario (frodo en este caso) y una contraseña (bolson en este caso). Si lo metemos bien arrancará el sistema operativo, y si fallamos volverá al menú del GRUB. Y con esto ya sabéis poner un usuario y contraseña a cualquier entrada de sistema operativo del GRUB.
Hasta aquí bien, pero hay un par de problemas:
- Las contraseñas están guardadas en texto plano y cualquiera que abra y lea el archivo /etc/grub.d/01_password
o el /boot/grub/grub.cfg
puede leerlas.
- Si soy el administrador es un coñazo tener que recordar la contraseña de cada sistema operativo cuando tengo que arrancarlo para arreglar algo.
Para saber como arreglar estas dos cosas, sigue leyendo.
Perfeccionando nuestro conocimiento de GRUB y sus contraseñas
Como hemos dicho, tenemod dos problemas: - Las contraseñas están en texto plano. - Un administrador del sistema debe aprenderse todas las contraseñas, lo cual es bastante dificil si son muchas o son raras.
Lo primero que vamos a solucionar es el segundo problema.
Superusuarios
El usuario frodo
que hemos creado es lo que llamaríamos un usuario común. Y al igual que en Linux en GRUB también hay superusuarios o root. Los superusuarios son usuarios que pueden acceder a todos los sistemas operativos del GRUB. Vamos a crear un superusuario anillo
, con contraseña unico
. Para ello, primero lo creamos como un usuario normal en el archivo /etc/grub.d/01_password
. Después añadimos encima de todos los password xxxxx xxxxxxx
una línea que diga set superusers="anillo"
. Por si me he vuelto a explicar de manera obtusa y no se me entiende, debería quedar así:
Después hacemos un sudo update-grub2
y ya está, no hay que hacer nada más. Si reiniciamos, podremos comprobar cómo usando el usuario anillo
y la contraseña unico
podremos arrancar cualquier sistema operativo. Podemos añadir más de un superusuario, separados por comas. Un problema menos.
Contraseñas cifradas
No podemos evitar que la gente con suficientes permisos o que tenga acceso físico al ordenador y lo arranque con un Live CD lea el archivo con las contraseñas, pero lo que sí podemos evitar es que lean las contraseñas en sí. ¿Cómo? Cifrándolas. Por suerte GRUB trae incluido un programita para cifrar contraseñas. Para cifrar una contraseña sólo necesitamos ejecutar en un terminal grub-mkpasswd-pbkdf2
. Nos pedirá dos veces la contraseña a cifrar. Cuando termine de cifrar nos soltará un tocho de texto del estilo Tu PBKDF2 es grub.pbkdf2.sha512.XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
. El tocho desde grub.pbkdf2.XXXX
hasta el final es nuestra contraseña cifrada.
Ahora vamos a cambiar la contraseña en texto plano del usuario anillo
por una contraseña cifrada. Como es muy sencillo y sé que me voy a explicar mal, aquí tenéis como debe quedar:
Como podéis ver es tan sencillo como decirle que el usuario tiene una contraseña cifrada (cambiar el password
del principio de la línea del usuario por password_pbkdf2
) y sustituir la contraseña en texto plano por la cifrada. Con esto, tras hacer un sudo update-grub2
, veréis como todo aquel que lea el archivo /etc/grub.d/01_password
o el /boot/grub/grub.cfg
sólo verá un tocho de texto incomprensible, pero el usuario anillo
seguirá funcionando con la contraseña unico
.
Y con esto habéis aprendido algo nuevo de GRUB. O eso espero. Es sorprendente la cantidad de tutoriales que explica todo esto mal (poniendo todos los usuarios como superusuario, editando directamente el archivo /boot/grub/grub.cfg
, haciendo copias de seguridad de los archivos de /etc/grub.d/
en la misma carpeta con la terminación .old
lo cual provoca entradas duplicadas en el GRUB, etc).
Sobre las fuentes de donde he sacado la información, la mayoría es experiencia propia ganada trasteando con GRUB, y lo de los usuarios lo he sacado de la documentación oficial de ubuntu, disponible aquí: https://help.ubuntu.com/community/Grub2/Passwords