ubuntu + XAMPP: CGI wird ausgeführt als nobody

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 26. Januar 2005, 21:29

Normalerweise werden CGI-Skripte immer mit dem User nobody ausgeführt... wie bekomme ich es hin, das mein Python-CGI unter einem anderen User läuft???

Ich möchte eigentlich nur per chmod ein paar Dateien im httpd Verzeichnis andere Rechte zuweisen... Aber per nobody habe ich dazu nicht die nötigen Rechte...

Ich kann mir vorstellen Username/Passwort im Klartext in's CGI Skript zu schreiben, aber ich weiß nicht, wie ich damit was anfangen kann... sowas wie popen("sudo Username/Passwort chmod 777 * -R") funktioniert ja nicht so einfach...

EDIT: bin gerade auf suexec gestoßen...
Gast

Mittwoch 26. Januar 2005, 22:02

Hat es ich nun erledigt?
Wenn ja, bitte code posten (würde mich interessieren).

Gruss, Dominik
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 26. Januar 2005, 22:08

Ne, suexec, hat damit wohl zu tun, unter welchem User CGI-Skripte ausgeführt werden: http://httpd.apache.org/docs/suexec.html

Aber das hilft mir erstmal nicht weiter...


Ich könnte natürlich in der httpd.conf User und Group einfach auf root ändern, aber das wäre sicherlich ein wenig unschön...
Gast

Mittwoch 26. Januar 2005, 23:05

Ich bin leider noch nit wirklich zum experimentieren gekommen, da ich den Server meinen Kollegen, der auszieht ersetzen muss.

Im Moment habe ich eine Shell in Python in einer Shell ;) (kein CGI)

Code: Alles auswählen

import os

cmd = "/bin/bash -i"
print cmd
bash = os.popen(cmd, "r")
Ich glaube zwar nicht das das gross weiter hilft, aber man weiss ja nie.

Gruss, Dominik
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 27. Januar 2005, 07:16

Zumindest für meinem Heimserver habe ich eine mögliche Lösung gefunden: Mittels suexecusergroup kann man bestimmen mit welchem User/Gorup CGI's Ausgeführt werden.

s. http://httpd.apache.org/docs-2.0/mod/mo ... cusergroup

Man könnte sich einen Virtuellen https Server einrichten und nur bei diesem suexecusergroup benutzen...
Gast

Donnerstag 27. Januar 2005, 13:37

Mal ein versuch:

Code: Alles auswählen

import os
cmd = 'su username -c "chmod 777 * -R"'
in = os.popen(cmd, "w")
in.write(passwd)
in.close()[/python]
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Freitag 28. Januar 2005, 10:50

Im neuen Python 2.4 hat es neu ein subprocess Module.
Wirf mal einen Blick darauf.

Gruss, Dominik
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. Januar 2005, 11:01

Hier mal ein Versuch mit subprocess:

Code: Alles auswählen

import subprocess

user = "root"
password = "[i]passwort[/i]"

process = subprocess.Popen('"su %s -c "id"' % user,
                shell=True,
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE )


process.stdin.write( password )
print process.stdout.read()
Allerdings geht's so nicht... Ich erhalte bei process.stdin.write() den Fehler:

Code: Alles auswählen

IOError: [Errno 32] Broken pipe
      args = (32, 'Broken pipe')
      errno = 32
      filename = None
      strerror = 'Broken pipe'
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 31. Januar 2005, 13:34

Broken pipe.. heißt glaube ich, dass dir der Unterprozess zu schnell wegstirbt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. Januar 2005, 14:27

Eine Idee, wie man es umgehen kann???
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 31. Januar 2005, 15:36

Vielleicht an den Popen() Argumenten tunen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. Januar 2005, 19:37

Also mit dem subprocess() bin ich nicht weiter gekommen... Ich hab mit die möglichen Parameter und Methoden angeschaut, aber so richtig funktioniert es nicht...

Hab zwar nun keinen Fehler mehr, aber auch keine Ausgabe vom Linux-Befehl "id":

Code: Alles auswählen

user = "root"
password = "[i]RootPasswort[/i]"
cmd = 'su %s -c id' % user

process = subprocess.Popen( cmd,
                bufsize = 1,
                shell=True,
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE )

process.stdin.write( password )
print "XXX",process.stdout.read(),"XXX"
Die Ausgaben:

Code: Alles auswählen

XXX XXX

Es gibt aber auch in Python 2.4 ein "normales" popen() Damit komme ich weiter:

Code: Alles auswählen

user = "root"
password = "[i]RootPasswort[/i]"
cmd = 'su %s -c id' % user

r, w, e = popen2.popen3( cmd )

w.write( password )

print r.read()
print e.read()

w.close()
r.close()
e.close()


print "OK"
Die Ausgaben:

Code: Alles auswählen

su: must be run from a terminal
Und bei w.clode() gibt's wieder ein Brocken Pipe:

Code: Alles auswählen

IOError: [Errno 32] Broken pipe
      args = (32, 'Broken pipe')
      errno = 32
      filename = None
      strerror = 'Broken pipe'
Das scheint, bis auf den close()-Fehler zu funktionieren!!! Nur der SU Befehl scheint nicht so der richtige zu sein :(

Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 31. Januar 2005, 20:45

jens hat geschrieben:Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
sudo
ist sowieso viel sicherer, muss dafür aber auch konfiguriert werden. Da muss man das root passwort nichtmal wissen, man kann auch für sudo Befehle andere Passwörter setzen
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. Januar 2005, 20:58

sudo scheint sich anders zu verhalten... Dabei kann man anscheinend nicht dass Passwort übergeben...

Wenn ich das Skript aus einem nicht root Terminal aufrufe, erhalte ich bei SU auch den Hinweis "su : Muss von einem Terminal gestartet werden". Bei SUDO erscheint immer die Eingabe für das Passwort... Also wird es per write() nicht übergeben :(

Es gibt für SUDO nocht den Parameter -S, dann übernimmt er ein Passwort durch den stdin... Klappen tut's aber nicht :(


Ich frage mich gerade, ob ich nicht einfach statt Apache mit Python selber einen Server machen soll, dann hab ich glaub ich keine Probleme... Aber es heißt immer das der eingebaute Server unsicher wäre... In wie fern stimmt das???
Eine andere umständliche Möglichkeit, ich bleib bei Apache, mit den eingeschränkten Rechte und reiche alles durch eine Telnetverbintung an den Rechner weiter...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 1. Februar 2005, 13:14

Du kannst sudo so einstellen, dass es für gewisse User für gewisse Befehle kein Passwort abfragt, dann wäre das schon gelöst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten