Berechtigung zum Ausführen bestimmter Befehle durch sudo als WWW-Data-Benutzer ohne Kennwort

Berechtigung zum Ausführen bestimmter Befehle durch sudo als WWW-Data-Benutzer ohne Kennwort

Ich habe einen Webserver, der auch Internetradio abspielt. Als WWW-Datenbenutzer möchte ich einige Befehle ausführen, zum Beispiel habe ich dies in/etc/sudoersDatei:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer

Und über PHP kann ich die Lautstärke ohne Verwendung eines Kennworts ändern, indem ich:

exec('sudo -u user amixer set Master 3%-');

Und:

exec('sudo -u user amixer set Master 3%+');

Aber jetzt möchte ich meinen eigenen Dienst neu starten können, indem ich den folgenden Befehl ausführe:

exec('sudo -u user service servicename restart');

Also habe ich versucht:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service

Und das:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service

Und sogar das:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data        ALL=(ALL) NOPASSWD: /bin/service

Aber nichts davon scheint zu funktionieren. Bitte helfen Sie mir.


Sorry Leute - mein Fehler. Ich habe einige Änderungen vorgenommen, versucht, von /sbin nach /bin zu verlinken

Jetzt habe ich es geändert in:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service

Und es funktioniert! Danke! Thema geschlossen.

Antwort1

Seien Sie vorsichtig mit Ihrer Lösung: Sie können auf diese Weise jeden Dienst starten, stoppen oder neu starten!

Erstellen Sie besser ein Shell-Skript, das diesen Befehl ausführt:

echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart

Gewähren Sie ausreichende Berechtigungen (550 bedeutet, dass Root und die Gruppe www-Daten lesen und ausführen können, niemand schreiben darf)

sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart

Und erlauben Sie Apache, bei diesem Skript „sudo“ auszuführen:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart

Antwort2

Das ist, was ich letztendlich gemacht habe:

  1. Installieren Sie Apache2 durch Ausführensudo apt-get install apache2
  2. Stellen Sie sicher, dass Apache CGI-Skripte ausführen darf, indem Siesudo a2enmod cgi
  3. Starten Sie Apache neusudo service apache2 restart
  4. Überprüfen Sie, ob ich Bash-Skripte ausführen kann, indem Sie das folgende Skript erstellen unter/usr/lib/cgi-bin/test.sh

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(whoami)
    
    # headers
    echo "Content-type: text/plain"
    echo ""
    
    # body
    echo "Today is $OUTPUT"
    echo "Current user is $USR"
    
  5. Machen Sie das Skript ausführbarchmod +x /usr/lib/cgi-bin/test.sh

  6. Überprüfen Sie, ob ich das Skript ausführen kann. curl localhost/cgi-bin/test.shIch erhalte die folgende Antwort:

     Today is Wed Sep  6 12:19:34 PDT 2017 
     Current user is www-data
    
  7. Da der Benutzer www-data ist, füge ich diesen Benutzer dann als sudoer hinzu. Anschließend ändere ich die Datei, /etc/sudoersindem ich am Ende diese Zeile hinzufüge:

    www-data ALL=(ALL) NOPASSWD: ALL

  8. Nun sollte dieser Benutzer Root-Rechte haben. Dann ändere ich mein test.sh-Skript wie folgt:

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(sudo whoami)
    
  9. Wenn Sie dann erneut eine Get-Anfrage ausführen, sollten Sie die folgende Antwort sehen localhost/cgi-bin/test.sh:

    Today is Wed Sep  6 12:28:38 PDT 2017
    Current user is root
    

verwandte Informationen