Laut Checkliste des BSI für den Grundschutz empfiehlt es sich für Grub ein Passwort zu setzen, sodass ein Angreifer das System nicht einfach direkt in eine Root-Shell booten kann. Ich zeige hier wie das funktioniert und erkläre wie man dafür sorgt, dass das System trotz fehlendem Passwort normal gebootet werden kann.
Szenario
Das Serversystem steht in einem Serverraum bei einem Kunden. Die Gefahr für einen Stromausfall ist zwar gering, aber dennoch möglich. Eine USV kann kurzzeitige Ausfälle von 10 Min abfedern. Danach wird der Server geordnet heruntergefahren. Bei Wiederherstellung der Stromversorgung startet der Server ebenfalls.
Anforderungen
Der Server
Der Server ist ein debianbasiertes Linuxsystem in der Version Debian Stretch 9.5. Als Hardware dient ein HPE DL20, was hier allerdings keine Auswirkung auf die Umsetzung hat.
Umsetzung
Zunächst wechselt man in das Verzeichnis /etc/grub.d/
und öffnet dort die Datei 40_custom
. Dort fügt man folgende Zeilen ein:
set superuser="Username"
passwort <Username> <Password>
Im Beispiel sähe das wie folgt aus:set superusers="Hannes"
password Hannes sup3rsecr3t
Danach löst man ein update-grub
aus, um die neue Konfiguration zu schreiben. Ein Reboot bringt nun folgendes Ergebnis zutage. Der Server startet und bleibt im Bootmenü stehen. Dort kann der Benutzer nun einen Eintrag auswählen. Nach der Auswahl werden Benutzername und Passwort abgefragt. Nur der oben genannte Benutzer kann mit seinem PW etwas erreichen. Das betrifft alle Menüeinträge sowie das Editieren der Bootmenüeinträge mit "e", um eine Root-Shell auszuwählen. Somit ist Anforderung Nr. 2 erfüllt.
Nun muss Anforderung 1 erfüllt werden. Dazu wechselt man wieder in das Verzeichnis /etc/grub.d/ und öffnet dort die Datei 10_linux. In der Datei nach "menuentry" suchen. Man findet dann zwei Zeilen. Sieh hier:
menuentry '$(echo "$title" |
menuentry '$(echo "$os" |
In der Zeile mit $os gibt es ein ${CLASS}.
Direkt dahinter schreibt man ein --unrestricted
, dass die Zeile wie folgt ausschaut:
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option
Das bedeutet, dass für den Default-Eintrag kein Passwort erfragt wird. Wählt man den Eintrag im Bootmenü, so kann das System ganz einfach starten. Wählt man einen anderen Eintrag, so bedarf es der Zugangsdaten, die oben konfiguriert wurden.
Passwort-Hash statt Klartext
Der etwas bessere Weg ist das Passwort in verschlüsselter Form in Grub zu hinterlassen. Dazu holt man sich den Passwort-Hash mit grub-mkpasswd-pbkdf2 und hinterlegt ihn in der Datei 40_custom. Der Eintrag schaut dann wie folgt aus:
password_pbkdf2 boot grub.pbkdf2.sha512.10000.762....E31B
Die Farben sind nur zur besseren Erkennbarkeit.