Securizando GRUB

CiberSeguridad 29 de sep. de 2023

En un artículo previo, hemos visto que si tenemos acceso físico a un equipo podemos conseguir acceso a él como superusuario, mediante GRUB.

Acceso root desde GRUB
Si por alguna causa se necesita acceder a un equipo como superusuario, no es necesario conocer la clave del usuario root, siempre y cuando tengamos acceso físico al equipo. Para ello tan solo hay que proceder al reinicio del equipo y esperar a que aparezca la pantalla de GRUB. En

En este artículo vamos a explicar como securizar GRUB, para evitar que ningún usuario pueda modificarlo.

Protección del Boot de GRUB

Una de las primeras tareas necesarias es fijar 'roles' que puedan gestionar GRUB.
Se pueden crear diferentes roles y grupos de usuarios con diferentes permisos para ello.

Para no extender el artículo, unicamente vamos a usar uno de los roles existentes 'superusers' para definir un usuario que pueda gestionar GRUB.

Todas las tareas para editar, proteger y configurar GRUB las realizaremos mediante el usuario 'root', que es el único con permisos para ello.

Las versiones actuales de GRUB (Grub versión 2.x) usan claves con cifrado pbkdf2 y ya no soportan las de cifrado md5 que se usaba en las versiones 1.x
Para poder generar una clave con este cifrado, abriremos un terminal y con el usuario 'root' escribimos el siguiente comando:

grub-mkpasswd-pbkdf2

Nos pide una contraseña y que la repitamos, generando un hash PBKDF2:

Hash pbkdf2 para usar en Grub

Debemos copiar ese hash (portapapeles), pues lo vamos a usar posteriormente.

Ahora debemos de editar el fichero /etc/grub.d/40_custom e incluir al final del mismo las siguientes líneas:

set superusers="adminboot"
password_pbkdf2 adminboot   grub.pbkdf2.sha512.10000.D99846E8A873D60951125EE4553827CFC29DBB6C833080F786D1ED28300AEA632B30DD523CA30D2E4FD3ADB1CDC4534F41F7C33A0A7B567B64745029DB73A1EA.56985B360A26D5B9715FA2243571317C4C3A489C492E1950CEFB34261A4A0CE188D5BD81E4DE947886B4F634CF2E3733175006A646812A3F0E63A0BDD1DC7112
Definiendo usuario 'adminboot' con privilegios en Grub

El fichero /etc/grub.d/40_custom debe quedar tal y como te muestro en la siguiente captura de pantalla:

Indicamos que 'adminboot' pertenece al grupo de 'superusers' y en la siguiente linea indicamos que su clave es de tipo pbkdf2, junto el hash que hemos copiado previamente.

Para que eso sea efectivo hay que regenerar el fichero de configuración de GRUB, para ello usaremos el siguiente comando:

update-grub
Actualizar configuración GRUB
Salida de update-grub

Ahora si reiniciamos, vemos que es necesario para que continúe la carga de GRUB introducir el usuario (adminboot) y la contraseña que hayamos definido para continuar el arranque:

Debemos escribir el usuario (adminboot) y su clave para poder iniciar

Esta configuración protege tanto la edición de cualquier parámetro de GRUB, como el arranque.
Si lo pensamos detenidamente puede ser un problema, pues si se trata de un servidor y este se reinicia por cualquier causa, hay que estar físicamente presente delante de él para introducir tanto el usuario como la contraseña para que se pueda iniciar.

Vamos a mejorar esto, para que el equipo pueda iniciar con el GRUB protegido.
No se podrá editar, ni incluir ninguna opción desde el menú de GRUB, pero si permitiremos que se pueda iniciar automaticamente sin necesidad de introducir el superusuario/clave tras un reinicio.

Bloquear la edición de GRUB

Para proteger la edición de las opciones de GRUB en el inicio, pero permitir que pueda iniciar de modo normal, vamos a realizar lo que se denomina 'liberación del boot', para ello editaremos el fichero /etc/grub.d/10_linux.

El fichero /etc/grub.d/10_linux es un fichero grande con más de 400 líneas, nos desplazaremos por él con calma hasta localizar las líneas indicadas.

Debemos de buscar en el fichero las 2 líneas que tienen las cadenas:

echo "menuentry '$(echo "$title" ...

echo "menuentry '$(echo "$os"    ...

Nos situaremos detrás del parámetro ${CLASS} de ambas líneas e incluimos el parámetro:

--unrestricted
Incluir después de ${CLASS}

El fichero tras la edición debería de quedar así:

2 inclusiones del parámetro --unrestricted

Grabamos el fichero y regeneramos de nuevo el fichero GRUB y reiniciamos:

update-grub

reboot
Regenerar GRUB

Esperamos al reinicio y a la pantalla de GRUB.

Podemos comprobar que GRUB arranca normal sin necesidad de usuario/clave.

Pero si intentamos entrar al menu edición, al menú de comandos o incluso a las opciones avanzadas (otros Kernels y modos de rescate) es necesario indicar un usuario/contraseña en GRUB para acceder.

Hemos dejado correctamente protegido la edición de Grub, pero permitiendo un boot del sistema normal.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux