sudo ohne Passwort

An sich ist das unter Ubuntu vorkonfigurierte sudo-Konzept vernünftig: Benutzer der sudo-Gruppe dürfen, nach der Eingabe ihres Passworts, Kommandos mit Administrator-Rechten ausführen. Was aber, wenn Sie möchten, dass alle Benutzer — oder auch nur einzelne Benutzer — bestimmte Kommandos auch ohne Passworteingabe ausführen dürfen? Denkbar wäre dies z.B. für apt-get, damit bestimmte Benutzer auch ohne Passwort-Eingabe bzw. ohne andere sudo-Rechte Programme installieren und Updates durchführen dürfen.

Vorsichtsmaßnahmen

Die Veränderung von /etc/sudoers ist gefährlich. Wenn Sie einen Syntaxfehler einbauen, ist ein weiterer sudo-Kommando unmöglich und Sie können den Fehler nicht mehr korrigieren! Um dieses Dilemma zu vermeiden, können Sie drei Vorsichtsmaßnahmen ergreifen:

  • Sie ändern /etc/sudoers nicht mit irgendeinem Editor, sondern mit visudo. Vor dem Speichern führt visudo einen Syntaxtest durch. Sie können die Datei erst speichern, wenn die Syntax korrekt ist. Wenn Sie keine Lust auf den Editor vi haben, stellen Sie vor der Ausführung von visudo den gewünschten Editor mit export EDITOR=$(which nano) ein, wobei Sie nano durch Ihren Lieblingseditor ersetzen.

  • Sie definieren vorübergehend ein Passwort für root. Das gibt Ihnen die Möglichkeit, sich unabhängig von sudo als root anzumelden, z.B. mit su -l oder in einer Textkonsole.

  • Sie lassen parallel zu Ihren Tests ein Terminalfenster offen, in dem Sie root-Rechte haben. Dieses Fenster schließen Sie erst, wenn Sie alle Tests erfolgreich abgeschlossen haben.

Syntax in /etc/sudoers

Die Grundsyntax für die Zeilen in /etc/sudoers lautet:

<wer>   <auf welchem Host>=(<als welcher Benutzer>) <darf was ausführen>

Die Zeile

kofler ALL=(ALL) ALL

bedeutet, dass kofler nach einer Authentifizierung auf jedem Rechner arbeiten kann (wobei /etc/sudoers normalerweise aber nur für den lokalen Host gilt; insofern ist das erste ALL nicht wirklich aussagekräftig), dass er als beliebiger Benutzer arbeiten kann (normalerweise wohl als root, aber prinzipiell auch als lp oder www-data oder unter welchem Account auch immer), und dass er schließlich jedes beliebige Kommando ausführen kann. Weitere Details liefert die sehr unübersichtliche man-Seite zu sudoers sowie dieser viel besser lesbare Beitrag auf unix.stackexchange.com.

sudo ohne Passwort

Zurück zur eigentlichen Fragestellung: Wie lässt sich erreichen, dass bestimmte Kommandos mit sudo auch ohne Passwortangabe ausgeführt werden können? Indem Sie zusätzlich das Schlüsselwort NOPASSWD verwenden. Die folgende Zeile bewirkt, dass huber die Kommandos sudo apt-get und sudo synaptic ausführen darf, ohne ein Passwort anzugeben.

huber ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/sbin/synaptic

Noch liberaler ist die folgende Zeile, die dies jedem Benutzer erlaubt:

ALL ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/sbin/synaptic

Es ist Ihnen sicher klar, dass man mit apt-get jedes System vollständig zerstören kann, z.B. durch die Deinstallation systemrelevanter Pakete. Insofern sind die obigen Einstellungen in /etc/sudoers nur zweckmäßig, wenn Sie den betreffenden Personen vertrauen können …

Raspbian (Raspberry Pi)

Radikal unsicher sind die Defaulteinstellungen unter Raspbian: Dort kann der Benutzer pi jedes administratives Passwort mit sudo ohne Passwort ausführen.

### Defaultkonfiguration in /etc/sudoeres unter Raspbian
...
pi ALL=(ALL) NOPASSWD: ALL

Da das Passwort für pi vordefiniert und öffentlich bekannt ist, heisst das: Jede Raspbian-Installation, bei der SSH aktiviert ist und das pi-Passwort in der Defaulteinstellung belassen wurde, steht offen wie ein Scheunentor.

Das ist definitiv nicht empfehlenswert, selbst wenn das Gerät nur im lokalen Netzwerk eingesetzt wird. Abhilfe: Ändern Sie zumindest das Passwort von pi. Selbst entferne ich auch NOPASSWD: aus /etc/sudoers, obwohl das natürlich unbequem ist.

bash-Scripts von PHP aus mit sudo ausführen

Sicherheitstechnisch ist es selten eine optimale Lösung, aber manchmal lässt es sich schwer vermeiden: Sie wollen von einer PHP-Seite aus administrative Aufgaben erledigen und müssen daher ein Shell-Script mit sudo ausführen. Damit das klappt, müssen Sie zuerst feststellen, unter welchem Account der Webserver Apache läuft (ps axu). Unter Debian und Ubuntu ist dies www-data. Nun erlauben Sie diesem Account in /etc/sudoers, das betreffende Script ohne Passwort auszuführen:

### Defaultkonfiguration in /etc/sudoeres unter Raspbian
...
# in /etc/sudoers
# erlaubt www-date die Ausführung eines Scripts
www-data ALL=(ALL) NOPASSWD: /etc/myscripts/do-whatever

In das PHP-Script können Sie nun den folgenden Code einbauen:

$output = shell_exec("sudo /etc/myscripts/do-whatever");
echo "\n<pre>$output</pre>\n";

3 Gedanken zu „sudo ohne Passwort“

  1. Auf einem von uns gemieteten Server, der von den Admin des Hosters eingerichtet wurde, ist folgender Eintrag zu finden:
    username ALL=(ALL) NOPASSWD: ALL

    username = der einzige reguläre Account, heißt natürlich anders.

    Login ist nur per SSH key möglich, Root-Login off. Trotzdem macht mich das ehrlich gesagt etwas nervös. Wie schätzen Sie diese Konfiguration ein?

    1. Solange niemand Zugang zu Ihrem SSH-Key hat und die Konfiguration so funktioniert, wie Sie es beschreiben, sehe ich kein Problem. Stiehlt aber z.B. jemand Ihr Notebook mit dem SSH-Key, dann wäre ALL = (ALL) ALL im Vergleich zu NOPASSWD: zumindest eine zusätzliche Hürde.

      Die Frage ist ja umgekehrt: Ohne NOPASSWD: ist die Konfiguration definitiv sicherer. Der einzige Nachteil besteht darin, dass Sie vor sudo-Kommandos Ihr Passwort angeben müssen. Damit kann man leben. Warum also nicht NOPASSWD: rauslöschen? (Beachten Sie die im Beitrag beschriebenen Vorsichtsmaßnahmen, damit Sie sich nicht selbst ausschließen, z.B. weil sich herausstellt, dass Ihr Passwort gar nicht funktioniert …)

      1. Vielen Dank für die schnelle und ausführliche Antwort. So werde ich es machen.
        (Und ganz nebenbei auch Danke für die starken Linux-Bücher)

Kommentare sind geschlossen.