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 mitvisudo
. Vor dem Speichern führtvisudo
einen Syntaxtest durch. Sie können die Datei erst speichern, wenn die Syntax korrekt ist. Wenn Sie keine Lust auf den Editorvi
haben, stellen Sie vor der Ausführung vonvisudo
den gewünschten Editor mitexport EDITOR=$(which nano)
ein, wobei Sienano
durch Ihren Lieblingseditor ersetzen. -
Sie definieren vorübergehend ein Passwort für
root
. Das gibt Ihnen die Möglichkeit, sich unabhängig vonsudo
alsroot
anzumelden, z.B. mitsu -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";
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?
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 zuNOPASSWD:
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 vorsudo
-Kommandos Ihr Passwort angeben müssen. Damit kann man leben. Warum also nichtNOPASSWD:
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 …)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)