Grub2 Passwort

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

  1. Das System soll selbsttätig wieder starten können und seine Dienste im Netzwerk anbieten. Die Absicherung durch ein Grub-Passwort darf den automatischen Startvorgang des Servers nicht behindern.
  2. Es darf nicht möglich sein direkt per Root-Shell zu booten, was bedeutet, dass die Bootparameter im Bootmenü nicht erreicht und damit verändert werden dürfen.

 

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.