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?
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
> 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:> 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 :-)
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.