Hallo, ich bin gerade dabei ein script auf einem Unix Server zu schreiben. Ich führe das Script als root aus. Ich möchte dann öfters den User wechseln und als der User etwas machen. Anschließend sollte er dann wieder zu root werden. Ich hatte jetzt im Internet folgende Idee gesehen: pid = os.fork() if pid == 0: # child - do the work and exit try: os.setuid(471) ... do the work here finally: os._exit(0) # parent - wait for the child to do its work and keep going as root os.waitpid(pid, 0) meine Frage ist allerdings, wie bekomme ich die uid, wenn ich nur den Usernamen des Users zu Verfügung habe? Gerne auch andere Lösungsansätze.
Leon schrieb: > Ich möchte dann öfters den User wechseln und als der User etwas > machen. Anschließend sollte er dann wieder zu root werden. Das macht man so nicht, weil das Script so ein dauerhaftes Sicherheitsproblem ist, mit dem man die Maschine übernehmen kann. Wozu musst du root sein? Oft nur, um irgendwelche Dateien öffnen zu können. Die kannst du auch vorher öffnen und dann deine root-Rechte ablegen - bereits geöffnete Dateien bleiben geöffnet. Leon schrieb: > wie bekomme ich die uid, wenn ich nur den > Usernamen des Users zu Verfügung habe?
1 | import os |
2 | import pwd |
3 | pwd.getpwnam(username).pw_uid |
Leon schrieb: > ich bin gerade dabei ein script auf einem Unix Server zu schreiben. Ich > führe das Script als root aus. Ich möchte dann öfters den User wechseln > und als der User etwas machen. Unschön aber Okay, Ideal wäre es wenn du gar nicht als root läufst. Vielleicht reicht es ein paar capabilities zu setzen um nicht root sein zu müssen? Btw willst du öfters zu verschiedene Benutzer wechseln oder immer denn gleichen? Das "etwas" ist auch interessant, vielleicht reicht es das "etwas" als ein Benutzer zum Beispiel root zu machen und dann das Ergebnis mit chown oder ähnliches so aussehen zu lassen als hätte der Benutzer es gemacht, aber da du hier so wage bist, kann man nur Spekulieren.
Imonbln schrieb: > Btw willst du öfters zu verschiedene Benutzer wechseln oder immer denn > gleichen? Ich möchte öfters den User wechseln, es soll dann ein Script als der User ausgeführt werden. Anschließend soll er wieder root werden um dann wieder ein anderer user zu werden. (Ist nur ein Zwischen Ergebnis das ich erreichen möchte. Am ende sollen bestimmte Anwendungen die unter dem User laufen gestoppt werden, damit der Server Heruntergefahren werden kann. Dies natürlich automatisch)
Wenn du dich in die Grundlagen einarbeiten willst, durchaus eine sinnvolle Übungsaufgabe. Solltest aber ein Lehrbuch für Unix Systemaufrufe durcharbeiten. Beim Thema fork/setuid hat sich seit 50 Jahren nichts mehr geändert. Die Probleme liegen aber wo anders. Die Angreifer sind so einfallsreich. Wenn ein Ganove deine Maschine kapern will, findet er unzählige Möglichkeiten, wie er dein Skript missbraucht. Da solltest du eher die aktuelle Diskussion zum Thema "chmod u+s", "su" oder "sudo" durcharbeiten.
Leon schrieb: > ich bin gerade dabei ein script auf einem Unix Server zu schreiben. Was fuer ein Unix ist das denn? Ein BSD, MacOS oder was? ( Du weisst ja sicherlich, dass Linux kein Unix ist - oder? ) "...meine Frage ist allerdings, wie bekomme ich die uid, wenn ich nur den Usernamen des Users zu Verfügung habe?.." wie wäre es, mal in der Shell die man-pages zu befragen? z.B.: man id
:
Bearbeitet durch User
> wie wäre es, mal in der Shell die man-pages zu befragen?
Habe den Eindruck, wir sollten besser den Tipp geben, ein Lehrbuch
durcharbeiten, was die Zusammenhänge erklärt. So eine Frage legt doch
den Verdacht nahe, der gute Mann findet die richtige man-page noch
nicht, weil ihm der Überblick über den Aufbau eines Unix artigen OS
fehlt.
Walter K. schrieb: > wie wäre es, mal in der Shell die man-pages zu befragen? Danke das ist sehr Hilfreich. Leider hab ich schon probiert bei dem script pid = os.fork() if pid == 0: # child - do the work and exit try: os.setuid(471) ... do the work here finally: os._exit(0) # parent - wait for the child to do its work and keep going as root os.waitpid(pid, 0) meine User ID bei os.setuid einzutragen. Leider hat es bei mir nicht funktioniert das ich der User werde (Ich habe dann probiert eine Datei als der user zu erstellen). Hätte hierzu evtl. jemand einen Lösungsvorschlag? wie ich dann als root ein User werden kann und anschließend wieder zu root werde, um dann wieder zu einem anderem User zu werden usw.. Zu dem Ob es ein Unix ist. Ich bin mir eigentlich ziemlich sicher das es ein unix-server ist. Leider weiß ich nicht, welches Unix dies ist.
Leon schrieb: > Zu dem Ob es ein Unix ist. Ich bin mir eigentlich ziemlich sicher das es > ein unix-server ist. Leider weiß ich nicht, welches Unix dies ist. https://www.geeksforgeeks.org/python-os-uname-method/
Leon schrieb: > Danke das ist sehr Hilfreich. Leider hab ich schon probiert bei dem > script > pid = os.fork() ..und das Thema Eltern-Kind Prozesse ist Dir geläufig?
Der Opa aus der Muppet Show schrieb: > Habe den Eindruck, wir sollten besser den Tipp geben, ein Lehrbuch > durcharbeiten, was die Zusammenhänge erklärt. Stimmt ... wenn er in C üben würde - wäre meine Empfehlung: W. Kernighan and Dennis M. Ritchie. edit & Nachtrag: wobei das vielleicht gar nicht schlecht wäre, denn aus dem schlechtesten c-programmierer kann immer noch ein akzeptabler perl oder Python Bastler werden :-)
:
Bearbeitet durch User
Leon schrieb: > Am ende sollen > bestimmte Anwendungen die unter dem User laufen gestoppt werden Okay wenn das so ist und dein Script einfach nur Programme von $User beenden soll, dazu brauchst du nicht der Benutzer zu sein, root oder ein Benutzer mit der capability CAP_KILL kann jeden Prozess eine SIGTERM senden und nach einer Karenzzeit noch ein SIGKILL hinterher, dazu musst du nicht der Benutzer werden, sondern nur die PID der entsprechenden Prozesse kennen. Dafür kannst du zum Beispiel das pip module psutils verwenden, um die PID zu bekommen.
> Hätte hierzu evtl. jemand einen Lösungsvorschlag?
Jain....
Eigentlich wäre der Lösungsvorschlag: Schaue dir an, wie auf deinem Unix
die Init-Skripte funktionieren. Die haben sich auch Gedanken gemacht,
was du machst, wenn ein Script beim Herunterfahren mit einer bestimmten
Userid laufen muss.
Aber leider sind die Init-Scripte zur Zeit ein fürchterliches Chaos. Das
alte Sys5 Konzept funktioniert nicht mehr. Die meisten Unix Systeme
haben einen chaotischen Mischmasch aus Systemd, alten Skripten und
wirren Kompatibilitätslayern.
Ganz egal, ob du es mit den vorgesehenen Init-Mechanismen oder mit den
darunter liegenden Betriebssystemaufrufen machst. Du brauchst mehrere
Monate Einarbeitungszeit.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.