[[Vorlage(Getestet, bionic)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:VIM: Umgang mit dem Terminal-Editor "Vim(vi)"] }}} [[Inhaltsverzeichnis(2)]] Mit der Konfiguration zum Befehl [:sudo:] bestimmt der System-Administrator, welche Benutzer (oder Benutzergruppen) welche Befehle wann an welchem Ort als Benutzer ``root`` (oder einem anderen Benutzer) ausführen dürfen. = Einstellungen = Um einem Benutzer das Ausführen des Befehls `sudo` zu ermöglichen, reicht es i.d.R. aus, ihn in die Benutzergruppe `sudo` aufzunehmen. Dies kann mit dem Befehl: {{{#!vorlage Befehl sudo usermod -aG sudo BENUTZERNAME }}} erfolgen. Komplexere Einstellungen und damit verbundene Rechte werden in der Datei '''/etc/sudoers''' eingestellt. {{{#!vorlage Warnung Die Datei '''/etc/sudoers''' sollte immer mit dem Befehl `visudo` bearbeitet werden, da so eine Syntaxprüfung gewährleistet ist. Die letzte Zeile der Sudoers-Datei muss zudem immer leer sein! Bei der direkten Bearbeitung ohne Prüfung kann der kleinste Tippfehler dazu führen, dass man sich aus dem System aussperrt und nur über den [:Recovery_Modus:Recovery Modus] wieder Zugang erhält. Es ist dabei korrekt, die Änderung in '''sudoers.tmp''' zu speichern, denn `visudo` überprüft nun die Syntax und man hat die Möglichkeit, Fehler zu korrigieren. Alternativ kann man vor der Änderung eine zweite Konsole mit Root-Rechten (`sudo -i`) öffnen. Stellt man dann fest, dass man sich aus dem System ausgesperrt hat, kann man über diese Konsole die Änderungen wieder rückgängig machen. }}} Man öffnet ein Terminal[1] und gibt dort: {{{#!vorlage Befehl sudo visudo }}} ein. Oder {{{#!vorlage Befehl EDITOR=vim sudo -E visudo }}} um statt des Editors nano den Editor vim zu benutzen. Man kann aber stattdessen auch generell den Standardeditor global in Ubuntu ändern (siehe hier: [:Editor/#Standard-Editor-aendern: Editor/#Standard-Editor-aendern]). Die Grundsyntax für die Zeilen in sudoers Konfigurationdateien lautet: {{{ =(:) }}} Einige Standardeinträge in '''/etc/sudoers''' sehen so aus: {{{ root ALL = (ALL:ALL) ALL }}} Das heißt, ``root`` darf alle Befehle mit `sudo` ausführen. {{{ %admin ALL = (ALL) ALL }}} Die Gruppe ``admin`` bekommt root Rechte. Eine Gruppe wird durch das Zeichen '''%''' gekennzeichnet. Hinweis: Die Gruppe admin gibt es seit 12.04 nicht mehr und dient nur der Kompatibilität zu alten Versionen. {{{ %sudo ALL = (ALL:ALL) ALL }}} Die Gruppe ``sudo`` darf alle Befehle mittels `sudo` als `root` ausführen. (ALL:ALL) bedeutet hier, man darf als sudo-Mitglied Befehle für jeden Benutzer und für jede Gruppe ausführen. Programme oder Anwender sollten ihre eigene Anweisungen in separaten Dateien im Verzeichnis '''/etc/sudoers.d''' erstellen. Weitere Beispiele: {{{ admin ALL = NOPASSWD: ALL %users ALL = NOPASSWD: /usr/sbin/IRGENDEINSKRIPT }}} Der Benutzer ``admin`` darf ohne Passwortabfrage alle Programme ausführen. Die Gruppe ``users`` darf __ohne__ Passwortabfrage den Befehl `/usr/sbin/IRGENDEINSKRIPT` ausführen. {{{#!vorlage Hinweis Einträge werden in der Reihenfolge ihres Erscheinens verarbeitet. D.h., gilt für die Gruppe `admin`: "`ALL = (ALL) ALL`", so werden `NOPASSWD`-Einträge für den Benutzer `admin` überschrieben. Es ist also ratsam, "`%admin ALL=(ALL) ALL`" vor dem entsprechenden `NOPASSWD`-Eintrag zu definieren. }}} {{{#!vorlage Warnung Man sollte die Passwortabfrage nur für Skripte oder Programme deaktivieren, die in einem Systemverzeichnis ('''/bin''', '''/sbin''', '''/usr/bin''', '''/usr/sbin''', ...) liegen und `root` gehören. Grund: Ist die Passwortabfrage beispielsweise für das Skript '''~/bin/mein-skript''' deaktiviert, dann kann es ein Angreifer mit Benutzerrechten einfach löschen und durch ein beliebiges Skript oder Programm ersetzen und dann mit Root-Rechten ausführen. Auf diese Weise wäre das gesamte System kompromittiert. Erst wenn das Skript `root` gehört und nur von `root` geändert werden kann und auch in einem Verzeichnis liegt, in dem nur `root` Schreibrechte hat, ist dieser Angriff nicht mehr möglich. }}} == Alias == Es gibt vier verschieden Aliastypen: * `User_Alias` * `Runas_Alias` * `Host_Alias` * `Cmnd_Alias` Einen Alias definiert man so: {{{ Alias_Type NAME = item1, item2, ... }}} Der `NAME` ist ein String mit Großbuchstaben und (optional) _ . Beispielhaft werden hier nur die User-Aliase und die Befehls-Aliase beschrieben, weil sie am wichtigsten sind. === User-Alias === Indem man Aliase definiert, kann man bestimmten Usern (ohne sie in einer Gruppe zusammenzulegen) gezielt Superuserrechte vergeben. Beispiel: {{{User_Alias FULLTIMERS = millert, mikef, dowdy User_Alias PARTTIMERS = bostley, jwfox, crawl User_Alias WEBMASTERS = will, wendy, wim }}} In diesem Beispiel wird ein User-Alias namens `FULLTIMERS` definiert mit 3 Mitgliedern: `millert, mikef, dowdy`. Die Rechte werden dann so vergeben: {{{FULLTIMERS ALL = (ALL) ALL }}} === Befehls-Alias === Befehls-Aliase werden genauso erstellt, sie haben entsprechend ein führendes ``Cmnd_Alias``. In diesem Beispiel wird eine Gruppe mit Namen ``DOWN`` erstellt, die mehrere Befehle zum herunterfahren, neu starten, usw. enthält: {{{ Cmnd_Alias DOWN = /sbin/shutdown, /sbin/reboot, /usr/sbin/pm-suspend, /usr/sbin/pm-hibernate }}} Werden zusätzlich Parameter für den Befehl benötigt, müssen die Zeichen ",", "\", ":" und "=" mit einem Backslash "\" escaped werden, da die Syntaxprüfung sonst Fehler meldet und die Parameter nicht an den Befehl durchreicht. Das folgende Beispiel erstellt eine Gruppe namens ``HELLIGKEIT``, die nur einen langen Befehl inkl. Parametern enthält: {{{ Cmnd_Alias HELLIGKEIT = /usr/bin/setpci -s 00\:02.0 f4.b\=ff }}} Zugewiesen werden diese Befehls-Aliase, in diesem Beispiel der oben definierten Gruppe der ``PARTTIMERS``, so: {{{ PARTTIMERS ALL = NOPASSWD: DOWN }}} Nun können die User der Gruppe ``PARTTIMERS`` die Befehle der Gruppe ``DOWN`` ohne Passwortabfrage ausführen. [[Anker(admin_zeit)]] == Administrator auf Zeit == Der voreingestellte Zeitraum von 15 Minuten, in dem das Passwort bei `sudo`-Aktionen nicht abgefragt wird, kann verändert werden; beispielsweise auf den Wert ``0``. Dazu fügt man diese Zeile hinzu oder hängt ``timestamp_timeout = 0 ``, mit Komma getrennt vom bereits existierenden Parameter, an die bestehende ``Defaults``-Zeile daran: {{{# Timeout auf Null setzen. Standardwert ist 15 Minuten. Defaults timestamp_timeout = 0 }}} Danach muss man bei jedem `sudo`-Aufruf das Passwort eingeben. [[Anker(pwsetzen)]] == Visuelles Feedback bei Passworteingabe == Normalerweise gibt `sudo` nichts aus, wenn das Passwort eingegeben wird, was es einem Angreifer schwer machen soll, die Länge des Passwortes zu bestimmen. Das hat aber beispielsweise den Nachteil, dass unerfahrene Benutzer denken, dass die Passworteingabe nicht funktioniert oder dass man das Passwort in einem anderen Fenster eintippt, weil dieses Fenster gerade den Fokus bekommen hat. Durch Einfügen der Zeile {{{ Defaults pwfeedback }}} wird für jedes eingegebene Zeichen ein Stern (*) ausgegeben und beim Drücken von [[Vorlage(Tasten, enter)]] werden alle Sterne wieder gelöscht. Man kann außerdem auf folgende Weise ein externes Programm zum Einlesen des Passwortes benutzen: {{{ Defaults askpass = /PFAD/ZUM/EXTERNEN/PROGRAMM }}} Dieses Programm kann sich dann um das Feedback bei der Passworteingabe kümmern, und es sind auch grafische Programme möglich (beispielsweise ssh-askpass). Um das externe Programm aber auch zu benutzen, muss `sudo` mit der Option `-A` aufgerufen werden. Das externe Programm kann außerdem in der Variable `SUDO_ASKPASS` spezifiziert werden, was den Eintrag in der Datei '''/etc/sudoers''' überstimmt. Für mehr Informationen sei auf die [:man:Manpage] von `sudo` und `sudoers` verwiesen. = Root-Passwort einrichten = Im Allgemeinen fährt man bei Ubuntu gut damit, den Root-Account deaktiviert zu lassen und das System ausschließlich über ``sudo`` zu administrieren. Es gibt allerdings einen Grund, den Root-Account u.U. zu aktivieren. Wenn nicht-vertrauenswürdige Benutzer direkten Zugang zum Rechner haben, können sie ihn über den Bootmanager Grub im [:Recovery_Modus:Recovery Modus] starten. Ist der Root-Account deaktiviert, erhält ein böswilliger Benutzer so ohne Passwortabfrage eine Root-Shell. Wird der Rechner in einer Multiuser-Umgebung eingesetzt, z.B. im Rechnerraum einer Schule oder Universität, sollte der Root-Account daher aktiviert werden. Allerdings gibt es in so einem Szenario noch eine Reihe weiterer möglicher Schlupflöcher, die relativ einfach auszunutzen sind. Die Beachtung des Artikels [:Lokale_Sicherheit:Lokale Sicherheit] ist daher das mindeste, was man unternehmen sollte. Was man aber nach Möglichkeit unterlassen sollte, ist nur noch auf den Root-Account zu setzen und die ``sudo``-Möglichkeit ganz zu deaktivieren. Die Konfigurationswerkzeuge von Ubuntu sind nämlich auf die Benutzung von ``sudo`` ausgelegt, und wenn diese Art der Authentifizierung nicht mehr zur Verfügung steht, kann dies durchaus zu Problemen insbesondere bei den grafischen Administrationswerkzeugen kommen. Wer also den direkten Login als Root aus irgendeinem Grund aktivieren will, muss den Root-Benutzerzugang mit einem gültigen Passwort versehen. Bitte bei folgendem Befehl beachten, dass `sudo` zuerst nach dem eigenen Passwort fragt. {{{#!vorlage Befehl sudo passwd }}} Damit kann man sich mit `su` bereits als Benutzer ``root`` einloggen, allerdings ist es unter Verwendung von `sudo` nach wie vor möglich, Root-Rechte zu erlangen. Damit für alle administrativen Tätigkeiten das Root-Passwort anstelle des Benutzerpasswortes benötigt wird (auch für Sudo-Frontends), empfiehlt es sich, einen entsprechenden Eintrag in '''/etc/sudoers''' vorzunehmen. Dazu startet man den dazu vorgesehenen Editor visudo und fügt der ersten nicht auskommentierten Zeile die Flags ``targetpw`` und ``timestamp_timeout = 0`` hinzu. {{{Defaults !lecture,tty_tickets,!fqdn,targetpw,timestamp_timeout = 0 }}} Das ``timestamp_timeout = 0`` führt dazu, dass bei __jeder__ Benutzung von `sudo` nach dem Passwort gefragt wird. Was für einen Sinn so eine Maßnahme haben soll, ist allerdings fraglich. Schließlich kann man jeden Benutzer, der kein ``sudo`` benutzen soll, auch einfach aus der `sudo`-Gruppe entfernen. Selbst wenn man das Flag ``targetpw`` gesetzt hat, ist ein root-Zugang mit Benutzer-Passwort meist noch über das [:PolicyKit:] möglich, beispielsweise durch den Befehl '''pkexec'''. Ein Weg zu Abhilfe wird hier beschrieben: [:PolicyKit#Benutzung:] = Root-Anmeldung untersagen = Hat man einmal dem ``root``-Benutzer ein Passwort gegeben und möchte dies wieder rückgängig machen, so kann man mit dem Befehl {{{#!vorlage Befehl sudo passwd -dl root }}} den Account wieder in den "deaktivierten" Zustand bringen. {{{#!vorlage Warnung Mit dem früher und auch heute noch oft im Netz zu findenden [[Vorlage(Befehl, "sudo passwd -l root")]] ist danach kein Zugang zum root-Recovery-Modus mehr möglich! Deshalb wird von Benutzung der Option `-l` zum Deaktivieren des root-Passwortes __abgeraten__!}}} [[Anker(Umleitungen)]] = sudo-Eingaben umleiten = Soll die Ausgabe eines per `sudo` ausgeführten Befehls [:Shell/Umleitungen:umgeleitet] werden, so erfolgt dies im allgemeinen __nicht__ mit Root-Rechten. Vor allem, wenn man mit dem Befehl `echo` etwas in eine Datei schreiben oder anhängen will (auch wenn es ein [:Editor:] genauso tun würde), funktioniert dies nicht: {{{#!vorlage Befehl sudo echo mem > /sys/power/state # Zugriff verweigert }}} Abhilfe schafft das Kapseln des Befehls in eine eigene Shell (bash): {{{#!vorlage Befehl sudo bash -c "echo mem > /sys/power/state" }}} oder einfach die Umsetzung mit `tee`: {{{#!vorlage Befehl echo mem | sudo tee /sys/power/state }}} {{{#!vorlage Experten Alternativ lässt sich auch in eine Root-Shell wechseln, indem ``sudo -i`` oder ``sudo /bin/bash`` ausgeführt wird. }}} = Links = Für weitere Informationen siehe auch: [man:sudoers:Manpage zu sudoers] {en} * [https://www.sudo.ws/sudo/sudoers.man.html Projektseite] sudoers-Manual {en} * [https://www.psychocats.net/ubuntu/fixsudo Fix Broken Sudo] {en} * [https://kofler.info/sudo-ohne-passwort/ sudo ohne Passwort] {de} # tag: Shell,Server,sudoers