Mit dem Kommandozeilenwerkzeug `sudo` können unter Linux Befehle mit den Rechten eines anderen Benutzers, beispielsweise des Root-Benutzers, ausgeführt werden. `sudo` bietet zudem die Möglichkeit, präzise zu definieren, welche User auf die Root-Fähigkeiten zugreifen dürfen. So können User entweder volle Kontrolle erhalten oder nur eine begrenzte Anzahl an Befehlen nutzen dürfen. Wir zeigen, wie dies funktioniert.
`sudo` und die Root-Befugnisse
Wie bekannt ist, wird unter Linux alles als Datei behandelt. Genauer gesagt, verwenden fast alle Elemente des Betriebssystems, wie Prozesse, Dateien, Verzeichnisse, Sockets und Pipes, einen Dateideskriptor, um mit dem Kernel zu kommunizieren. Obwohl nicht jedes Element tatsächlich eine Datei ist, werden die meisten Betriebssystemobjekte so behandelt, als wären sie es. Diese Designphilosophie wird in Linux und Unix-ähnlichen Systemen weitestgehend verfolgt.
Das Konzept, dass „alles eine Datei ist,“ ist fundamental für Linux. Es ist daher nachvollziehbar, dass Dateiberechtigungen eine zentrale Rolle für Benutzerrechte spielen. Wenn ein User eine Datei oder ein Verzeichnis besitzt, kann er damit nach Belieben agieren, also Bearbeiten, Umbenennen, Verschieben und Löschen. Er hat auch die Kontrolle über die Berechtigungen dieser Objekte, um anderen Benutzern oder Gruppen zu gestatten, Dateien zu lesen, zu ändern oder auszuführen. Diese Rechte gelten für alle Benutzer, mit Ausnahme des Superusers, auch bekannt als Root.
Das Root-Konto ist ein privilegiertes Konto, welches nicht an die normalen Berechtigungsstrukturen des Betriebssystems gebunden ist. Der Root-User kann nahezu alles zu jeder Zeit machen.
Logischerweise kann jeder, der Zugriff auf das Root-Passwort hat, das Gleiche tun. Dies kann sowohl unbeabsichtigte als auch böswillige Schäden zur Folge haben. Es ist nicht ausgeschlossen, dass selbst ein Root-Benutzer durch einen Fehler katastrophale Auswirkungen hat. Daher ist es ratsam, sich nicht direkt als Root anzumelden. Stattdessen sollte man sich mit einem Standard-Benutzerkonto anmelden und `sudo` nutzen, um die benötigten Privilegien nur temporär zu erlangen. In vielen Fällen geht es dabei nur um die Ausführung eines einzelnen Befehls.
Die `sudoers`-Liste
`sudo` war bereits auf den untersuchten Systemen, Ubuntu 18.04.3, Manjaro 18.1.0 und Fedora 31 vorinstalliert. Das ist nicht überraschend, da `sudo` seit den frühen 1980er Jahren existiert und für beinahe alle Distributionen zum Standard für Superuser-Operationen geworden ist.
Bei der Installation einer modernen Distribution wird der erstellte User der sogenannten `sudoers`-Liste hinzugefügt. Diese Liste beinhaltet die Benutzer, die das `sudo`-Kommando benutzen dürfen. Mit Sudo-Rechten kann man der Liste weitere User hinzufügen.
Es ist allerdings riskant, den kompletten Superuser-Status jedem zu gewähren. In der `sudoers`-Liste lässt sich präzise bestimmen, welche Befehle die jeweiligen User mit `sudo` ausführen dürfen. Damit erhalten sie nicht die volle Kontrolle, können aber dennoch ihre Aufgaben erledigen.
Ausführung von Befehlen als anderer Benutzer
Ursprünglich stand `sudo` für „Superuser do“, da es dem Superuser gestattete, Aktionen auszuführen. Heute hat es eine erweiterte Funktion: Befehle als ein beliebiger User auszuführen. Es wurde daher umbenannt in „Substitute User do“.
Um `sudo` zu verwenden und einen Befehl als anderer Benutzer auszuführen, wird die Option `-u` (User) benutzt. Beispielsweise führt folgender Befehl `whoami` als Benutzerin Mary aus. Ohne die Option `-u` würde der Befehl standardmäßig als Root ausgeführt.
sudo -u mary whoami
Das Ergebnis des `whoami`-Befehls zeigt, dass der Befehl unter dem Benutzerkonto Mary ausgeführt wurde.
Mit `sudo` kann man sich auch ohne das Passwort des anderen Benutzers als dieser anmelden. Hierbei wird nach dem eigenen Passwort gefragt. Dies geschieht mit der Option `-i` (Login).
sudo -i -u mary
pwd
whoami
ls -hl
exit
Man ist nun als Mary eingeloggt. Die Dateien `.bashrc`, `.bash_aliases` und `.profile` des Mary-Benutzerkontos werden geladen, als hätte sich Mary selbst angemeldet. Die Eingabeaufforderung zeigt nun auch an, dass man sich in einer Sitzung des Benutzerkontos Mary befindet. Der `pwd`-Befehl zeigt das Home-Verzeichnis von Mary an. `whoami` gibt das Benutzerkonto Mary aus. Die Dateien im Verzeichnis gehören dem User Mary. Der Befehl `exit` führt zurück zur normalen Sitzung des eigenen Kontos.
Bearbeitung der `sudoers`-Datei
Um User zur Gruppe derer hinzuzufügen, die `sudo` verwenden dürfen, muss die Datei `sudoers` geändert werden. Hierfür ist es wichtig, den Befehl `visudo` zu verwenden. `visudo` verhindert, dass mehrere Benutzer gleichzeitig die `sudoers`-Datei bearbeiten. Zudem werden die Syntax und der Dateiinhalt geprüft bevor die Änderungen gespeichert werden.
Sollten die Änderungen den Tests nicht standhalten, wird die Datei nicht einfach gespeichert. Es werden Optionen angeboten: Man kann die Änderungen verwerfen, die Bearbeitung wieder aufnehmen oder die fehlerhaften Änderungen trotzdem erzwingen. Die letzte Option ist jedoch nicht empfehlenswert, da man sich so versehentlich selbst von der Nutzung von `sudo` ausschließen kann.
`visudo` ist selbst kein Editor, sondern ruft einen existierenden Editor zum Bearbeiten der Datei auf. Unter Manjaro und Ubuntu verwendet `visudo` den Editor `nano`. Auf Fedora wird der leistungsstärkere, aber weniger intuitive Editor `vim` verwendet.
Wenn man auf Fedora lieber `nano` nutzen möchte, kann dies leicht umgesetzt werden. Zuerst muss `nano` installiert werden:
sudo dnf install nano
Danach muss `visudo` mit folgendem Befehl aufgerufen werden:
sudo EDITOR=nano visudo
Dies ist ein guter Kandidat für einen Alias. Der Nano-Editor wird dann mit der geladenen `sudoers`-Datei geöffnet.
Hinzufügen von Benutzern zur `sudo`-Gruppe
Die `sudoers`-Datei wird mit `visudo` bearbeitet. Hierbei kann entweder der Standardbefehl verwendet, oder die oben beschriebene Variante mit dem gewünschten Editor benutzt werden:
sudo visudo
Man scrollt durch die `sudoers`-Datei, bis man die Definition des `%sudo`-Eintrags erreicht.
Das Prozentzeichen symbolisiert, dass es sich um eine Gruppendefinition und nicht um eine Benutzerdefinition handelt. In einigen Distributionen ist die `%sudo`-Zeile mit einer Raute (#) am Anfang der Zeile auskommentiert. In diesem Fall muss die Raute entfernt und die Datei gespeichert werden.
Die Zeile `%sudo` ist folgendermaßen aufgebaut:
`%sudo`: Der Name der Gruppe.
`ALL=`: Diese Regel gilt für alle Hosts im Netzwerk.
`(ALL:ALL)`: Mitglieder dieser Gruppe können Befehle als alle User und alle Gruppen ausführen.
`ALL`: Mitglieder dieser Gruppe können alle Befehle ausführen.
Zusammengefasst: Mitglieder dieser Gruppe können jeden Befehl als jeder Benutzer oder jede Gruppe auf diesem oder einem beliebigen Host in diesem Netzwerk ausführen. Um einem Benutzer Root-Rechte und die Verwendung von `sudo` zu ermöglichen, kann man ihn einfach zur `sudo`-Gruppe hinzufügen.
Es existieren zwei Benutzer, Tom und Mary, mit den Benutzerkonten Tom bzw. Mary. Mit dem Befehl `usermod` wird Tom zur `sudo`-Gruppe hinzugefügt. Die Option `-G` (Gruppen) gibt die Gruppe an, zu der das Konto Tom hinzugefügt wird. Die Option `-a` (append) fügt die Gruppe der Liste von Gruppen hinzu, in denen sich Tom bereits befindet. Ohne diese Option würde das Konto Tom zwar zur neuen Gruppe hinzugefügt, aber aus allen anderen Gruppen entfernt werden.
sudo usermod -a -G sudo tom
Es wird nun geprüft, zu welchen Gruppen Mary gehört:
groups
Das Benutzerkonto Mary ist nur Mitglied der Gruppe Mary.
Dagegen ist Tom:
groups
Das Benutzerkonto Tom, und damit Tom, ist Mitglied der Gruppen tom und `sudo`.
Nun versucht Mary eine Aktion durchzuführen, die Sudo-Rechte erfordert.
sudo less /etc/shadow
Mary kann die eingeschränkte Datei `/etc/shadow` nicht einsehen. Sie bekommt eine Meldung, dass sie versucht hat `sudo` ohne Erlaubnis zu nutzen. Tom hingegen:
sudo less /etc/shadow
Nachdem Tom sein Passwort eingegeben hat, wird ihm die Datei `/etc/shadow` angezeigt.
Alleine durch die Aufnahme in die `sudo`-Gruppe ist Tom uneingeschränkt berechtigt, `sudo` zu verwenden.
Vergabe eingeschränkter `sudo`-Rechte
Tom hat nun volle `sudo`-Rechte und kann alles tun, was Root tun kann. Dies kann dazu führen, dass Tom mehr Macht hat, als gewünscht ist. Es kann vorkommen, dass ein User eine Funktion benötigt, die Root-Rechte erfordert, aber es keinen Grund gibt, ihm vollen `sudo`-Zugriff zu geben. Um dies zu erreichen, kann man dem User in der `sudoers`-Datei die benötigten Befehle zuweisen.
Nun gibt es Harry, mit dem Benutzerkonto Harry. Er ist nicht in der `sudo`-Gruppe und hat keine `sudo`-Berechtigungen.
groups
Harry soll in der Lage sein, Software zu installieren, aber er soll keine vollen `sudo`-Rechte erhalten. Dies lässt sich realisieren, indem man `visudo` startet:
sudo visudo
Man scrollt durch die Datei bis hinter die Gruppendefinitionen. Da es sich um eine User- und keine Gruppendefinition handelt, muss die Zeile nicht mit einem Prozentzeichen beginnen.
Der Eintrag für das Benutzerkonto Harry lautet:
harry ALL=/usr/bin/apt-get
Wichtig: Zwischen `harry` und `ALL=` muss sich ein Tabulator befinden.
Dies bedeutet, dass der User Harry die gelisteten Befehle auf allen Hosts nutzen darf, die mit diesem Netzwerk verbunden sind. Hier ist ein Befehl gelistet, `/usr/bin/apt-get`. Harry kann Zugang zu mehreren Befehlen erhalten, wenn man diese durch Kommas getrennt in der Befehlsliste auflistet.
Die Zeile wird in der `sudoers`-Datei eingefügt und gespeichert. Um die Syntax zu prüfen, kann man visudo auffordern, die Datei zu scannen, indem man die Option `-c` (check only) verwendet:
sudo visudo -c
Die Überprüfung wurde durchgeführt und `visudo` gibt an, dass alles in Ordnung ist. Harry kann nun `apt-get` zum Installieren von Software verwenden, andere Befehle mit `sudo` sollten ihm jedoch verwehrt werden.
sudo apt-get install finger
Harry wurde die notwendigen Sudo-Rechte gewährt und kann die Software installieren.
Was passiert nun, wenn Harry versucht, einen anderen Befehl mit `sudo` auszuführen?
sudo shutdown now
Harry wird daran gehindert, diesen Befehl auszuführen. Es wurde ihm ein spezifischer, eingeschränkter Zugang gewährt. Er kann den zugewiesenen Befehl nutzen, aber nichts anderes.
Verwendung von `sudoers`-Benutzeraliasen
Sollen Mary die gleichen Rechte wie Harry erhalten, könnte man einfach wie bei Harry eine Zeile für Mary in der `sudoers`-Datei hinzufügen. Eine sauberere Option, dies zu erreichen, ist die Verwendung eines User_Alias.
In der `sudoers`-Datei enthält ein User_Alias eine Liste von Benutzernamen. Der Name des User_Alias kann dann in einer Definition verwendet werden, um alle diese Benutzer zu repräsentieren. Um die Berechtigungen für diese Benutzer anzupassen, muss man dann nur eine Zeile ändern.
Es wird nun ein User_Alias erstellt und in der `sudoers`-Datei genutzt.
sudo visudo
Scrollt man in der Datei nach unten, erreicht man die Zeile der User_Alias-Definition.
Der User_Alias wird hinzugefügt, indem man Folgendes eingibt:
User_Alias INSTALLERS = harry, mary
Jedes Element wird durch ein Leerzeichen getrennt, nicht durch einen Tabulator. Die Logik lautet folgendermaßen:
`User_Alias`: Gibt an, dass es sich hierbei um einen User_Alias handelt.
`INSTALLERS`: Ein beliebiger Name für diesen Alias.
`= harry, mary`: Die Liste der Benutzer, die diesem Alias zugeordnet werden sollen.
Die Zeile, die zuvor für Harry erstellt wurde, wird nun bearbeitet:
harry ALL=/usr/bin/apt-get
Sie wird zu folgender Zeile geändert:
INSTALLERS ALL=/usr/bin/apt-get
Dies bedeutet, dass alle Benutzer, die in der Definition des „INSTALLERS“-User_Alias gelistet sind, den Befehl `apt-get` ausführen dürfen. Dies wird mit Mary getestet, die nun in der Lage sein sollte, Software zu installieren.
sudo apt-get install colordiff
Mary kann die Software installieren, da sie im User_Alias „INSTALLERS“ gelistet ist und diesem Alias diese Rechte zugewiesen wurden.
Drei schnelle `sudo`-Tricks
Sollte man einmal vergessen, `sudo` vor einen Befehl zu setzen, kann man
sudo !!
nutzen, um den letzten Befehl mit `sudo` am Anfang der Zeile erneut auszuführen.
Nachdem `sudo` verwendet und man sich mit seinem Passwort authentifiziert hat, muss man sein Passwort für 15 Minuten nicht erneut für weitere `sudo`-Befehle angeben. Um die Authentifizierung direkt aufzuheben, kann man
sudo -k
verwenden.
Wo sind die fehlerhaften Versuche der `sudo`-Nutzung einsehbar? Diese befinden sich in der Datei `/var/log/auth.log`. Sie kann mit folgendem Befehl angezeigt werden:
less /var/log/auth.log
Hier ist der Eintrag des Benutzerkontos Mary zu sehen, welche unter TTY pts/1 angemeldet war, als sie versuchte, den Befehl `shutdown` als Benutzer `root` auszuführen.
Mit großer Macht…
… kommt die Fähigkeit, Teile dieser Macht an andere zu delegieren. Nun ist bekannt, wie man anderen Usern gezielte Befugnisse einräumen kann.