Table des matières

, , , ,

Sécuriser Grub2 de manière avancée

Ce tutoriel s'adresse à des utilisateurs confirmés en utilisation de la ligne de commande et en dépannage de démarrage. Sinon, vous allez droit vers la réinstallation pure et simple !

Ce tutoriel explique comment sécuriser le menu Grub de manière avancée. Si protéger l'édition des entrées est déjà un point important, il ne faut pas oublier que n'importe qui peut démarrer un noyau en mode recovery, et obtenir une console root par la suite! Il serait donc avantageux de ne permettre l'accès à un noyau recovery qu'en possession du mot de passe.

Il faut savoir que votre ordinateur ne sera pas forcément protégé à 100% (puisqu'il reste la possibilité de démarrer sur une clé live), mais avec un mot de passe bios et le chiffrement des données sensibles, il y a de quoi retenir (ou dégoûter) un potentiel attaquant.

Ce tutoriel fait suite à celui ci : Sécuriser le démarrage d'ubuntu. Vous devez impérativement avoir effectué ce dernier, et que la manipulation fonctionne, avant de passer à la suite. J'ai testé ces manipulations en 18.04 sur Ubuntu, KDE Neon dual boot Linux Mint 19.1 et Xubuntu en legacy. L'EFI pose parfois des problèmes. Aussi, prenez toutes vos précautions.
Les manipulations qui suivent peuvent vous faire complétement perdre l'accès à votre système. Aussi, pensez à faire une sauvegarde du fichier grub.cfg grâce à cette ligne:
sudo cp -p /boot/grub/grub.cfg /boot/grub/grub.cfg.$(date --rfc-3339=date)

La sauvegarde du fichier grub.cfg sera suffixé par la date de la sauvegarde, ce qui permettra de le retrouver plus facilement en cas de multiples sauvegardes.

Voir également comment_sauver_et_restaurer_un_fichier.

Munissez vous d'un support d'installation de Ubuntu (ou de toute autre distribution permettant d'avoir une session live), et vérifiez bien que vous pouvez démarrer dessus. Une fois en session live, il suffira d'exécuter

sudo cp -p mnt/boot/grub/grub.cfg.DATE mnt/boot/grub/grub.cfg

si la racine de votre système est montée sur mnt.

Pour toutes ces raisons, ce tutoriel n'est pas adapté aux débutants en ligne de commande. Il est également possible de modifier directement le grub.cfg pour pouvoir rebooter (mais il faut savoir ce qu'on fait).

Prérequis

Normalement à ce stade vous devriez posséder un fichier 00_security_header ressemblant à celui ci:

#! /bin/sh

cat <<EOF

set superusers="toto"

password_pbkdf2 toto grub.pbkdf2.sha512.10000.891DC34A2C0492FD76FA0E2D01B37F13FB3B3FD5A57D0838C4894D895CFAE206F9A2EA5ED3C1286AF7C44A1BBF4C9D4E2AD4AE4EBD376F4674FC8ACCEF65D92D.49656B11F58E309EC930E7B0CD76F63E67840E65E50F1F23FED0EA9D668291DFB0D10608BEEEC3C9F33AB68895C2EFDD7F7CDEE1CB58FD96CF12B9A507EACCCC
set menuentry_id_option="--unrestricted \$menuentry_id_option"
EOF

Le mot de passe n'est pas identique, mais c'est normal. Ce qui compte, c'est que le script fasse son travail. En particulier, que le superusers toto soit créé et fonctionne.

Modifier le script 00_security_header

Nous allons maintenant effacer la ligne "EOF" rajouter au script les lignes suivantes:

set restricted="--users toto"
export superusers
export menuentry_id_option
export restricted
EOF

Nous utilisons une variable pour déterminer les utilisateurs autorisés à faire quelque chose (nous définirons le quelque chose plus tard) Les commandes export permettent de changer la portée des variables afin qu'elles soient valables dans les autres fichiers de configuration de Grub.

Voilà maintenant à quoi ressemble 00_security_header

#! /bin/sh

cat <<EOF

set superusers="toto"

password_pbkdf2 toto grub.pbkdf2.sha512.10000.891DC34A2C0492FD76FA0E2D01B37F13FB3B3FD5A57D0838C4894D895CFAE206F9A2EA5ED3C1286AF7C44A1BBF4C9D4E2AD4AE4EBD376F4674FC8ACCEF65D92D.49656B11F58E309EC930E7B0CD76F63E67840E65E50F1F23FED0EA9D668291DFB0D10608BEEEC3C9F33AB68895C2EFDD7F7CDEE1CB58FD96CF12B9A507EACCCC
set menuentry_id_option="--unrestricted \$menuentry_id_option"
set restricted="--users toto"
export superusers
export menuentry_id_option
export restricted
EOF

Modifier le script 10_linux

Attention, c'est une partie dangereuse

Pour restreindre les parties de Grub que nous voulons, il va falloir "verrouiller" les entrées au niveau du script 10_linux qui les génèrent.

echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" |sed "s/^/$submenu_indentation/"

C'est la ligne qui définit toutes les entrées des noyaux dans le sous menu "Options avancées".

echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$restricted 'gnulinux-$version-$type-$boot_device_id' {" |sed "s/^/$submenu_indentation/"
sudo update-grub
Pour sortir du menu "Options Avancées" sans avoir entré le mot de passe auparavant, il faut saisir le mot de passe!

En cas de dual-boot avec un autre Système type Debian

Si vous êtes en dual-boot avec un autre système fonctionnant de la même manière (avec un sous menu "Options Avancées"), les manipulations ci haut sont à faire sur le grub maître (celui qui se lance).

De plus, de manière personnelle, pour limiter les entrées répétitives, je désactive le script 30_os-prober pour tout les grub non maître:

sudo chmod -x /etc/grub.d/30_os-prober

Sinon, le problème est bien pire. Les entrées de l'OS maître se retrouvent dans le menu "Options avancées" des autres OS, et cela détruit tout nos efforts précédents.

Il reste à sécuriser le menu "Options Avancées" de l'autre OS (pour ses propres noyaux). Il faut le faire depuis le grub maître.

Modification de 30_os-prober

Le fichier 30_os-prober génère le menu grub pour les autres systèmes détectés par os-prober. Il suffit de trouver la ligne concernant le menu "Options Avancées" et de faire la même manipulation que dans la partie précédente.

echo "submenu '$gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"
echo "submenu '$gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$restricted 'osprober-gnulinux-advanced-$boot_device_id' {"
sudo update-grub

Conclusion

Vous avez désormais un menu grub somme toute assez robuste, ce qui n'empêche pas des précautions élémentaires (ne pas laisser son ordinateur portable sans surveillance par exemple).

Autres pages en rapport

Discussions en rapport

Contributeurs principaux : watts