Grub2 , protection par mots de passe

Pour ceux qui comme moi ce sont cassée les dents (ou plutôt couper l’accès ) dessus ce problème, car grub2
fonctionne avec une keymap us , donc pas de éèà… , que bien sur pas malchance on en a insérais dans sont mots de passe, du cou boot sur live pour modifier /boot/grub/grub.cfg.

j’ai donc fait un script qui facilite la mise en place du compte superuser de grub2 , et nous évite ces petit tracas.

malheureusement, grub2 ne gère les mots de passes que aux premier niveaux de l’arborescence du menu.
ce qui implique que l’ajout de --unrestricted a un submenu et récursif !!
il et donc plus judicieux de demander le mot de passe pour tous les sous menus.

Ont limitent , les menus de “setup uefi” , “recovery mode” ,“c”,“e” ainsi que tous les submenu.
mais aucun mot de passe n’est demandé pour lancer windows ou le dernier noyaux debian.
A la mise a jour grub2 la conf devrait rester , mais je n’est pas encore testé.
bien sur le script et a lancer en root.

passwordgrub2.sh

#!/bin/sh
PTNlogin='^[a-zA-Z]*$'
##Passage en keymap us pour le password comme sa quelque soit votre clavier le mot de passe correspond bien ##au touche frappée.ce qui, ce qui évite de ce prendre la tête pour le clavier avec le mot de passe grub.
#apt-get install console-data
layout1="$(cat < /etc/default/keyboard | grep "XKBLAYOUT" | awk -F "\"" '{print $2}' | awk -F "," '{print $1}')"
setxkbmap us
loadkeys us
clear
gettext 'keymap is in qwerty us in grub menu.
    - Only letters or numbers.
    - 4 characters minimum.
Enter login to the superuser of grub2 :'
while (true); do
    read logingrub
    if [ "$(expr "$logingrub" : "$PTNlogin")" -gt 4  ];then 
        break
    else
        clear
gettext 'keymap is in qwerty us in grub menu.
    - Only letters or numbers.
    - 4 characters minimum.
Enter login to the superuser of grub2 :'
    fi    
done
echo > /tmp/passgrub
while [ "$(awk '{print $NF}' /tmp/passgrub | grep -c grub.)" -eq 0 ];do
grub-mkpasswd-pbkdf2 | tee /tmp/passgrub
done    
passwordgrub=$(awk '{print $NF}' /tmp/passgrub | grep grub.)
##on rebascule sur la keymap system
setxkbmap "$layout1"
loadkeys "$layout1"
vide=""
cat << EOF > /etc/grub.d/99_password
#!/bin/sh
## ce script doit être lancé en dernier !!!
## on restreint uniquement les menus de "setup uefi" , " recovery mode "
## ainsi que tous les submenu.
## seul les menuentry et submenu de premier niveaux prennent en compte les paramètres d’accès utilisateurs.
## ce qui implique que l'ajout de --unrestricted a un submenu et récursif  !!
cat << ${vide}EOF
set superusers="$logingrub"
password_pbkdf2 $logingrub $passwordgrub
${vide}EOF
confunrestricted() {
        ## fonction lancer en tache de fond par la commande
        ## confunrestricted &
        ## elle attend la fin de l’exécution de tous les scripts  update grub 
        ## puis modifie le fichier /boot/grub/grub.cfg pour y ajouter le droits a touts le monde
        cd /etc/grub.d/
        for file in *
        do
        if [ "\$(echo "\$file" | grep -E -c "[0-9][0-9]_")" -eq 1 ];then
            if [ -z "\$processupdategrub" ] ; then
                processupdategrub=\$file
            else
                processupdategrub=\$processupdategrub","\$file
            fi
        fi
        done
        while [ "\$(ps -C "\$processupdategrub" -o pid= | wc -l)" -gt 2 ]
        do
            sleep 0.2
        done
        cp /boot/grub/grub.cfg /tmp/grub.cfg.new
        while read linecfg 
        do
            if [ "\$(echo "\$linecfg" | grep -E "menuentry " | grep -v "uefi-firmware" | grep -c -v "recovery mode" )" -eq 1 ];then
                line2=\$(echo "\$linecfg" | sed -e 's/ {/ --unrestricted { /g')
                sed -i "s|\$linecfg|\$line2|" /boot/grub/grub.cfg
            fi
        done < /tmp/grub.cfg.new
        rm /tmp/grub.cfg.new
    }
confunrestricted &
EOF
chmod 755 /etc/grub.d/99_password
update-grub2
1 J'aime

Merci !

Sinon, hormis tes erreurs d’orthographe - essaye de te relire, avant de poster ou d’utiliser le correcteur embarqué à ton navigateur web -, pourquoi ne pas faire un script qui ne fasse appel qu’au shell - et non pas au Bash.
Je suis d’avis, que ce n’est pas plus compliqué - l’avantage est qu’il sera aisément utilisable - surtout pour un petit script aussi sympa, dans le fond.

j’ai corrigé quelque fautes et basculé le script en /bin/sh

Passes ton code à la moulinette shellcheck.net ; d’autant que sur Debian, tu as normalement le paquet existant … Ne prends pas peur, c’est normal :wink:

https://packages.debian.org/search?keywords=shellcheck

Cool ce petit tutorial mais il faut essayer d’améliorer la rédaction un peu! Merci

j’ai corrigée le script en fonction de shellcheck merci pour l’information je connaissait pas l’outil .
plus d’erreur dans

1 J'aime