claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 11/2004   »   Ausgabe bestellen

su, sudo

Doppelgänger

von Heike Jurzik


Werden Sie mit "su -" zum Administrator -- diesen Satz haben Sie vielleicht schon mal gelesen. Was passiert dabei eigentlich im Hintergrund? Und warum kann das Arbeiten mit sudo viel eleganter sein? Wir stellen Befehle zum Identitätswechsel auf der Kommandozeile vor.

Dass Sie mit dem Befehl su - und der Eingabe des root-Passworts Administratorrechte erlangen, haben Sie schon gesehen, wenn Sie regelmäßig die Guru-Rubrik lesen; auch in anderen Artikeln taucht diese Vorgehensweise gelegentlich auf. su kann aber noch mehr: Sie können auch unter einer anderen Benutzerkennung arbeiten. Die Weitergabe des root-Passworts ist jedoch eine heikle Angelegenheit, wenn mehrere Benutzer Accounts auf dem Computer haben: Nicht jeder möchte dieses Geheimnis offenbaren, aber eventuell einzelnen Benutzern spezielle Administrationsrechte einräumen. Hier steht das Kommando sudo hilfreich zur Seite, mit dem Sie Benutzern gezielt root-Rechte für einzelne Befehle oder alle Anwendungen geben.

Möge das "su" mit dir sein

Das Kürzel "su" steht für "substitute user" ("Benutzer ersetzen/austauschen") übersetzen: su ist ein Programm, mit dem Sie auf der Kommandozeile schnell die Identität wechseln. Voraussetzung ist, dass Sie das Passwort des anderen Accounts kennen -- nur root darf sich ohne weitere Authentifizierung ein neues Kleid überstreifen.

Der grundlegende Befehlsaufruf lautet:

$ su benutzername
Password:

Am Passwort-Prompt geben Sie anschließend das passende Kennwort ein -- beachten Sie, dass Sie es "blind" tippen müssen; er erscheinen keine Sternchen oder sonstige Platzhalter. Lassen Sie die Angabe des Benutzernamens weg, meldet su Sie als Administrator root an:

$ su
Password:
huhnix:/home/huhn #

Der veränderte Prompt weist schon darauf hin: Sie benutzen die Shell jetzt als Administrator. Ganz sicher finden Sie Ihre Identität mit dem Kommando whoami (englisch für "wer bin ich") heraus:

# whoami
root

Zum Verlassen der root-Shell geben Sie exit oder logout ein; alternativ verwenden Sie die Tastenkombination [Strg-D]. Anschließend arbeiten Sie wieder unter Ihrer eigenen Benutzerkennung -- das sehen Sie auch daran, dass der Eingabe-Prompt wieder die gewohnte Form hat.

Was ist eine Login-Shell?

Der Prompt huhnix:/home/huhn # verrät: Beim einfachen Aufruf von su findet kein "richtiges" Einloggen als root statt -- Sie wechseln lediglich die Identität, nicht aber die so genannte Arbeitsumgebung. Die (manchmal) unerwünschten Folgen sind: Sie befinden sich noch im Home-Verzeichnis des eigenen Benutzers; auch die Umgebungsvariablen, welche u. a. das Verhalten der Shell und der in ihr gestarteten Programme beeinflussen, werden nicht richtig gesetzt, weil die Shell nicht die Login-Skript-Dateien ausführt.

Um dieses Problem zu umgehen, hängen Sie einfach ein Minuszeichen an den su-Befehl an; der anschließende Befehl pwd ("print working directory" -- "zeige das aktuelle Verzeichnis an") zeigt, dass Sie danach im Home-Verzeichnis des Administrators root sind:

$ su -
Password:
huhnix:~ # pwd
/root

Wer sich darüber hinaus eine Bestätigung wünscht, dass sämtliche Variablen richtig gesetzt wurden, schaut sich mit dem Kommando env eine Liste der gesetzten Umgebungsvariablen an. ("env" ist kurz für das englische Wort "environment", Umgebung.) In der langen Liste sollten Sie nun Einträge finden, die bestätigen, dass Sie sich "richtig" eingeloggt haben (Abbildung 1).

Abb. 1: Mit "su -" werden auch die Anmeldeskripte ausgeführt -- dadurch setzt die Shell die Umgebungsvariablen richtig.

Kommandos unter falscher Flagge

Der Befehl su kann noch mehr: Sie können die Identität für ein einziges Kommando wechseln. Dazu geben Sie dem Kommando den Parameter -c mit auf den Weg. Die Log-Datei unter /var/log/messages beispielsweise ist auf den meisten Systemen für einfache Benutzer nicht lesbar:

$ less /var/log/messages
/var/log/messages: Keine Berechtigung

Anstatt mit su zu root zu werden, dann den less-Befehl einzugeben und schließlich mit exit die Root-Shell wieder zu verlassen, setzen Sie einfach su -c ein:

su -c "less /var/log/messages"

Nach dem Verlassen des Pagers less mit [Q] (für englisch "quit") arbeiten Sie als normaler Benutzer weiter. Beachten Sie die Anführungszeichen im Beispiel, die den Befehlsaufruf less /var/log/messages einschließen. Ohne diese erhalten Sie eine Fehlermeldung:

$ su -c less /var/log/messages
su: Benutzer /var/log/messages existiert nicht

Da passiert Folgendes: su betrachtet nur das Argument less als Kommando; die Zeichenkette /var/log/messages versteht su als Benutzername, und einen Benutzer mit diesem Namen gibt es natürlich nicht. Die Anführungszeichen sorgen dafür, dass less /var/log/messages zusammenhängend als Argument für die Option -c ausgewertet wird.

Nichts bleibt unentdeckt!

Linux protokolliert den su-Aufruf. So behalten Sie im Blick, welcher Benutzer wann su einsetzt. Auch ob das eingegebene Passwort gültig war und wie lange der Benutzer die mit su erworbenen Root-Rechte genutzt hat, steht im Log. Auf den meisten Systemen finden Sie diese Informationen in /var/log/messages. Achten Sie auf Einträge der Art:

Sep  9 12:48:23 huhnix su: (to root) huhn on /dev/pts/5
Sep  9 12:48:23 huhnix su: pam_unix2: session started for user root, service su
Sep  9 12:53:06 huhnix su: pam_unix2: session finished for user root, service su
...
Sep  9 14:49:55 huhnix su: FAILED SU (to root) huhn on /dev/pts/5

Der erste Eintrag verrät, dass Benutzer huhn mit su Adminrechte erlangt hat. In den nächsten beiden Zeilen steht, wann der Identitätswechsel stattfand und wann der Benutzer diese Sitzung beendet hat. Im letzten Beispieleintrag sehen Sie einen fehlgeschlagenen Anmeldeversuch -- auch hier wird die genaue Zeit mitprotokolliert.

Elegant und ohne Root-Passwort: sudo

Das Programm sudo ("substitute user, do") bietet eine elegante Möglichkeit, gezielt Benutzern und Gruppen von Benutzern Administrationsrechte zu geben, ohne dafür das root-Passwort zu verraten. Der Benutzer setzt sudo ganz einfach mit seinem eigenen Passwort ein und erhält für einen begrenzten Zeitraum das Recht, bestimmte Befehle so auszuführen, als wäre er der Administrator.

Voraussetzung ist, dass Sie als Administrator root die Datei /etc/sudoers entsprechend anpassen, auch das Paket sudo muss installiert sein. Sie bearbeiten diese Datei mit einem Text-Editor (wie Kate oder KWrite), rufen diesen Editor aber nicht direkt auf, sondern verwenden das Programm visudo. Es bietet folgende Vorteile: Die Datei ist während der Bearbeitung "gesperrt", d. h. niemand anders kann schreibend darauf zugreifen, und nach dem Abspeichern und Verlassen prüft das Programm die geänderte Datei und weist auf eventuelle Fehler hin.

Um die sudo-Konfiguration zu ändern, werden Sie zunächst in der Shell zu root. Unter SuSE Linux geben Sie dazu sux ein, bei den anderen Distributionen su. (Bei SuSE Linux ist die su-Variante sux notwendig, damit Sie anschließend noch grafische Anwendungen starten können.) Im nächsten Schritt starten Sie visudo mit einem Kommando der folgenden Form:

EDITOR=kwrite /usr/sbin/visudo

Wollen Sie statt kwrite einen anderen Editor verwenden, ändern Sie den Aufruf entsprechend ab, z. B. in

EDITOR=kate /usr/sbin/visudo

Nach kurzer Wartezeit erscheint ein Editor-Fenster mit der geöffneten sudo-Konfigurationsdatei. Wir zeigen Schritt für Schritt, wie Sie einem Benutzer uneingeschränkte root-Rechte einräumen.

  1. Unter SuSE Linux 9.1 und auch bei einigen (aber nicht allen) Installation der Vorgängerversion 9.0 finden Sie in der Datei die zwei Zeilen
    Defaults targetpw
    %users ALL=(ALL) ALL
    
    Um diese auszukommentieren, setzen Sie je ein Rautezeichen "#" vor beide Zeilen.
  2. Gehen Sie dann zum Eintrag
    # User privilege specification
  3. Kopieren Sie die Zeile
    root    ALL=(ALL) ALL
  4. Ersetzen Sie in der Kopie den Namen root durch den Namen des Benutzers, der sudo-Rechte erhalten soll:
    # User privilege specification
    root    ALL=(ALL) ALL
    huhn    ALL=(ALL) ALL
  5. Speichern Sie die Datei und verlassen Sie den Editor.

Sehen Sie anschließend wieder den root-Prompt, hat alles geklappt. Sollten Sie sich an einer Stelle vertippt haben, beschwert sich visudo:

Warning: undeclared Host_Alias `LL' referenced near line 20
>>> sudoers file: syntax error, line 19 <<<
What now?

An dieser Stelle haben Sie die Wahl: Geben Sie e ein, um zurück in den Editor zu gelangen, x, um die gemachten Änderungen in /etc/sudoers zu verwerfen, oder Q, um das Programm zu verlassen und die fehlerhaften Einträge zu akzeptieren.

Der Kasten "Sudo-Konfiguration im Vi-Modus" zeigt, wie Sie mit dem Standard-Editor von visudo, dem Klassiker vi, arbeiten, wenn Sie die EDITOR-Variable nicht setzen wollen.

Sudo-Konfiguration im Vi-Modus

Setzt man die EDITOR-Variable nicht, ruft visudo den klassischen Editor vi auf. Während die meisten Linux-Einsteiger diesen mächtigen Editor als "Hexenwerk" empfinden, ist die Bedienung eigentlich gar nicht so schwer. Was vi von anderen Text-Editoren unterscheidet, sind seine zwei Betriebsarten: Es gibt einen Eingabe- und einen Befehlsmodus. In den Eingabemodus gelangen Sie u. a., indem Sie [I] tippen. Die Statuszeile am unteren Rand zeigt dann -- EINFÜGEN -- -- jetzt können Sie Text eingeben. Wenn Sie den Eingabemodus über [Esc] verlassen, befinden Sie sich im Befehlsmodus. Hier erledigen Sie über verschiedene Tastaturkombinationen Editier-Aufgaben. Mit der folgenden Anleitung führen Sie die gleichen Anpassungen durch, wie sie im Artikel beschrieben wurden -- nur eben mit dem Editor vi.

  1. Werden Sie auf der Konsole zunächst zum Administrator (su - und Eingabe des root-Passwortes).
  2. Geben Sie am Prompt den Befehl visudo ein.
  3. Finden Sie (bei SuSE Linux) die Zeilen
    Defaults targetpw
    %users ALL=(ALL) ALL
    
    kommentieren Sie diese aus. Dazu gehen Sie mit den Pfeiltasten auf die jeweilige Zeile, tippen [Umschalt-I] (um in den Eingabemodus zu gelangen und direkt am Zeilenanfang etwas einzufügen) und setzen anschließend ein Rautezeichen # vor die jeweilige Zeile. Um danach zurück in den Befehlsmodus zu wechseln, drücken Sie [Esc].
  4. Gehen Sie mit den Pfeiltasten bis zum Eintrag
    # User privilege specification
  5. Gehen Sie mit dem Cursor auf die nächste Zeile
    root    ALL=(ALL) ALL
    und drücken Sie die Tasten [Y], [Y], [P], um die Zeile zu duplizieren.
  6. Gehen Sie mit den Pfeiltasten auf das "r" von "root" in der neuen Zeile. Tippen Sie anschließend [C], [W] (Abkürzung für "change word"), um dieses eine Wort gegen ein neues auszutauschen. Sie befinden sich dann im Eingabemodus (zu erkennen an der Statuszeile am unteren Rand).
  7. Geben Sie den Namen des Benutzers ein, der sudo verwenden darf:
    # User privilege specification
    root    ALL=(ALL) ALL
    huhn    ALL=(ALL) ALL
  8. Drücken Sie [Esc], um in den Befehlsmodus zu gelangen, und danach [Z], [Z], um zu speichern und das Programm zu verlassen. Wollen Sie vi verlassen ohne zu speichern, geben Sie im Befehlsmodus :q! ein.

Die anschließende Überprüfung der geänderten Datei läuft genauso ab, wie es im Artikel beschrieben wird.

Jetzt darf der eingetragene Benutzer (im Beispiel ist das huhn) sudo für beliebige Kommandos nutzen, die dann mit Root-Rechten ausgeführt werden. Dazu stellen Sie das Kommando sudo einfach voran:

$ sudo less /var/log/messages

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these two things:

        #1) Respect the privacy of others.
        #2) Think before you type.

Password:

An dieser Stelle geben Sie Ihr Passwort ein -- nicht das root-Passwort. Für eine begrenzte Zeitdauer (Standard sind fünf Minuten) "merkt" sich das Programm sogar, dass Sie sich identifiziert haben. In dieser Zeit können Sie weitere Befehle zusammen mit sudo absetzen, ohne die Eingabe des Passwortes wiederholen zu müssen. Das Benutzerpasswort wird übrigens deswegen erfragt, damit nicht ein Fremder Ihren Computer mit Root-Rechten benutzen kann, wenn Sie z. B. eine kurze Pause machen und den Bildschirm nicht sperren. Der oben abgebildete Warnhinweis wird übrigens nur beim ersten sudo-Aufruf angezeigt, später erscheint nur noch die Passwortabfrage.

Indem Sie statt eines Befehls den Parameter -s an das sudo-Kommando anhängen, starten Sie eine root-Shell:

$ sudo -s
Password:
huhnix:/home/huhn #

Praktisch: Im Gegensatz zum Befehl su - können Sie nach sudo -c auch problemlos grafische Anwendungen starten (was bei SuSE Linux sonst nur über die Spezialvariante sux funktioniert). Und natürlich geht das auch in einem Rutsch: Möchten Sie Programme wie YaST nicht über das Menü starten, geben Sie als "Mitglied" von sudoers einfach sudo /sbin/yast2 auf der Kommandozeile oder in KDEs Schnellstarter, [Alt-F2], ein.

Auf die Schliche kommen

Auch der Einsatz des sudo-Kommandos wird vom System protokolliert. Sie finden die entsprechenden Einträge in der Regel in der Datei /var/log/messages, Fedora Core schreibt diese Hinweise nach /var/log/secure und nur die Fehlermeldungen nach messages.

Sep 11 21:10:47 huhnix sudo:  huhn : TTY=pts/6 ; PWD=/home/huhn ; USER=root ; COMMAND=/usr/bin/less /var/log/messages

Anders als beim Einsatz von su verrät die Log-Datei in diesem Fall auch, welches Programm mit Root-Rechten ausgeführt wurde. sudo meldet aber noch mehr: Wer versucht, sudo ohne die nötigen Berechtigungen zu verwenden, darf sich nicht wundern, wenn der Administrator genau darüber informiert ist und beizeiten freundlich auf die erfolglosen "Einbruchsversuche" hinweist. Dass ein Benutzer nicht berechtigt ist, sudo auszuführen, erfährt er auch gleich selbst durch eine entsprechende Meldung auf der Konsole:

$ sudo less /var/log/messages
Password:
peggy is not in the sudoers file.  This incident will be reported.

Zu Deutsch: "Benutzer peggy ist nicht berechtigt (nicht in /etc/sudoers eingetragen); dieser Vorfall wird an den Administrator gemeldet". Wenn jetzt der Benutzer root seine Mails das nächste Mal überprüft, sieht er genau, wann peggy erfolglos versucht hat, sudo aufzurufen -- die Mail hat darüber hinaus schön leserlich den Betreff "*** SECURITY information for huhnix ***" (Abbildung 2).

Abb. 2: "sudo" hat gepetzt: root erfährt per Mail, wer den Befehl unberechtigt ausgeführt hat.

Noch gezielter bitte!

Weiter oben haben Sie gesehen, wie Sie in /etc/sudoers einem Benutzer globale "Root-Rechte" geben. Es geht allerdings auch spezifischer: So können Sie z. B. einen einzigen Befehl für einen oder mehrere Benutzer freigeben. Wer etwa das Kommando zum Ausschalten bzw. Rebooten (/sbin/shutdown) für den Account huhn freischalten möchte, trägt in /etc/sudoers ein:

huhn ALL = /sbin/shutdown

Auf ähnliche Weise räumen Sie einer ganzen Gruppe von Benutzern bestimmte Rechte ein. Dazu geben Sie zunächst eine durch Kommata getrennte Liste von Benutzernamen gefolgt von ALL ein, danach ein Gleichheitszeichen und als letztes das Kommando:

petronella,huhn ALL = /sbin/shutdown

Immer auf der sicheren Seite?

Mit sudo lassen sich noch viele weitere Dinge anstellen -- Sie können die Sicherheit weiter herauf- oder heruntersetzen. So können Sie durch einen Eintrag der Form

Defaults timestamp_timeout = 0

Benutzer dazu zwingen, sich bei jedem sudo-Aufruf mit dem (eigenen) Passwort zu identifizieren. Passwörter lassen sich auf der anderen Seite auch ganz ausschalten: Mit dem Schlüsselwort NOPASSWD: haben schon viele Administratoren (unabsichtlich) Tür und Tore geöffnet.

Es gibt einige Punkte, die für den Einsatz von sudo anstelle von su sprechen: Das Root-Passwort bleibt in sicheren Händen, die gezielte Freigabe von Kommandos für einzelne Benutzer (-gruppen) ist praktisch und grafische Anwendungen lassen sich auch ganz unkompliziert mit root-Rechten starten. (hge)

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2014 Medialinx AG | Last modified: 2007-01-25 17:27

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]