Python Django - IIS - PsExec.exe

maloz

Captain
Registriert
März 2007
Beiträge
3.125
Hallo zusammen,

folgendes Setup:
  • IIS Web Server
  • FastCGI
  • Python 3.10.xx
  • Django 4 (im venv)

Problem:
Ich möchte über eine Django Website ein Verzeichnis (auf der Website werden ein paar Sachen eingegeben und dann nach einem Submit Button weiterverarbeitet) auf einem Windows Share anlegen und mit alternativen Berechtigungen arbeiten, weil das Share nicht für jedermann zugänglich ist.
Mit dem Python Modul os kann ich nicht einfach os.system(cmd.exe mkdir) arbeiten, weil es dann an den Berechtigungen scheitert.
Der Gedanke war dann einfach mit os.system und dem Tool PsExec.exe -u -p zu benutzen, da ich hier alternative Credentials mitgeben kann. Leider klappt das auch nicht, ich stoße immer auf Access Denied.
Führe ich das Codeschnipsel direkt aus (also ein .py File mit den paar Befehlen) klappt es tadellos, erfolgt der Aufruf aber über die Django Website stoße ich immer wieder auf Berechtigungsprobleme. Ich vermute irgendwo scheitert es dran, dass der IIS Prozess die PsExec.exe aufruft.

Der IIS Prozess läuft als AppPool mit dem Nutzer "django". Ich habe aber auch schon andere User probiert (selbst Domain Admins) und das Problem blieb bestehen.
os.subprocess habe ich auch probiert mit demselben Ergebnis.

Ich hoffe es ist soweit klar was ich vor habe und wo das Problem liegt.
Nun die Frage: Wie gehe ich weiter vor?
Ich der von mir eingeschlagene Weg (PsExec.exe) völlig der falsche?
Hat sonst noch wer Anhaltspunkte denen ich nachgehen könnte um mein Vorhaben umzusetzen?
Mit os.setuid kann man wohl auch einen anderen User angeben, leider nur unter Linux.

Ich habe Freitag fast den ganzen Arbeitstag daran rumprobiert ohne Erfolg. Ich bin nun soweit das Ganze einfach an ein kleines PowerShell Script zu übergeben, was diese einfache Aufgabe (ein Verzeichnis auf einem Share anzulegen unter einem alternativen Userekontext) erledigt, widerum denke ich mir: Das muss doch auch mit Python gehen?

Danke vorab für euer Feedback.
 
Der IIS bzw. die Webseite läuft mit welchem User - django sagst du? Eventuell diesem User dann die Berechtigung für das Verzeichnis einräumen? Kannst du mal den Usernamen ausgeben lassen via IIS? Z.B. in dem du ihn da in eine schreibbare Datei schreiben lässt, nur um 100% sicher zu gehen?
also z.B. via dem da oder so, kenne ich mit Python nicht aus und kann dir nicht sagen, ob die Syntax so passt...
Code:
os.system(cmd.exe echo %username% > C:\HierDarfIchSchreiben\issuser.txt)

Grundsätzlich mit dem Admin da rumhantieren, da streuben sich bei mir die Nackenhaare.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: maloz und madmax2010
Python:
def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)


das ist eigentlich the django way. Schon 100x genutzt
woher exakt kommt das permission problem?
Hat dein Webserver User Schreibrechte in das Verzeichnis?

nimm mal zum testen:
Python:
nfp = r'Z:\Share\django_unchained\new_folder'
if not os.path.exists(nfp):
    os.makedirs(nfp)
kenne mich mit windows nicht so aus ;)



tollertyp schrieb:
Grundsätzlich mit dem Admin da rumhantieren, da streuben sich bei mir die Nackenhaare.
Jep. Niemals. Nichtmal zum testen.
Ich wuerde auch sehr raten, nichts auf dem Share liegen zu haben,dass potentiell nicht oeffentlich sein soll. Sowas wird angegriffen werden.

Zusatz: Wenn die App performen soll, kann ich sehr wsgi+nginx empfehlen. Da bekommst du auf kleinen maschinen Zehntausende simultane user mit wirklich niedrigen latenzen Hin.
 
Zuletzt bearbeitet:
Erstmal Danke für eure Tipps. Folgenden Fehler erhalte ich beim os.subprocess.Popen Befehl mit PsExec64.exe: b'Access is denied.\r\n\rPsExec could not start cmd.exe:\r\n'

tollertyp schrieb:
Der IIS bzw. die Webseite läuft mit welchem User - django sagst du? Eventuell diesem User dann die Berechtigung für das Verzeichnis einräumen?
Habe ich gemacht. Tatsächlich kommt dabei COMPUTERNAME$ raus.
Das Computerkonto kann ich auf den Share berechtigen, das probiere ich mal aus.

tollertyp schrieb:
Grundsätzlich mit dem Admin da rumhantieren, da streuben sich bei mir die Nackenhaare.
Verständlich und zurecht. :D War, wie gesagt, kurzzeitig zum Testen. Es handelt sich btw um eine interne Website die nicht von außen erreichbar ist. Und ja, das macht die Website grundsätzlich von intern angreifbar, das ist mir schon bewusst.

madmax2010 schrieb:
nimm mal zum testen:
Das bringt leider nichts, da ich dann auf das angesprochene Berechtigungsproblem stoße.
Ich muss den Befehl zum Erzeugen eines Ordner als anderer User ausführen.

madmax2010 schrieb:
Zusatz: Wenn die App performen soll, kann ich sehr wsgi+nginx empfehlen.
Ich habe den IIS genommen, auch wenn das kein übliches Setup für Django ist, weil das die ganze Authentifizierung (Kerberos) extrem vereinfacht.
Mit nginx kenne ich mich zudem 0 aus.
 
Zuletzt bearbeitet:
jb_alvarado schrieb:
Vielleicht liegt das Problem garnicht am Share, sondern am Ausführen der externen EXE?
Denke ich auch, habe ich eingangs auch vermutet.
Ich muss es später nochmal mit den Python Boardmitteln probieren und zuvor das Computerobjekt auf den Share berechtigen, dann brauch ich kein PsExec/cmd.

jb_alvarado schrieb:
versuchen es so zu machen wie @madmax2010 geschrieben hat. Man kann Python Code auch im User Context ausführen: https://stackoverflow.com/questions...f-code-as-different-user-in-linux-with-python
Das funktioniert nur unter Linux.

edit
Also das Computerkonto auf dem Share berechtigen funktioniert. Dann kann ich mit os.system('cmd.exe...') arbeiten. :)
 
Zuletzt bearbeitet:
Habe mir gerade noch mal Gedanken drüber gemacht: Eigentlich darf der IIS das nicht erlauben, Programme in einem anderen Benutzerkontext zu starteten. Egal ob Python das direkt macht, oder PsExec, das wäre eine Sicherheitslücke.

Deine Freigabe müsste also dem IIS Benutzer erlauben, drauf schreiben zu dürfen.
 
Zurück
Oben