Forum: PC-Programmierung User Wechsel mit Python auf Unix Server


von Leon (Gast)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

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

von Imonbln (Gast)


Lesenswert?

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.

von Leon (Gast)


Lesenswert?

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)

von Der Opa aus der Muppet Show (Gast)


Lesenswert?

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.

von Walter K. (walter_k488)


Lesenswert?

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
von Der Opa aus der Muppet Show (Gast)


Lesenswert?

> 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.

von Leon (Gast)


Lesenswert?

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.

von Walter K. (walter_k488)


Lesenswert?

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/

von Walter K. (walter_k488)


Lesenswert?

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?

von Walter K. (walter_k488)


Lesenswert?

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
von Imonbln (Gast)


Lesenswert?

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.

von Der Opa aus der Muppet Show (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.