sudo - root-Befehle als Benutzer ausführen
 

sudo = substitute user do ist ein Befehl, der dazu benutzt wird, Prozesse mit den Rechten eines anderen Benutzers (z.B. des Superusers root) zu starten. Man benutzt sudo um bestimmten Benutzern die Möglichkeit zu geben, gewisse Programme mit Root-Rechten ausführen zu können ohne das Root-Passwort weitergeben zu müssen. Zum Beispiel um einem Benutzer den shutdown des Rechners zu ermöglichen, der eigentlich root vorbehalten ist.

Die Sicherheitsrichtlinien sind in der Datei
/etc/sudoers
gespeichert. Ein einfacher Eintrag in der Datei wäre z.B.:
# User privilege specification
root ALL=(ALL) ALL
udo ALL=NOPASSWD: /sbin/shutdown
Dem Benutzer udo wird hier ermöglicht den shutdown-Befehl auszuführen, ohne Eingabe des Paßwortes (NOPASSWD).
Der entsprechende Befehl für den Benutzer udo lautet dann:
# sudo shutdown -h now
Wie man sieht, wird lediglich der Befehl sudo vor den eigentlichen Befehl gestellt.

Möchte man das ganze für eine ganze Gruppe ermöglichen, muß ein & vorangestellt werden:
# User privilege specification
root ALL=(ALL) ALL
&user ALL=NOPASSWD: /sbin/shutdown
ermöglicht sämtlichen Angehörigen der Gruppe user den Shutdown des Rechners.

Aus Sicherheitsgründen ist die Datei /etc/sudoers immer mit dem Hilfswerkzeug visudo zu editieren, da es Fehler in der Syntax sofort erkennt. Es genügt die simple Eingabe:
# visudo
und es wird die Datei sudoers mit einem Editor geöffnet.

Man kann auch Aliase vergeben um ganze Gruppen von usern aufzunehmen, z.B.
# User alias specification
User_Alias ABSCHALTER = ralf,heinz,udo
für Befehle gilt das gleiche:
# Cmnd_alias specification
Cmnd_Alias DOWN= /sbin/shutdown, /sbin/halt
die Zusammenführung sieht dann so aus:
# User privilege specification
root ALL=(ALL) ALL
ABSCHALTER ALL=DOWN
in diesem Fall muß man ein Paßwort eingeben, ohne sieht es so aus:
# User privilege specification
root ALL=(ALL) ALL
ABSCHALTER ALL=NOPASSWD:DOWN

Übrigens werden unberechtigte sudo Aufrufe an root als Mail verschickt, damit root eventuelle Einbruchsversuche ins System sofort mitgeteilt bekommt.

Beispiel für eine /etc/sudoers Datei:

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL) ALL


Unterschiede su - sudo - kdesu

Möchte man nicht bei jedem Aufruf von root-Befehlen ein sudo voranstellen, gibt es noch die Möglichkeit, die Identität zu wechseln und damit root zu werden. Dafür gibt es einen Befehl, der eine winzige Variante hat: su und su -
Der Unterschied zwischen su und su mit einem Minus:
su = Eine Shell mit veränderter Identität starten.
su - = macht die Shell zur Login-Shell

Ohne das Minus wird man root in dem Verzeichnis, in welchem man beim Aufruf von su gewesen ist. Allerdings fehlt die komplette "root"-Umgebung, wie sie in /etc/profile(.local) steht. Insbesondere wird die Umgebungsvariable $PATH (der Suchpfad für Programme) nicht geändert. Man wird zwar "root", behält aber sämtliche Umgebungsvariablen des Users bei. Dies führt dazu, daß manche administrativen Programme nur mit einer Pfadangabe funktionieren.

Mit su - wird man komplett als "root" eingeloggt (man bekommt eine Loginshell) und befindet sich anschließend auch im Heimatverzeichnis von "root". Außerdem wird $PATH um /sbin und /usr/sbin ergänzt - die in diesen Verzeichnissen enthaltenen Programme, die üblicherweise nur von root gebraucht werden, werden somit gefunden.

Hinweis: Um auch beim Aufruf von su ohne minus $PATH wie in älteren SUSE-Versionen zu setzen, muß man in /etc/default/su die Option ALWAYS_SET_PATH=yes setzen.
Die Angaben für PATH und SUPATH in /etc/default/su gelten übrigens für su ohne minus und nur in Verbindung mit ALWAYS_SET_PATH=yes.

sudo wurde ja schon weiter oben behandelt, trotzdem noch einmal die Erklärung:

sudo = führt ein Kommando unter einem anderem Benutzer aus. Ohne User-Angabe wird root verwendet.

kdesu = ist dasselbe wie sudo nur für die KDE-Desktopumgebung. Sozusagen das ausführen von grafischen Programmen als root. Ein Beispiel: Man öffnet mit ALT-F2 den "Befehl Ausführen"-Dialog und gibt kdesu konqueror ein und schon wird ein Konqueror mit root-Rechten gestartet, mit dem man Zugriff auf die root-Verzeichnisse hat, sowie sämtliche Konfigurations-Dateien die normalen Benutzern vorenthalten sind.
kdesu kann überdies auch benutzerspezifische Einstellungen beinhalten, die dann in der Datei .kdesu welche im Benutzerverzeichnis liegt festgehalten sind.

Zwischen su und kdesu gibt es allerdings noch ein kleinen Unterschied den man schnell merkt, wenn man als root auf der Konsole ein grafisches Programm abstarten will.

Warum kann ich als root auf der Konsole keine grafischen Programme starten?

Der Versuch ein Programm wie z.B. Kwrite auf einer Konsole bei der man als root angemeldet ist abzustarten, führt zu folgender Fehlermeldung:
# kwrite
kwrite: cannot connect to X server
Das liegt daran, weil Standardmäßig keine DISPLAY-Variable für root gesetzt wird, was uns ein
root@zuhause# echo $DISPLAY

root@zuhause#

auch anzeigt. Vergibt man die Variable DISPLAY mittels
# DISPLAY=:0.0; export DISPLAY
kommt die nächste Fehlermeldung:
# kwrite
No protocol specified
No protocol specified
kwrite: cannot connect to X server :0.0

Und das obwohl die Umgebungsvariable DISPLAY gesetzt ist. Um überhaupt etwas anzeigen zu können, müssen die Programme den X-Server kennen, was ihnen mittels der DISPLAY-Variable mitgeteilt wird. Jedoch ist es standardmäßig so, daß nur der Benutzer unter dem der X-Server läuft Zugriff auf selbigen hat damit nicht jeder x-beliebige User ein Fenster auf dem Rechner öffnen kann. Der Besitzer des X-Servers kann jedoch weitere Freigaben für andere User erteilen. Dazu gibt es den Befehl xhost. Zum Beispiel gibt
$ xhost +
den X-Server ohne irgendwelche Beschränkungen für Jedermann frei. Möchte man ihn lediglich für root freigeben lautet der Befehl
$ xhost +local:root
Und schon kann man Programme wie Kwrite von der Konsole bei der man als root eingeloggt ist starten. Diese Freigabe ist jedoch nur temporärer Natur und nach einen Neustart wieder verschwunden. Möchte man sie dauerhaft festlegen, kann man im Autostart-Ordner von KDE unter ~/.kde/Autostart/ ein kleines Shell-Skript anlegen und den Befehl eintragen.
Möchte man die Freigabe wieder entziehen, stellt man ein Minus voran:
$ xhost -local:root
Warum aber funktioniert das Starten von grafischen Programmen bei kdesu? Bei kdesu wird die Freigabe gleich automatisch mit konfiguriert und nach Beendigung des Programms wieder entzogen. Gleiches gilt auch für ssh, denn loggt man sich als root mittels
$ ssh -X root@heim-pc
auf einen entfernten Rechner ein, kann man grafische Programme mit root-Rechten über das Netzwerk ohne Probleme abstarten (Für den ssh-Befehl siehe ssh und für das sogenannte X11-Forwarding siehe X11-Forwarding).

Möchte man zukünftig öfter Programme auf der Konsole mit root-Rechten starten, ist das ständige Angeben der DISPLAY-Variablen für root nervig und es empfiehlt sich diese schon beim Abstarten des Systems festzulegen. Leider gibt es da einen kleinen Stolperstein, denn geben wir in der ~/.bashrc von root die Variable an, wird sie bei jedem öffnen der bash erneut festgelegt. Dummerweise muß für das X11-Forwarding die Variable so verändert werden (Standardmäßig bekommt sie den Wert localhost:10.0), daß die Programme an den entfernten Client weiter gereicht werden können. Diese Veränderung der Umgebungsvariablen übernimmt ssh. Wird ssh mit der Option -X (großes X) aufgerufen, wird das X11-Forwarding aktiviert und die Display-Variable auf localhost:10.0 gesetzt, damit aufgerufene Programme an den entfernten Rechner weitergereicht werden. Dummerweise wird beim Login über ssh auch die bashrc aufgerufen und die veränderte DISPLAY-Variable durch unseren festgelegten Wert wieder zurück gesetzt. Dadurch werden die Programme nicht über das Netzwerk weiter gegeben, sondern auf dem lokalen Rechner geöffnet. Umgehen kann man das, in dem man die Variable auf Inhalt überprüft und nur wenn sie leer ist setzt. Dies erreicht man mit folgenden Zeilen die man der bashrc hinzufügen kann:
if [ -z "$DISPLAY" ]
then DISPLAY=:0.0; export DISPLAY
fi

Mittels if [ -z "$VARIABLE" ] testet man, ob eine Variable leer ist. Die folgende Zeile nach then wird nur ausgeführt, wenn der Wert wahr ist, also wenn die Variable DISPLAY leer ist. In dem Fall wird der Standard-Wert :0.0 vergeben.