ubuntuusers.de

Shell Skript als anderer User über URL ausfürhen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Hans3004

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Hallo zusammen,

als User test habe ich folgendes Perl-Skript geschrieben:

1
2
3
4
5
<?php
  echo "whoami"
  echo shell_exec('whoami');
  echo shell_exec('touch /var/www/test/test.txt');
?>

Das Skript gibt aus wer ich bin und legt mit touch die Datei test.txt im Verzeichnis test an. Das Skript hat folgende Rechte (uid Bit gesetzt)

-rwsrwxrwx 1 test test 255 2012-01-28 19:07 test.php

Wird das Skript als User test ausgeführt so funktioniert alles wunderbar:

-rw-r--r-- 1 test test    0 2012-01-28 20:52 test.txt

Ruft man das Skript nun aber über eine URL auf (Webserver ist lighttpd) so wird über whoami immer www-data ausgegeben und die Datei nicht angelegt.

Weiß jemand, wie man das Skript als User test über den Browser ausführen kann.

Auch ein Versuch mit sudoers hat nicht zum Erfolg geführt, wobei folgende Varianten getestet wurden:

www-data ALL=(root) NOPASSWD: /var/www/test/test.php
www-data ALL=(test) NOPASSWD: /var/www/test/test.php

Wo liegt der Fehler?

Vielen Dank, Hans

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

normalerweise ist das kein Fehler. Ein Web-Server übernimmt i.d.R. nicht die Dateieigenschaften. Er hat meist einen integrierten PHP-Interpreter und alles läuft unter den Rechten des Web-Servers, zieht sich also die PHP-Datei nur zwecks lesendem Zugriff rein.

jakon Team-Icon

Lokalisierungsteam

Anmeldungsdatum:
16. November 2009

Beiträge: 419

@Hans3004: ShellskriptePerlskriptePHP-Skripte … Außerdem fehlt da ein Semikolon in der zweiten Zeile. 😉

Hans3004

(Themenstarter)

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Gibt es ne andere Möglichkeit über ne URL ein Skript mit anderen Rechten auszuführen bzw. die Datei zu erstellen? Apache bietet wohl ne Möglichkeit über suexec an... Aber ligthy?

grumpy_grizzly

Avatar von grumpy_grizzly

Anmeldungsdatum:
26. Dezember 2011

Beiträge: Zähle...

Wohnort: Stockholm

Hans3004 schrieb:

Wird das Skript als User test ausgeführt so funktioniert alles wunderbar: Ruft man das Skript nun aber über eine URL auf (Webserver ist lighttpd) so wird über whoami immer www-data ausgegeben und die Datei nicht angelegt.

Das dürfte daran liegen, dass der Webserver nicht das Skript direkt aufruft sondern den php-interpreter startet und dieser das Skript ausführt. Deshalb wird das suid-bit nicht beachtet. Wenn du www-data Schreibrechte im Verzeichnis gibst sollte er die Datei erstellen können.

Auch ein Versuch mit sudoers hat nicht zum Erfolg geführt, wobei folgende Varianten getestet wurden:

www-data ALL=(root) NOPASSWD: /var/www/test/test.php
www-data ALL=(test) NOPASSWD: /var/www/test/test.php

Also die markierte Zeile auf jeden Fall wieder löschen, www-data irgendwas als root ausführen zu lassen ist keine gute Idee.

Wo liegt der Fehler?

Erklärung siehe oben. Damit das funktioniert müsste 'sudo -u test /var/www/test/test.php' ausgeführt werden. Hast du mal probiert das mit 'shell_exec()' auszuführen? Oder eventuell 'sudo -u test php-cgi /var/www/test/test.php' Dann muss natürlich auch der Eintrag in sudoers auf "php-cgi" geändert werden. Oder eventuell funktioniert aufgrund des gesetzten suid-bits auch 'shell_exec(/var/www/test/test.php)'. Vielleicht liege ich auch komplett daneben, mit php kenne ich mich nicht besonders gut aus.

dAnjou

Avatar von dAnjou

Anmeldungsdatum:
8. Oktober 2007

Beiträge: 872

Wohnort: Berlin

Würde es nicht auch reichen, wenn du der erstellten Datei 777er Rechte gibst?

Hans3004

(Themenstarter)

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Danke für Eure Antworten... Fast alle von Euren Vorschlägen hatte ich getestet wie z.B. das Skript ohne uid Bit aufzurufen oder dem Verzeichnis alle Rechte einräumen:

drwxrwxrwx 4 test test 0 2012-01-28 20:52 test

Der erstellten Datei möchte ich keine Rechte einräumen, das sie vom Skript erstellt werden soll.

Was ich nicht verstehe: Selbst wenn der php Code kopiert wird, dann müsste doch die Datei in einem Verzeichnis, wo alle Rechte gesetzt sind, erstellt werden.

Im Moment schaut's so aus:

test Verzeichnis hat alle Rechte
das PHP-Skript hat alle Rechte
Das touch-Kommando wird mit shell_exec als user test ausgeführt: echo shell_exec('sudo -u test touch /var/www/test/test.txt');
In sudoers steht folgendes drin: www-data ALL=(test) NOPASSWD: /var/www/test/test.php

Ich hatte das ganze auch schon mit Shellskripten ausprobiert... Der Effekt ist immer gleich: Die Datei wird nicht erstellt!

Die Browser-Ausgabe ist stets whoami: www-data, auf Kommandozeile klappt alles

Gerade noch getestet: Wenn man sich über root als www-data einloggt und das Skript mit dem touch-Kommando ohne sudo ausruft (also echo shell_exec('touch /var/www/test/test.txt'); ) dann wird die Datei von www-data angelegt (Natürlich nur wenn www-data die entsprechenden Verzeichnis Rechte besitzt):

 -rw-r--r-- 1 www-data www-data 0 2012-02-01 11:16 test.txt 

Aber das Anliegen der ganzen Sache ist ja, die Datei als User test auszuführen... Zu diesem Zweck dient doch sudoers...

grumpy_grizzly

Avatar von grumpy_grizzly

Anmeldungsdatum:
26. Dezember 2011

Beiträge: 263

Wohnort: Stockholm

Hans3004 schrieb:

Im Moment schaut's so aus:

test Verzeichnis hat alle Rechte
das PHP-Skript hat alle Rechte
Das touch-Kommando wird mit shell_exec als user test ausgeführt: echo shell_exec('sudo -u test touch /var/www/test/test.txt');
In sudoers steht folgendes drin: www-data ALL=(test) NOPASSWD: /var/www/test/test.php

Ja ist doch kein Wunder dass es nicht funktioniert. Mit dieser Konfiguration erlaubst du dem Benutzer www-data das Kommando 'sudo -u test /var/www/test/test.php' ohne Eingabe eines Passworts auszuführen. Du rufst aber auf 'sudo -u test touch'. Siehst du den Unterschied?

Also hast du wirklich probiert was ich geschrieben habe?

sudo -u test /var/www/test/test.php

Sonst leg doch mal ein Shell-script (/usr/bin/test.sh) an mit diesem Inhalt:

1
php-cgi /var/www/test/test.php

'chmod a+x /usr/bin/test.sh' und Eintrag in sudoers nicht vergessen.

www-data ALL=(test) NOPASSWD: /usr/bin/test.sh

Dann rufst du es auf mit 'sudo -u test /usr/bin/test.sh'.

Hans3004

(Themenstarter)

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Hi,

danke für die vielen Hinweise. So wie ich mir das vorstelle funktioniert es leider noch nicht. Das aufzurufende Skript soll ja nicht in /usr/bin/ liegen, sondern in /var/www/... → Ist aber glaub auch nicht elementar wichtig...

Ich hab jetzt ein Shellskript /var/www/test/test.sh mit folgendem Inhalt angeleget:

php-cgi /var/www/test/test.php

Die Rechte sind passend gesetzt und der sudoers Eintrag ist gemacht: www-data ALL=(test) NOPASSWD: /usr/bin/test.sh Das test.php hat den Inhalt wie gehabt:

<?php
  echo "whoami: ";
  echo shell_exec('whoami');
  echo shell_exec('touch /var/www/test/test.txt');
?>

Leider immer noch kein Ergebnis (auch nicht mit sudo -u test touch usw...)

Die einzige Möglichkeit, die bis jetzt funktioniert ist folgende:

Eintrag in sudoers:

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

Shellskript in /var/www/test/test.sh

#!/bin/sh
echo "Hallo"
touch /var/www/test/test1.txt
sudo -u test touch /var/www/test2.txt

Nur test2.txt wird angelegt:

-rw-r--r-- 1 test test    0 2012-02-03 01:07 test2.txt

Das Ziel ist aber wie beschrieben, den touch Befehl über das php oder shell Skript als user test auszuführen OHNE diesen sudoers Eintrag

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

grumpy_grizzly

Avatar von grumpy_grizzly

Anmeldungsdatum:
26. Dezember 2011

Beiträge: 263

Wohnort: Stockholm

Das ist aber auch zum Verzweifeln mit dir! 😉

Ich hab jetzt ein Shellskript /var/www/test/test.sh mit folgendem Inhalt angeleget:

sudoers Eintrag ist gemacht: www-data ALL=(test) NOPASSWD: /usr/bin/test.sh

Fällt dir nichts auf?

Also nochmal der Reihe nach, das Problem ist dass der http-Server den php-Interpreter startet und damit das php-Skript ausführt. Deshalb läuft es immer als Benutzer www-data. Möchtest du ein bestimmtes Skript als anderer Benutzer starten, musst du www-data erlauben den php-Interpreter als dieser Benutzer ohne Passwort zu starten → Eintrag für php-cgi in /etc/sudoers.

Damit das Starten aus php heraus funktioniert brauchst du ein Starter-Skript, in dem muss ausgeführt werden

shell_exec('sudo -u test php-cgi /var/www/test/test.php');

Du benötigst also ein zweites Skript, dass diesen Befehl ausführt. Wenn du den in das test.php schreibst bekommst du ja eine Endlosschleife.

Alternativ könntest du auch wie bereits erwähnt ein Shell-Skript anlegen und darüber 'php-cgi /var/www/test/test.php' aufrufen. Dann benötigst du einen Eintrag für das Skript in /etc/sudoers und auch wieder ein php-Starterskript dass 'sudo -u test test.sh' ausführt.

In weiß ja nicht wie du dir das vorstellst, aber ein Eintrag in /etc/sudoers ist nur die Erlaubnis für einen Benutzer ein bestimmtes Programm als ein Anderer auszuführen. Damit das auch tatsächlich passiert musst du den Befehl mit sudo aufrufen. Und in der sudoers muss der Befehl stehen der mit sudo aufgerufen wird und kein anderer. Wenn test.sh mit den Rechten eines Benutzers läuft werden auch alle daraus gestarteten Prozesse mit den Rechten dieses Benutzers laufen.

Hans3004

(Themenstarter)

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Hallo nochmal... War wohl gestern etwas spät... Sorry für den Vertipper in sudoers

Hier auf jeden Fall die Lösung wie von grumpy grizzly gepostet (als Shell Skript):

Erstes Skript (das über den Browser aufgerufen wird) /var/www/test/start.sh

#!/bin/sh
echo "Start"
sudo -u test /var/www/test/test.sh

Zweites Skript /var/www/test/test.sh

#!/bin/sh
echo "Test"
touch /var/www/test/test.txt

Eintrag in sudoers

www-data ALL=(test) NOPASSWD: /var/www/test/test.sh 

Nochmal vielen Dank für Eure Geduld ☺

grumpy_grizzly

Avatar von grumpy_grizzly

Anmeldungsdatum:
26. Dezember 2011

Beiträge: 263

Wohnort: Stockholm

Hans3004 schrieb:

Hier auf jeden Fall die Lösung wie von grumpy grizzly gepostet (als Shell Skript):

Naja nicht so ganz was ich gepostet habe. Den Befehl 'sudo -u test /var/www/test/test.sh' brauchst du doch nur aus deinem php-Skript heraus aufzurufen. Aber das ist erstmal Nebensache. Was soll denn eigentlich im Endeffekt bei der ganzen Sache passieren? Ich meine das mit dem 'touch' usw. war doch bestimmt nur zum Testen?

Hans3004

(Themenstarter)

Anmeldungsdatum:
14. August 2009

Beiträge: 38

Hallo grumpy grizzly,

der eigentliche Zweck der "Übung" ist es, einen von ssh unabhängigen Zugriff auf verschiedene Server Funktionen zu bekommen. Sei es um interne Server Statistiken auszugeben oder irgendwelche Rechte zu setzen. Bisher musste man sich immer per ssh einloggen - nun geht es dank der vielen Tipps ganz einfach über den Browser (es sind aber keine wichtigen oder rechenintensiven Funktionen).

Viele Grüße, Hans

Antworten |