Berechtigungen von Sudo: Das Konzept hinter dem Administratorzugriff
Hallo zusammen. In diesem kleinen Mini-Wiki geht es um den Administrationszugriff auf einem Linux- und/oder Unix-System.
Wie auch in meinem Artikel "Berechtigungen auf einem Linux- oder Unix-System mittels chown und chmod" habt ihr bestimmt schon einmal von dem Befehlspräfix "sudo" gehört. Wenn nicht, dann passt jetzt gut auf und lest euch diesen Artikel aufmerksam durch, denn sudo ist ein sehr weitreichendes, umfassendes Thema, welches man auf ... eigentlich jedem Linux- oder Unix-System irgendwann mal zu sehen bekommt.
Um sudo kurz zu erläutern: Es handelt sich hierbei um die Abkürzung "Super-User-DO", also "Super-Nutzer-Tun (oder Machen)". Der Super User ist einfach gesagt als "root" einzuordnen. Da "root" geläufiger ist, als "Super-User", werde ich in diesem Artikel eher mit "root" schreiben, als mit "Super User".
Was kann "sudo" eigentlich?
Wenn ihr bereits mit einem Linux- oder Unix-System in Berührung gekommen seid oder es vielleicht sogar aktiv nutzt, dann sollten euch Befehle, wie "sudo apt install ....." oder "sudo apt update" schon einmal über den Weg gelaufen sein. Ihr solltet aber auch schon mal die Erfahrung gemacht haben, dass ein einfaches "apt install" oder "apt update" nicht funktioniert. Aber warum ist dem so?
So dumm, wie es klingen mag:
Ihr habt keine Berechtigungen auf eurem eigenen System!
Es ist in der Tat so, dass ihr kaum, bis wenige Berechtigungen auf eurem eigenen System außerhalb des "~"-Verzeichnisses habt. ("~" steht für "/home/user", statt also "cd /home/user" immer einzugeben, könnt ihr auch einfach mit "cd ~" in das selbe Verzeichnis wechseln.). Also kommt hier sudo ins Spiel. Alternativ gibt es aber auch "doas" und "pkexec". Sie machen genau dasselbe, wie "sudo", sind aber weniger verbreitet. Installieren könnt ihr diese alternativen Präfixe bei Bedarf ganz einfach über euren Paketmanager (z. B. per "sudo apt install doas"). Das ist aber meist nicht nötig, da eines davon meist schon vorinstalliert ist, außer man holt sich den blanken Linux-Kernel.
Nun aber zurück zum eigentlichen Thema: Wir haben bereits gelernt, dass man mit sudo die sog. Super-User-Rechte (root-Rechte) bekommen kann. Hier gibt es verschiedene Varianten, diesen Befehl zu nutzen. Entweder man nutzt "sudo -i", dann werdet ihr nach dem User-Passwort des aktuell angemeldeten Users (bzw. des Users, der in der Sudoers-Datei konfiguriert ist) gefragt (wie man das umgehen kann erkläre ich später noch), oder man nutzt ihn als sog. Befehls-Präfix, wie in den oben genannten Beispielen "sudo apt install .....". Auch hier wird man beim ersten Mal nach dem User-Passwort, danach nicht mehr, weil es in der aktuellen Session gespeichert wird für eine bestimmte Zeit. Den Unterschied macht nachher die persönliche Präferenz, wenn ihr nicht immer "sudo" vor jeden Befehl eingeben wollt, dann meldet ihr euch als root an mit "sudo -i" und ansonsten setzt ihr immer ein "sudo" davor, wenn ihr Administrative Befehle nutzen wollt.
Der sog. "su"-Befehl und die moderne Alternative "sudo -i"
Zusätzlich zu "sudo" stolpert man im Linux-Alltag früher oder später fast unweigerlich über den Befehl "su", welches für "Substitute User" oder auch "Switch User" steht. Im Gegensatz zum normalen "sudo"-Befehl, welcher einzelne Befehle mit fremden Rechten ausführt, wechselt "su" im Grunde genommen die komplette Identität bzw. die aktuelle Login-Sitzung.
Tippt man einfach nur "su" in das Terminal, versucht das System standardmäßig, in den Account des "root"-Nutzers zu wechseln. Dabei wird im Gegenzug zu "sudo" das echte root-Passwort abgefragt. Vorrausgesetzt dem "root"-Nutzer wurde bei Einrichtung des Systems überhaupt ein Passwort zugewiesen, was bei vielen modernen Distributionen gar nicht mehr der Fall ist.
Mit dem Parameter "su -" oder "su --login" kann man sogar noch einen Schritt weiter gehen: Damit simuliert man einen echten, frischen Login des "root"-Nutzers inklusive der dazugehörigen Umgebungsvariablen (z. B. dem "PATH"-Pfad).
Der wichtige Unterschied zu "sudo -i" ist, dass man bei "su" den kompletten Benutzer-Account wechselt und nicht nur eine interaktive "root"-Shell. "sudo -i" ist die, auf modernen Systemen, sicherere Alternative zu "su". Beide liefern ein ähnliches Ergebnis, nämlich den Zugriff auf durchgängige "root"-Berechtigungen, und dennoch machen beide ganz unterschiedliche Dinge, indem sich der eine Nutzer mit dem "root"-Account verbindet und der andere komplett den Benutzer-Account wechselt.
Heutzutage wird "su" so gut wie gar nicht mehr verwendet und "sudo -i" ist die moderne Alternative, aber es ist dennoch interessant, etwas über diese Geschichte zu wissen.
"Sudoers" und "Sudoers.d"
Eine weitere Datei bzw. Dateipfad, über den man früher oder später stolpern wird, ist "/etc/sudoers" oder "/etc/sudoers.d", aber auch Befehle, wie "visudo" sollte man im Hinterkopf haben. Hierbei geht es nämlich um spezielle Konfigurationsdateien für das komplette "sudo"-System.
Ich werde jetzt nicht auf die kompletten Konfigurationen eingehen, weil man die meisten davon sowieso nicht bearbeiten muss, wenn man "sudo" einfach nur nutzen möchte, aber wie oben bereits erwähnt, möchte ich euch einen Weg geben, damit ihr bei "sudo" kein Passwort mehr eingeben müsst. Das ist nämlich gar nicht so schwer einzustellen, wenn man weiß wie.
Aber einen Sicherheitshinweis möchte ich euch auf diesem Wege gleich mitgeben:
So schön, wie "sudo visudo" bzw. "sudo nano /etc/sudoers" auch zu sein scheint, legt euch bitte immer eine eigene Datei im Verzeichnis "/etc/sudoers.d" an. Dieses Verzeichnis ist in der Sudoers-Datei standardmäßig eingebunden und kann euer System vor Korruption bzw. dem kaputt gehen schützen. Denn es kann immer mal passieren, dass ihr einen Tippfehler habt oder die Konfiguration nicht geladen werden kann und bevor man sich komplett aussperrt, sollte man lieber eigene Konfigurationen nutzen.
Nun zum wichtigen Part: Ihr legt euch mit "sudo nano /etc/sudoers.d/user" eine neue Datei an. Der Name dieser Datei ist erstmal egal, aber die Empfehlung ist immer, die Datei so zu nennen, wie der aktuell angemeldete Nutzer bzw. der Nutzer, für den ihr diese Regeln einstellen wollt heißt.
Den Nutzernamen findet ihr im Terminal auf der linken Seite des @-Zeichens. Wenn dort also steht "terminal@webserver", dann ist der Nutzername "terminal", also sollte die Datei /etc/sudoers.d/terminal heißen, damit ihr euch später merken könnt, für welchen spezifischen Nutzer diese Konfiguration gelten soll.
Die eigentliche Konfiguration dieser Datei sieht ganz einfach aus:
username ALL=(ALL:ALL) NOPASSWD: ALL
Diese eine Zeile tragt ihr in die neu erstellte Datei ein und speichert das mit "Strg+O" (Ctrl+O) und verlasst die Datei dann mit "Strg+X" (Ctrl+X) wieder (Bei "vim" und anderen Texteditoren unter Linux und Unix können die Tastenkombinationen abweichen, das hier gilt für Nano). Danach ist bereits alles gesetzt und ihr könnt "sudo" nun ohne Eingabezwang des Passwortes nutzen.
Erläuterung:
- Der Teil am Anfang mit dem "username" sollte selbst-erklärend sein. Hier steht der Benutzer für den diese Regel gelten soll. Man kann aber auch eine ganze Gruppe hier hinterlegen, indem man "%Gruppenname" dort vorne einträgt. (Mit dem Befehl "groups" sieht man alle Gruppennamen im Terminal.)
- Das erste "ALL" vor dem Gleichheitszeichen ist die Abfrage, von welchem Host der Nutzer oder die Gruppe "sudo" ohne Eingabe eines Passwortes nutzen darf, wenn dort also steht "192.168.2.19", darf der angegebene Nutzer nur von dem Computer mit der angegebenen IP "sudo" ohne Passwort nutzen.
- Das zweite "ALL" (das erste in der Klammer) ist dafür da, um dem System zu sagen, als welcher andere Benutzer der Befehl ausgeführt werden darf. Das bedeutet in diesem Fall, dass der am Anfang angegebene User-Befehle im Namen von jedem beliebigen Benutzer auf dem System ausführen darf.
- Das dritte "ALL" funktioniert genauso, wie das Zweite, nur dass es hier die Gruppe regelt, mit dem der angegebene Nutzer die Befehle ausführen darf.
- Das "NOPASSWD: ALL" sorgt dafür, dass die Passwortabfrage für ALLE Befehle deaktiviert wird. Das "ALL" kann man aber auch mit ganz bestimmten Befehlen ersetzen.
Um "(ALL:ALL)" noch ein wenig zu erläutern, weil ich das selber eine ganze Zeit lang nicht verstanden habe:
Stellt euch vor, ihr betreibt auf einem Server einen Webserver, der unter dem System-User "www-data" läuft. Ihr selbst seid aber mit dem normalen User "admin" angemeldet.
Wenn ihr jetzt eine Datei bearbeiten oder einen Befehl exakt so ausführen wollt, als wärt ihr der Webserver-User "www-data" (und nicht der allmächtige "root"), nutzt ihr "sudo" mit einer Benutzer-Umschaltung: "sudo -u www-data befehl"
Wenn also in der Klammer "(www-data:ALL)" stehen würde, dann dürfte sudo ohne Passwort nur genutzt werden, wenn diese Benutzer-Umschaltung genutzt wird und nicht der normale "sudo"-Befehl ohne "-u www-data".
Selbiges gilt auch für die Gruppe hinter dem Doppelpunkt, nur dass hier keine Benutzer-Umschaltung "-u User" genutzt wird, sondern die Gruppen-Umschaltung "-g Gruppe".
Die Kehrseite bzw. Gefahren von Sudo
"Mit großer Macht kommt große Verantwortung" – Das ist ein Satz, den bestimmt schon viele von euch gehört haben. Und auch hier trifft es voll ins Schwarze. Denn auch wenn "sudo" und "sudo -i" im Alltag extrem praktisch sein können, sollte man sich immer vor Augen führen, was diese Befehle eigentlich tun:
Sie geben euch unkontrollierte Kontrolle über euer gesamtes System!
Wenn ihr als normaler Benutzer einen Fehler macht, wie eine wichtige Konfigurationsdatei im Home-Verzeichnis löscht, ist meist nur euer eigener Account betroffen. Wenn ihr diesen Fehler jedoch mit "sudo" oder als "root"-User macht, hat das ganz andere Dimensionen:
- Das klassische "rm -rf"-Szenario: Ein verändertes Leerzeichen oder ein falscher Pfad bei einem Löschbefehl mit "sudo" kann im schlimmsten Fall das halbe Betriebssystem oder wichtige Systemdateien vernichten. Ein häufig zu sehender Troll im Netz ist hier "sudo rm -rf / --no-preserve-root", welchen ihr niemals und unter gar keinen Umständen jemals ausführen solltet, außer ihr wollt euer ganzes System neu aufsetzen (selbst dann bitte nicht). Denn dieser Befehl wird unkontrolliert und bis ins kleinste Detail jede einzelne Systemdatei, ohne Nachfrage, vor euren Augen löschen, bis das System irgendwann abstürzt, weil die wichtigen Systemdateien weg sind, die euch noch im Terminal halten.
- Ungetestete Skripte: Wenn ihr Skripte aus dem Internet ausführt und diesen Skripten blind "sudo"-Rechte geht, erlaubt ihr fremdem Code, uneingeschränkt auf eurem Rechner zu walten und zu schalten. Schädliche Skripte könnten so "Backdoors" installieren, Daten abgreifen oder den Server kompromittieren.
- Das "Nennt-mich-Root"-Gefühl: Man gewöhnt sich sehr schnell daran, bei jedem Problem einfach ein "sudo" davor zu setzen, bis man es gar nicht mehr hinterfragt. Und genau dann passieren die teuersten Fehler.
Fazit
Also, was kann man zusammenfassend sagen zum Thema "sudo"?
Die goldene Regel: Nutzt "sudo" wirklich nur dann, wenn ihr es zwingend müsst (wie bei der Paketverwaltung oder Systemkonfigurationen) und überlegt lieber zweimal, bevor ihr auf Enter drückt.
"Sudo" ist ein sehr mächtiges Tool und in den falschen Händen kann es sehr viel zerstören. Also passt auf euch auf und vergebt keinesfalls blind irgendwelche "sudo"-Berechtigungen. Der wichtigste Grundsatz: "Vertraue niemandem, nicht einmal dir selbst."
In diesem Sinne euch einen schönen Tag gewünscht und bis zum nächsten Mal.
No comments to display
No comments to display