--- title: sudo ohne Passwort | kofler.info source: https://kofler.info/sudo-ohne-passwort/ tags: - IT/OS/Linux - IT/Tools/Shell --- 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: ```sudoers =() ``` Die Zeile ```sudoers 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](http://unix.stackexchange.com/questions/18877) 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. ```sudoers huber ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/sbin/synaptic ``` Noch liberaler ist die folgende Zeile, die dies jedem Benutzer erlaubt: ```sudoers 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. ```sudoers ### 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: ```sudoers ### 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: ```php $output = shell_exec("sudo /etc/myscripts/do-whatever"); echo "
$output
"; ```