Proteger entradas de Grub2 con password | Algo de Linux

viernes, 6 de mayo de 2016

Proteger entradas de Grub2 con password

Hasta ahora trabajábamos con Debian en los centros educativos, y, por las razones que sea, alguien decidió cambiar a Ubuntu en máquinas cliente. El problema es que se nos han entregado máquinas nuevas con Xubuntu y las máquinas que ya teníamos, siguen teniendo Debian.

Como no es práctico, tanto para los usuarios como los administradores, gestionar dos sistemas diferentes, estamos preparando imágenes para migrar las máquinas cliente con Debian a Ubuntu y que todo el entorno sea uniforme para el usuario.

Con la ayuda de mi alumno de prácticas, Sergio, estoy preparando una imagen de 64 bits Xubuntu y otra de 32 bits que vamos a  usar como modelo para  lograr esa uniformidad. Ésto es algo que lleva trabajo y tiempo porque ya teníamos implantadas muchas mejoras que hay que testear en Ubuntu.

La cuestión es que en nuestros sistemas Debian teníamos una partición de autorestauración con clonezilla que nos permitía restaurar o hacer un backup del sistema fácilmente desde entradas de grub protegidas con contraseña, y, al tratar de implantar el sistema en Xubuntu, nos hemos dado cuenta de que hay algunas variaciones a la hora de proteger entradas de grub2 con password. Y esas variaciones vienen motivadas porque Debian Wheezy utilizaba la versión 1.99 de grub2 y tanto Ubuntu 14.04 com Debian Jessie usan la versión 2.xx de grub2.

Así que vamos a ver cómo hemos realizado los cambios para proteger las entradas de grub2 en los nuevos equipos con Xubuntu.

Lo primero que hay que decir es que, en principio, nos interesa que el usuario pueda seleccionar tan sólo la opción de iniciar ubuntu sin tener que introducir una password de grub2. El resto de entradas: opciones avanzadas, crear un backup del sistema, restaurar un backup del sistema, ... deben requerir que el usuario introduzca una password.

Primero.- Debemos crear contraseñas encriptadas para aquellos usuarios que deban tener acceso. Para ello, utilizaremos grub-mkpasswd-pbkdf2. Por ejemplo:
# grub-mkpasswd-pbkdf2

Introduzca la contraseña: 
Reintroduzca la contraseña: 
El hash PBKDF2 de su contraseña es grub.pbkdf2.sha512.10000.F3BBCA221181E11CFFB0F88917D1D39CB3BE23C88559B15AF31C7DC1C7197D7276B79D2985538AE046A510AFC58EDFB554C23FF72102F74B79BB020B73EB6AD7.104336C8A35ED8D53BBCBE2A27784281D2D13843CD408B1CF6405308F6DCB3DD4271F9CB9909178AE25F82D834EDA59DFB2BBC60CB37ED1EB245C3DF9D28ECEB
Como podéis ver, la herramienta nos pide que introduzcamos dos veces la contraseña para asegurar que es correcta y crea el hash.

Segundo.- En principio, podríamos poner directamente la información de usuarios en el fichero /etc/grub.d/00_header. No obstante, por cuestiones de organización y claridad, vamos a crear un fichero /etc/grub.d/01_password en el que definiremos expresamente la información relativa a usuarios de grub. Veamos un ejemplo:
# cat /etc/grub.d/01_password

#!/bin/sh
cat << EOF
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.9D8920FDD6AEBB0CBDA90902E4C5B33117713DF9F56B34E4C8138B7B69723121E8BE423A43244238C40C8D32EE1B05E1C05FCE1B0CAC9D7F8EB63B8052DF6C5E.72A8ED09C9C6CCD396090A10305F1A395D6BFAC227C1196F54B59067295AA29B017C33954138F246426C2C099E2C3974B26A79846DE480CC3108C3CB2E97A540
EOF
En este fichero de ejemplo, estamos definiendo tan sólo un usuario "root", pero podríamos definir también un usuario "clonezilla" que utilizáramos única y exclusivamente en las entradas de clonezilla.
Pero, además, estamos diciendo que el superusuario se llama "root".
# cat /etc/grub.d/01_password

#!/bin/sh
cat << EOF
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.9D8920FDD6AEBB0CBDA90902E4C5B33117713DF9F56B34E4C8138B7B69723121E8BE423A43244238C40C8D32EE1B05E1C05FCE1B0CAC9D7F8EB63B8052DF6C5E.72A8ED09C9C6CCD396090A10305F1A395D6BFAC227C1196F54B59067295AA29B017C33954138F246426C2C099E2C3974B26A79846DE480CC3108C3CB2E97A540
password_pbkdf2 clonezilla grub.pbkdf2.sha512.10000.521C3D1C22CF1592862FD809FEFC0124FD4331303EE8B735679AE53440B7E0C0FF2879DE6E8C176CAB57C1B55345D65AC6D280A32A0280BDEF1EE85D59A15B2C.CFE0974C2BFF35E8E31229AA286ED76B6F0E0E950AA1B9F83AD7597AB68E786817F9C080A29D9402449682AED43719BD7A262D862F6710CED5839E2E2F181E85
EOF
Es importante tener en cuenta que los usuarios definidos como superusuarios podrán:
  • Iniciar cualquier entrada de grub2.
  • Editar items en el menú  de grub2 durante el boot.
  • Usar la línea de comandos de grub2.
Además, podríamos definir todos los usuarios que quisiéramos con el fin de permitir realizar determinadas acciones a dichos usuarios.
Tercero.- Damos permisos de ejecución al fichero /etc/grub.d/01_password:
# chmod +x /etc/grub.d/01_password
Cuarto.- Editamos el archivo /etc/grub.d/10_linux y buscamos las siguientes líneas:
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
Y las modificamos para que queden de la siguiente manera:
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
Si os dáis cuenta, el cambio que hemos realizado ha sido añadir la opción "--unrestricted" para que la entrada que arranca Ubuntu pueda ser utilizada por cualquier usuario sin tener que introducir username y password.

Cuarto.- Ejecutamos el comando update-grub2 para que se regenere el fichero de configuración /boot/grub/grub.cfg:
# update-grub2
De este modo, todas las entradas estarían restringidas, salvo la primera que permite arrancar el sistema operativo. Esto es interesante cuando tenemos entradas de grub que permiten arrancar clonezilla, realizar un backup del sistema, restaurarlo o iniciar una herramienta como udpcast, operaciones reservadas para el administrador.

Las entradas que inician clonezilla y udpcast, las hemos colocado en el archivo /etc/grub.d/40_custom.
menuentry "Arrancar Clonezilla" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts=\"\" ocs_live_batch=\"no\" locales=\"\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 toram=filesystem.squashfs
   initrd /live-hd/initrd.img
}

menuentry "Restaurar sistema con Clonezilla (/dev/sda1, /dev/sda2) sin modificar la partición home (/dev/sda6)" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-restore\" ocs_live_extra_param=\" -e1 auto -e2 -c -r -j2 -k -p reboot restoreparts backup-miniportatil-sin-home sda1 sda2\" keyboard-layouts=\"NONE\" ocs_live_batch=\"yes\" locales=\"es_ES.UTF-8\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 
   initrd /live-hd/initrd.img
}

menuentry "Realizar backup del sistema con Clonezilla (/dev/sda1, /dev/sda2) excluyendo la partición home (/dev/sda6)" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-restore\" ocs_live_extra_param=\" -q2 -c -j2 -z1 -i 10000000 -p reboot saveparts backup-miniportatil-sin-home sda1 sda2\" keyboard-layouts=\"NONE\" ocs_live_batch=\"yes\" locales=\"es_ES.UTF-8\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 
   initrd /live-hd/initrd.img
}

menuentry "Udpcast" {
    set root=(hd0,1)
    linux /udpcast/linux
    initrd /udpcast/initrd
} 
Si ahora quisiéramos que las entradas de clonezilla pudieran ser utilizadas tanto por el usuario root como por el usuario clonezilla, les añadiríamos la siguiente opción: "--users clonezilla":
menuentry "Arrancar Clonezilla" --users "clonezilla" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts=\"\" ocs_live_batch=\"no\" locales=\"\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 toram=filesystem.squashfs
   initrd /live-hd/initrd.img
}

menuentry "Restaurar sistema con Clonezilla (/dev/sda1, /dev/sda2) sin modificar la partición home (/dev/sda6)" --users "clonezilla" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-restore\" ocs_live_extra_param=\" -e1 auto -e2 -c -r -j2 -k -p reboot restoreparts backup-miniportatil-sin-home sda1 sda2\" keyboard-layouts=\"NONE\" ocs_live_batch=\"yes\" locales=\"es_ES.UTF-8\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 
   initrd /live-hd/initrd.img
}

menuentry "Realizar backup del sistema con Clonezilla (/dev/sda1, /dev/sda2) excluyendo la partición home (/dev/sda6)" --users "clonezilla" {
   set root=(hd0,3)
   linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-restore\" ocs_live_extra_param=\" -q2 -c -j2 -z1 -i 10000000 -p reboot saveparts backup-miniportatil-sin-home sda1 sda2\" keyboard-layouts=\"NONE\" ocs_live_batch=\"yes\" locales=\"es_ES.UTF-8\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda3 
   initrd /live-hd/initrd.img
}

menuentry "Udpcast" {
    set root=(hd0,1)
    linux /udpcast/linux
    initrd /udpcast/initrd
} 
Publicado por primera vez en http://enavas.blogspot.com.es

No hay comentarios: