Mi GRUB protegido

Una característica de GRUB (y otros cargadores de arranque), es que nos proporcionan una línea de comandos o un editor para poder ajustar los parámetros que le pasamos al kernel. Esto es muy útil en ciertos casos, como por ejemplo, tener la necesidad de arrancar en un modo diferente (en lugar de gráfico, en modo multiusario), desactivar alguna opción de algún controlador, etc.

Una de las cosas que nos permite hacer es arrancar un intérprete de órdenes (shell), sin necesidad de realizar un login, opción que utilizamos en el artículo anterior para restablecer la contraseña del usuario root, pero que también podemos utilizar para recuperar un sistema dañado.

Esto está muy bien y es muy útil, hasta que compartimos la máquina con otras personas, nos dejamos el portátil en casa de alguien, nos levantamos del puesto de trabajo un momento, etc. En ese caso, podríamos tener problemas, pues el arranque que se realiza se hace con permisos de usuario root.

Entonces, ¿por qué no viene protegido el gestor de arranque? En la mayor parte de los casos, las personas que tienen acceso físico al equipo, tienen la posibilidad de acceder al mismo con múltiples mecanismos, con lo que añadir una protección aquí, de entrada, solo complica más la recuperación del sistema. En realidad, donde se hace realmente necesario proteger el arranque es en equipos compartidos, normalmente en lugares de trabajo, donde debemos establecer muy bien los permisos y roles de las diferentes personas que utilizarán el mismo.

Cómo no podía ser de otra manera, nuestro GRUB nos proporciona mecanismos para proteger esta edición. El mecanismo por defecto es muy restrictivo: No podemos ejecutar la entrada y tampoco editarla (aunque se puede suavizar esta restricción). Pero… ¿cómo podemos restringir tanto la ejecución como la edición de entradas en el GRUB? Disponemos de varias opciones. Empezaré por la más  simple de todas.

Lo primero que debemos hacer es editar el archivo de configuración de GRUB, /boot/grub/grub.cfg. Al principio del archivo, debemos indicar qué usuarios dispondrán de permisos para ejecutar y editar las entradas de GRUB. Esto se hace estableciendo una lista de usuarios, separadas por comas, espacios o puntos y comas, de la siguiente manera:

set supersusers=”root,mary”

Ya tenemos los usuarios que podrán ejecutar y editar las entradas del menú. Ahora hay que indicar cuál será la clave para estos usuarios. Hay que tener en cuenta que no es la clave de sistema: El sistema no ha arrancado. Es una clave específica para GRUB. Además, aparte del usuario root, podemos establecer los que queramos, sin necesidad de que coincidan con los  usuarios reales del sistema. Añadimos también una entrada por cada  usuario, con su clave, así como usuarios que no queremos que ejecuten  todas las entradas, pero sí las que especifiquemos:

password root clave_root
password mary clave_mary
password usuario clave_usuario

A partir de aquí, sólo los usuarios root y mary podrán ejecutar todas las opciones del menú de GRUB. Sus claves serán clave_root y clave_mary, respectivamente. La última línea es para establecer una clave a usuario, que utilizaremos después.

Pero… ¿No hay algo “raro”? Pues sí, las claves están especificadas en texto plano . Esto, en un entorno de trabajo, no es recomendable, así que vamos a generar un hash para ocultar nuestra clave. Para ello debemos utilizar un comando que nos proporciona GRUB. Ejecutamos, en la línea de órdenes:

grub-mkpasswd-pbkdf2

Nos solicitará que introduzcamos una contraseña y, después, que la confirmemos, devolviendo algo similar a esto:

$ grub-mkpasswd-pbkdf2

Introduzca la contraseña:

Reintroduzca la contraseña:

El hash PBKDF2 de su contraseña es

grub.pbkdf2.sha512.10000.B2B745D9862E47F95CA64C5DEB31CE0443E0381
22D2775F4294A7C5F15F79D5E1CC4497A9BBBEA080F4847433291385AFADD
253564037E79F999877CCDBEDB58.1951C740709F4EB38228E2049F180607F6
E36E6F5E0DA3F2552419C0B934DE6E573FFCC0B43D1C2B3D0D69644224259
F451178D7CFE99DFF38FFF5356E7978CA

Ahora, en lugar de poner la clave en texto plano en el archivo /boot/grub/grub.cfg, debemos introducir el hash devuelto e indicar que la clave no está en texto plano:

password_pbkdf2 root grub.pbkdf2.sha512.10000.B2B745D986…

Todas las entradas del menú de GRUB están protegidas. Aunque, en ciertas ocasiones, puede que nos interese habilitar la ejecución a algún usuario en particular. Para ello, en la entrada a la que queramos habilitar la ejecución a algún usuario que no esté en la lista superusers, añadimos lo siguiente:

menuentry ‘Arch Linux, con Linux core repo kernel’ –class arch –class gnu-linux –class gnu
–class os $menuentry_id_option ‘gnulinux-core repo kernel-true-2288d60f-b933-4c45-98f7-
536130a19caf’ –users usuario { … }

En cualquier caso, aunque todos los usuarios puedan ejecutar esta entrada, es decir, no se pide clave para ejecutar, solo los usuarios establecidos en la lista superusers podrán editarla. Esto es igual para el caso anterior, solo los usuarios indicados en –users pueden ejecutar la entrada, pero solo los superusers pueden, además, editarla. Con estas opciones, parece que ya sí es práctico.

Desgraciadamente, el comando grub-mkconfig no soporta añadir automáticamente la restricción de usuarios por entrada. Así que podemos hacer lo siguiente:
Editamos el archivo /etc/grub.d/00_header y le añadimos la lista de usuarios y claves:
cat << EOF
set superusers=”root”
password_pbkdf2 root <clave>
password_pbkdf2 usuario1 <clave2>
password_pbkdf2 usuario2 <clave2>

EOF
Con esto, tendríamos todas las entradas generadas por GRUB protegidas. Las entradas en las que deseemos especificar a un grupo de usuarios o bien, que no estén restringidas, debemos añadirlas manualmente. Para ello utilizaremos el archivo /etc/grub.d/40_custom, donde debemos añadir la entrada correspondiente, por ejemplo:
menuentry ‘Arch Linux, with Linux core repo kernel unrestricted’ –class arch –class gnu-
linux –class gnu –class os $menuentry_id_option ‘gnulinux-core repo kernel-true-2288d60f-
b933-4c45-98f7-536130a19caf’ –unrestricted {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
set root=’hd0,msdos1′
if [ x$feature_platform_search_hint = xy ]; then
search –no-floppy –fs-uuid –set=root –hint-bios=hd0,msdos1 –hintm efi=hd0,msdos1–hint-baremetal=ahci0,msdos1 2288d60f-b933-4c45-98f7-536130a19caf
else
search –no-floppy –fs-uuid –set=root 2288d60f-b933-4c45-98f7-536130a19caf
fi
echo ‘Cargando Linux core repo kernel…’
linux /boot/vmlinuz-linux root=UUID=2288d60f-b933-4c45-98f7-536130a19caf rw clocksource=tsc quiet splash
echo ‘Cargando imagen de memoria inicial…’
initrd /boot/initramfs-linux.img
}
Al ejecutar grub-mkconfig, nos generará por defecto las entradas que ya teníamos y estarán protegidas (solo los usuarios  especificados en la lista superusers podrán editarlas y ejecutarlas). Además, generará una entrada que podrá ser ejecutada sin necesidad de introducir claves.
                                  ¡Espero que os haya gustado! 😉

 

 

 

@MMontesDiaz

Fuentes: