Zur Navigation

Mit PHP Shell mit sudo ausführen funktioniert nicht

1 Tom12



Hallo,

Ich habe auf meinem Webserver ein Script geschrieben mit dem ich per shell_exec() ein Python Script mit sudo rechten ausführe. (Ja, ich weiß, es gibt weitaus sauberere Möglichkeiten aber dies ist jetzt zu umständlich zu erklären)

shell_exec("sudo python /home/pi/my_script.py);

Jetzt ist leider das Problem, dass das Script nicht ausgeführt wird. Übers Internet habe ich herrausgefunden, dass der User www-data das Script ausführt und ich dem User also ersteinmal erlauben muss sudo benutzen zu dürfen.

Dies habe ich auch schon hier angepasst:

Defaults   env_reset
Defaults   mail_badpass
Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

root   ALL=(ALL:ALL) ALL
www-data ALL=(ALL:ALL) ALL

%sudo   ALL=(ALL:ALL) ALL

Da ich der einzige bin der Zugriff auf den Server hat, ist das auch vollkommen ok (auch wenn das eine Sicherheitslücke ist...).

Leider verstehe ich nicht, warum das Script nicht funktioniert.

Ich würde mich über eine Antwort freuen ^^

29.08.2019 19:18

2 Jörg Kruse

Im Return von shell_exec() könnten vielleicht auch Fehlermeldungen enthalten sein:

echo shell_exec("/usr/bin/sudo /usr/bin/python /home/pi/my_script.py");

Ich würde die vollen Pfade angeben, da diese www-data möglicherweise unbekannt sind. Edit: und da fehlte noch ein " am Ende

Einträge in der /etc/sudoers lassen sich auch auf einzelne Befehle beschränken, so dass das Sicherheitsloch, welches man aufreißt, nicht ganz so groß ist .

Vermutlich scheitert die Ausführung auch an der fehlenden Passworteingabe durch www-data. Mit dem Tag NOPASSWD kann die Passwortabfrage deaktiviert werden:

www-data ALL = NOPASSWD: /usr/bin/python /home/pi/my_script.py


29.08.2019 19:50 | geändert: 29.08.2019 19:54

1 Forenmitglied fand diesen Beitrag gut

3 Tom12

www-data ALL = NOPASSWD: /usr/bin/python /home/pi/my_script.py

Hallo, woher weiß ich denn ob mein Script mit:
/usr/bin/python
/usr/bin/python2
/usr/bin/python2.7
/usr/bin/python3
/usr/bin/python3.7
/usr/bin/python3.7m
/usr/bin/python3m

ausgeführt wird?

07.09.2019 16:29

4 Jörg Kruse

Wenn du das Script normalerweise mit `python` ausführst, dann wird /usr/bin/python verwendet, da sich /usr/bin vermutlich in deinem Pfad befindet.

Unter Debian 10 ist /usr/bin/python ist ein Symlink auf /usr/bin/python2, welches wiederum auf /usr/bin/python2.7 verweist. Wenn man dort python3 verwenden möchte, muss man das Binary explizt als /usr/bin/python3 aufrufen.

Du kannst dir die Verlinkung auf deinem System mit `ls -l` anzeigen lassen:

ls -l /usr/bin/python*

07.09.2019 16:56 | geändert: 07.09.2019 16:56

1 Forenmitglied fand diesen Beitrag gut

5 Tom12

Hallo,
Leider klappt das ganze immer noch nicht. Der Befehl wird einfach nicht ausgeführt. Gibt es vielleicht eine Möglichkeit, dass der User generell sudo ausführen darf, also unabhängig davon ob er jetzt Python ausführt oä.?

Und dann noch eine Frage. Muss ich nach dem bearbeiten von "visudo" den Raspberry Pi neustarten oder reicht das einfache abspeichern auch aus (hab beides probiert, finde das neustarten zum ständigen testen nur etwas aufwändig)

Ich hoffe das klappt band. Ich sitzte da jetzt schon mehrere Wochen dran :/

Vielen Dank aber schoneinmal

15.09.2019 15:16

6 Jörg Kruse

Gibt es vielleicht eine Möglichkeit, dass der User generell sudo ausführen darf, also unabhängig davon ob er jetzt Python ausführt oä.?

www-data ALL=(ALL) NOPASSWD: ALL

Und dann noch eine Frage. Muss ich nach dem bearbeiten von "visudo" den Raspberry Pi neustarten oder reicht das einfache abspeichern auch aus

Ich denke, der Apache sollte neu gestartet werden, damit er dann mit den neuen Rechten agieren kann.

Es kann auch sein, dass das Python-Script selbst Umgebungsvariabeln enthält, die www-data unbekannt sind. Du kannst das Script auch testweise als User www-data in der Shell ausführen und schauen, ob es hierbei schon zu Problemen kommt:

sudo -u www-data /usr/bin/python /home/pi/my_script.py

16.09.2019 09:39

1 Forenmitglied fand diesen Beitrag gut

7 Tom12

Ich habe jetzt das in visudo hinzugefügt:
www-data ALL=(ALL) NOPASSWD: ALL
Den Raspberry Pi einmal neugestartet und dann mal eine test.py Datei erstellt mit diesem Inhalt:
import os
if not os.geteuid() == 0:
    print('You need root rights to start the script')

print('FERTIG')
Wenn ich sie so ausführe
python test.py
, bekomme ich diesen Output:
You need root rights to start the script
FERTIG

Wenn ich sie mit sudo ausführe
sudo python test.py
, bekomme ich diesen Output:
FERTIG

Dementsprechen, sollte wenn alles klappt als Output nur FERTIG kommen.

Jetzt habe ich den Code einmal ausgeführt:
sudo -u www-data python test.py
Als Output kam dabei das heraus:
You need root rights to start the script
FERTIG

Also hat er aus irgendeinem Grund das sudo hier nicht ausgeführt. Ich bin dann davon ausgegangen, dass sich das sudo nur darauf bezieht, dass der hintere Code als www-data ausgeführt werden soll. Also habe ich genau das gleiche noch einmal so ausprobiert:
sudo -u www-data sudo python test.py
Dabei erhielt ich nun das als Output, wobei ich nach dem Passwort von www-data aufgefordert wurde.
Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat.  Normalerweise läuft es auf drei Regeln hinaus:

    #1) Respektieren Sie die Privatsphäre anderer.
    #2) Denken Sie nach, bevor Sie tippen.
    #3) Mit großer Macht kommt große Verantwortung.

[sudo] Passwort für www-data:

Das wunderte mich jetzt etwas, da ich nie ein Passwort festgelegt hatte und ich auch eigentlich dachte, dass man kein Passwort dafür benötigt.

Das eigentliche Problem ist eher, wenn ich jetzt an das direkte Problem (Also per Apache/PHP) das ganze probiere zu starten.

dafür habe ich diese Datei erstellt /var/www/example.com/httpd/inc/test.php, die sich über https://example.com/inc/test.php aufrufen lässt.
Diese Datei hat diesen Inhalt:
<?php
	echo shell_exec("sudo python /home/pi/Desktop/test.py");
	echo "<br>test";

Wenn ich jetzt https://example.com/inc/test.php aufgerufen habe, war das der Ihnalt der Seite:
test

Zum Vergleich, habe ich hier das sudo einmal entfernt:
<?php
	echo shell_exec("python /home/pi/Desktop/test.py");
	echo "<br>test";

Da war das der Output:
You need root rights to start the script FERTIG
test

Ich weiß leider nicht woran das Problem liegt.


Die Datei /home/pi/Desktop/test.py hat übrigends diese Berechtigungen:



Das hier ist der vollständige Inhalt der visudo Datei:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
www-data ALL=(ALL) NOPASSWD: ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

29.09.2019 10:38

8 Jörg Kruse

Ist www-data Mitglied der Gruppe sudo? Verwendet wird die immer letzte passende sudoers Direktive, bei Mitgliedern der Gruppe sudo ist es diese:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

In dem Fall wird nach dem Passwort gefragt.

Wenn du die Reihenfolge folgendermaßen änderst, gilt für www-data in jedem Fall die Regel mit dem Schlüsselwort NOPASSWD:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

www-data ALL=(ALL) NOPASSWD: ALL

29.09.2019 11:47

1 Forenmitglied fand diesen Beitrag gut

9 Jörg Kruse

Test

Das Forum scheint einen Beitrag verschluckt zu haben :-/

@Tom12

hattest du beim Posten eine Fehlermeldung?

30.09.2019 17:32 | geändert: 30.09.2019 17:35

10 Tom12

Hallo,
Ja, irgendwie wurde der Post verschluckt.
Auf jeden Fall klappt jetzt alles und ich wollte mich dafür einmal bedanken. Hab' das Forum schon weiterempfohlen^^

Edit: Ich habe zwar keine Fehlermeldung bekommen, allerdings habe ich Emojis in dem Post verwendet. Vielleicht lag das ja daran

01.10.2019 10:14 | geändert: 01.10.2019 10:15