manual básico de GRUB2 (desentrañando al monstruo)

fundamentos GNU/Linux fun-gnu


grubGRUB en su versión 2, es hoy en día el gestor de arranque más extendido en el mundo GNU/Linux. En los años 90 fue LILO (LInux LOader), después GRUB (en su versión 1) Grand Unified Boot Loader. Ahora cuando hablemos de GRUB nos referiremos siempre a la versión 2 (para referirse a GRUB 1 se suele emplear el término “GRUB Legacy”, antiguo GRUB).

GRUB es un cargador de arranque (bootloader), esto es, el firmware del ordenador lee el cargador de arranque desde el disco duro y lo ejecuta, lo que nos permite elegir qué sistema operativo de los instalados en el máquina arrancar. GRUB se encarga de cargar el kernel linux en memoria y lo empieza a ejecutar. A partir de ahí, será ya el núcleo de linux quien tome el control del equipo.

GRUB es capaz de funcionar con firmware BIOS y EFI (UEFI). En este pequeño manual básico de GRUB nos vamos a limitar a explicar el caso más típico:

GRUB2 —> firmware BIOS —> instalado en el MBR (Master Boot Record). Tabla de particiones de disco MBR.

No nos ocuparemos aquí por lo tanto de instalaciones o configuraciones bajo UEFI, ni del caso de particiones GPT (tabla de particiones GUID).

Todas las grandes distros linux tendrán un paquete llamado grub o grub2. En ARCH y DEBIAN se llama grub, en OpenSuse se llama grub2. Lógicamente una instalación por defecto de la distro instalará GRUB, pero si queremos instalar manualmente, ya se sabe: sudo pacman -S grub (ARCH), sudo apt install grub (DEBIAN, UBUNTU), sudo zypper in grub2 (OPENSUSE), etc.

GRUB se instala en el directorio /boot/grub/ donde podemos encontrar el principal archivo de GRUB, el famoso grub.cfg

Es importante saber, que será ese archivo el que se lea desde el MBR cuando cargue GRUB, y serán las entradas que contenga las que se puedan arrancar. Pero grub.cfg no se debe de editar directamente, pues es un archivo que se crea de manera dinámica leyendo otros archivos de configuración cuando se genera.

Cuando tenemos un único sistema operativo en el ordenador es todo muy sencillo, pues es ese O.S. quien gobierna GRUB y lee su propio /boot/grub/grub.cfg y ya está. Pero, como suele suceder en linuxeros avanzados que coinstalan varias distros linux en el mismo equipo, la cuestión puede ser más complicada. Yo tengo un equipo que puede arrancar 7 sistemas operativos distintos, luego ¿cuál gobierna GRUB?, ¿a cuál apunta el MBR?, ¿qué grub.cfg de los 7 O.S. lee GRUB cuando arranca?. Es a esto básicamente a lo que quiero responder aquí.

La primera respuesta es que será al última distro linux instalada (que instale GRUB) la que “colonizará” el MBR para arrancar su propio grub.cfg. Y por tanto, si esa instalación de GRUB ha detectado otros sistema operativos anteriores, los incluirá en su grub.cfg y podrás arrancarlos. Si no es así, no podrás (en principio).

Para la mayoría de usuarios GRUB es un poco complicado, pues se suele estar acostumbrado a tener una sola distro en la máquina, o como mucho, una distro Linux más un windows. Y como todo funciona, pues nadie se plantea mirar las tripas de GRUB. A mí me pasaba igual, pero ese portátil que tengo con 7 distros (5 fijas y un par de ellas que voy re-instalando casi constantemente), me llevaron a investigar un poco el intrincado GRUB.

Esto es lo básico.

Cuando antes hemos hablado de instalar el paquete grub, nos referimos simplemente a tener GRUB disponible en el sistema, pero para poder usarlo hay que instalarlo en el MBR de manera explícita, así:

sudo grub-install /dev/sda

esto instalará grub en el sector de arranque del disco duro principal, normalmente es sda, si es sdb, o sdc, pues el que sea.

Con esto, lo que he conseguido es que sea la distro desde la que lo he hecho la que controle GRUB.

Podemos ver ahora el siguiente archivo: /etc/default/grub en el que podemos establecer cosas como el tiempo de espera al arranque

GRUB_TIMEOUT=”3″

en este caso espera 3 segundos, o

GRUB_THEME=”/boot/grub/themes/Archxion/theme.txt”

donde le damos la ruta de un tema para embellecer nuestro GRUB. En este caso del famoso tema Archxion, que se puede instalar desde AUR en ARCH.

Bien, ya está instalado GRUB, pero ¿cómo puedo actualizarlo si por ejemplo he instalado otra distro linux o por ejemplo deseo añadir una entrada personalizada como podría ser un ANDROID con el que jugar en mi PC?. Pues veamos.

Aunque ya hemos visto que GRUB tiene su propio directorio en /boot/ y que además hay un archivo /etc/default/grub donde está la configuración básica, el núcleo verdadero de GRUB se encuentra en otro sitio:

/etc/grub.d/

aquí están los scripts de configuración de GRUB, los que se pueden editar y que crearán el /boot/grub/grub.cfg que será el que se lea al arranque. Estos scripts son algo complejos, sólo voy a comentar dos de ellos:

/etc/grub.d/30_os-prober

este es un script muy importante que es el que se encarga de buscar otros sistemas operativos cuando se configura GRUB. Si todo va bien, los detecta, y les crea una entrada en nuestro grub.cfg para poderlos elegir al arranque.

/etc/grub.d/40_custom

en este archivo podemos incluir entradas personalizadas en GRUB, como por ejemplo arrancar una partición con ANDROID como podemos ver en esta entrada: instalar ANDROID en PC y arrancar desde GRUB2

Bien, pues para terminar queda lo más importante. Una vez configurado nuestro /etc/default/grub (donde por ejemplo podemos personalizar el tema de GRUB) y una vez añadidas entradas en nuestro /etc/grub.d/40_custom (si lo deseamos) ya podemos generar nuestro nuevo /boot/grub/grub.cfg para que incluya todos los cambios. Así:

sudo grub-mkconfig -o /boot/grub/grub.cfg

veremos que grub-mkconfig lo que hace es generar un nuevo grub.cfg que contenga todas las modificaciones que hayamos hecho, así como detectar los demás sistemas operativos que contenga la máquina y que sean arrancables desde GRUB.

En alguna distros también funciona el comando:

sudo update-grub

que tan sólo es la llamada a un script que lo que realmente hace es sudo grub-mkconfig -o /boot/grub/grub.cfg

Pues esto es todo. Espero haberte ayudado un poco a entender el intrincado mundo de GRUB2.

Nota.- para profundizar más en GRUB nada mejor que la excelente wiki de ARCH:
https://wiki.archlinux.org/index.php/GRUB_%28Espa%C3%B1ol%29

grub.d

hackear un pc con Linux

hackearUso la palabra “hackear” de manera jocosa. Tan sólo pretendo hacer una pequeña reflexión sobre la importancia de la seguridad física de una máquina.

Quiero entrar en un ordenador con linux que tengo delante de mí, pero no tengo usurario, ni contraseña, y mucho menos conozco la contraseña de root.

No problemo (Terminator T-800 dixit):

Supongamos que el equipo está apagado (si no es así, apretar el botón de on/off durante 5 segundos solucionará el problema).

1. Arrancamos y esperamos que aparezca el menú de GRUB (ahora ya casi siempre será GRUB2).

2. En la entrada que queramos arrancar, normalmente será la entrada marcada por defecto, pulsamos la tecla “e”, de esa manera entramos en el modo de edición de GRUB.

3. buscamos la línea de arranque del kernel. Suele ser la penúltima y comienza por “linux /boot/…”

4. en esa línea hay que hacer dos cosas, la primera ver si arranca el kernel en modo “rw” (lectura/escritura), si está así no hay problema. Si vemos que está en modo “ro”, sólo lectura (o no aparece nada) lo cambiamos a “rw”.

5. y lo segundo y más importante, al final de esa línea añadimos “init=/bin/sh” (sin las comilla, claro). Hay que tener en cuenta, que el teclado por defecto es el qwerty americano, por lo que por ejemplo en mi caso, que tengo de qwerty de España (es_ES), el signo “=” está en mi tecla “¡” (arriba a la derecha) y el signo “/” sale pulsando mi tecla “-” (guión), abajo a la derecha. Agregando este parámetro init, lo que hago es decirle al kernel que no arranque la imagen por defecto, sino un shell (que normalmente será bash, por lo que /bin/sh será un enlace simbólico a /bin/bash).

6. ahora tan sólo tenemos que presionar Control+X o F10 para arrancar con nuestros cambios.
y… eureka !!! ya estamos en una shell como ROOT y somos los putos amos 😉

Lo más lógico es que la partición /home no esté montada, por lo que en principio no vemos los archivos de usuarios, no problemo:

mount /dev/sda2 /home (suponiendo que sda2 sea la partición de la “home”) y ya tenemos acceso a todos lo archivos de todos los usuarios.

Puedo comenzar por cambiar la contraseña de root, así:

passwd

te pide dos veces la nueva contraseña y ya tienes la contraseña de root.

Lógicamente puedes crear cuentas, asignar contraseña, etc, etc, etc, todo lo que puede hacer root (o sea TODO).

Para salir de este shell escribe “exit”. Si la máquina no se apaga físicamente, pulsa 5 segundos el botón de apagado. Ahora ya puedes arrancar normalmente, y ya podrás entrar como root, o como un usuario de los que has creado, y con el famoso “su” podrás hacerte root, pues tú mismo cambiaste su contraseña que ahora es tuya 🙂

Esto nos debe hacer reflexionar sobre la seguridad “física” de una máquina. Un sistema linux bien actualizado y configurado, y con una buena contraseña de root, no es fácilmente hackeable. Pero si tenemos acceso físico a la máquina, ya se ve lo fácil que es invadirla y controlarla. Se puede poner una contraseña para impedir la edición del GRUB, pero siempre se podrá hacer lo mismo arrancando desde una unidad externa (por ejemplo un USB con una ISO booteable). Se puede poner una contraseña en la BIOS, pero también es relativamente fácil resetear la BIOS abriendo el ordenador y accediendo a la placa. Por eso, los servidores, no deben tener teclado ni monitor, y es mejor controlarlos en remoto por accesos SSH, y siempre deben estar físicamente protegidos.

Conclusión, si te roban el ordenador y quieren acceder a tus datos, lo tendrán muy fácil, por lo que toda información crítica debe estar encriptada (por ejemplo en contenedores Truecrypt), pues como ves, ni la mejor contraseña de root defenderá tu acceso en una máquina que caiga en malas manos.