domingo, 22 de noviembre de 2015

Recuperar la contraseña Root en sistemas RHEL y derivados

  Siempre me he preguntado qué pasaría si olvido la contraseña del usuario administrador o root en un sistema Linux. Sabemos que con el comando passwd un usuario puede cambiar su contraseña y que el usuario root puede cambiar la contraseña de los demás usuarios, sin embargo, ningún otro usuario sin privilegios administrativos puede cambiar la contraseña de root (naturalmente) por lo que si olvidamos la contraseña del único usuario administrativo, cómo la recuperamos?

 El proceso que describo a continuación funciona para sistemas RHEL y derivados (Fedora y Centos).

  Primero debemos tener acceso al menú de arranque del sistema. Al reiniciar el sistema operativo debemos detener el arranque automático presionando cualquier tecla en el menú del grub.


  Una vez que hemos seleccionado nuestro sistema operativo, procedemos a presionar la tecla 'e' para editar la entrada correspondiente.

  Luego vamos hasta la línea donde se encuetra el kernel.

  Nos posicionamos al final de la línea y agregamos el parámetro rd.break


  Luego de esto, procedemos a presionar Crtl-x para arrancar el sistema con la entrada editada. Esto ocasionará que el sistema se detenga y nos arroje un shell dentro del initramfs, antes de montar el resto del sistema.


  Dentro de este shell podemos montar el root filesystem, simplemente necesitamos ejecutar el comando

mount -o rw, remount /sysroot

  De hecho dentro de sysroot se encuentran todos los archivos del sistema, así que una vez que los hemos montado en modo lectura-escritura podemos utilizar el comando passwd y cambiar la contraseña del usuario root.

  Primero debemos cambiar al root /sysroot ejecutando el comando

chroot /sysroot

  Una vez hecho esto, podemos ejecutar el comando passwd y cambiar la contraseña del usuario root.

  El último paso consiste en hacer un relabel de los archivos del sistema linux, ya que si estamos utilizando RHEL o derivados este procedimiento habrá cambiado el contexto del archivo passwd, lo que nos dará problemas con SELinux.

  Para hacer el relabel automático en el próximo arranque, sólo necesitamos crear un archivo vacío en el directorio raíz llamado .autorelabel

touch /.autorelabel

  Listo, solamente necesitamos continuar con el proceso normal de arranque, para ello utilizamos el comando exit para salir del chroot y del ram filesystem.

Espero que les sea útil.

martes, 3 de noviembre de 2015

Cómo bootear una distro instalada en un folder (chroot)


En el post anterior explicaba como instalar una distribución Linux dentro de un folder (chroot) en otra distro sin necesidad de crear una nueva partición.

En este post voy a explicar cómo escoger cuál de los dos sistemas bootear desde el grub de Linux.

El primer paso consiste en crear un archivo dentro del chroot al que llamaremos chrootinit, la idea es que este sea el primer programa en ejecutarse después de que el kernel termine de arrancar. Normalmente el primer proceso en ejecutarse es init y se encarga de configurar y arrancar los diferentes procesos en nuestro sistema operativo, últimente la mayor parte de distros han migrado a systemd, por lo que init ahora es un link que apunta a systemd.

Como podemos observar, en el chroot tenemos lo necesario para bootear nuestro sistema operativo, el vmlinuz que es la imagen comprimida del kernel y la imagen initramfs que es el sistema de archivos que carga el kernel en la memoria ram para poder ejecutar varios procesos. Los mismos se encuentran dentro del folder boot en nuestro chroot.

El contenido del archivo chrootinit es el siguiente:

Son solamente dos líneas de código que se encargan de montar la raíz del sistema de archivos en modo escritura-lectura y luego ejecuta el comando chroot pasándole la ubicación de nuestro sistema para después ahora sí, ejecutar el proceso init que normalmente se hubiera ejecutado de primero.

Ahora solo queda crear una nueva entrada en el grub, para que éste nos dé a escoger el sistema que deseamos bootear. Para eso necesitamos pasarle la ubicación del kernel, el initramfs y nuestro script chrootinit.

Para lograr esto tuve que copiar varias cosas de una de las entradas del grub.

Si antes de arrancar el sistema operativo que tenemos instalado presionamos la tecla 'e' podemos ver los parámetros que se le pasan al bootloader en dicha entrada:


Esto es una característica bastante útil del grub, ya que nos permite editar la configuración de las diferentes entradas directamente y probar los cambios sin hacerlos permanentes.

Después de que obtuve los resultados deseados simplemente ingresé la información en /etc/grub.d/40_custom

Esto lo hice dentro de Ubuntu que es el sistema que tenía instalado originalmente. Como se puede ver, dentro de los parámetros que se le pasan al kernel está nuestro script /arch/boot/chrootinit que será lo primero que se ejecutará en el espacio de usuario.

Ahora es sólo cuestión de correr update-grub y reiniciar el sistema



Y después de escoger 'Arch Linux chroot' ya podemos loguearnos al sistema:

Es importante señalar que el usuario había sido creado anteriormente dentro del chroot :)

Espero que les resulte útil la información.

Saludos