Forum: PC-Programmierung [Python] Eine Funktion braucht root-Rechte, eine andere funktioniert nur ohne (im selben Programm)


von Stefan S. (stefan-fan)


Lesenswert?

Hi,

in einer Python-Software will eine Funktion unterbringen, die 
root-Rechte voraussetzt und eine andere, die aus Sicherheitsgründen als 
root nicht ausführbar ist. Ein Skript kann man aber ja nur entweder als 
root oder als User ausführen. Auf Anhieb fällt mir da nur ein, 2 vom 
Anwender separat zu startende Programme zu realisieren (eines 
wahrscheinlich am Besten als Thread), die miteinander kommunizieren. Die 
Kommunkation könnte über TCP/IP-Sockets (Loopback) gehen, das hätte ich 
schonmal gemacht, oder ich kucke mir bei der Gelegenheit dazu mal Pipes 
oder Shared Memory an. Aber eigentlich ist das doch mit Kanonen auf 
Spatzen geschossen, oder nicht? Wisst ihr vielleicht eine elegantere 
Lösung?

Falls es jemanden interessiert, der Teil, der root voraussetzt, ist die 
wifi-library, mit der ich mit einem Wlan verbunden werden soll. Der 
Teil, der als root nicht möglich ist, ist Browser-Steuerung mit Selenium 
und einer headless Firefox-Instanz.

Danke!

von John Doe (Gast)


Lesenswert?

Stefan S. schrieb:
> Falls es jemanden interessiert, der Teil, der root voraussetzt, ist die
> wifi-library, mit der ich mit einem Wlan verbunden werden soll. Der
> Teil, der als root nicht möglich ist, ist Browser-Steuerung mit Selenium
> und einer headless Firefox-Instanz.
>
> Danke!

Gib mal ein paar Details, so reicht das nicht.
Welches Betriebssystem - Linux (welche Distri), Mac, etc. -, welche 
Hardware.
Am besten noch den relevanten Code-Teil, also import und 
Methodenaufrufe.

von DPA (Gast)


Lesenswert?

Stefan S. schrieb:
> Falls es jemanden interessiert, der Teil, der root voraussetzt, ist die
> wifi-library, mit der ich mit einem Wlan verbunden werden soll.

Und da kann man nichts mit Berechtigungen machen? User zu gruppe netdev 
hinzufügen oder so?

Ansonsten, den Teil in ein anderes Programm auslagern, setuid bit 
setzen, von anderem Program aus starten, und davor ne pipe oder einen 
UNIX socket mitgeben, falls die Programme noch miteinander kommunizieren 
müssen. Ist aber sehr schwer richtig hinzukriegen, ein Fehler und das 
System ist offen. Python ist für setuid zeug dafür auch nicht wirklich 
geeignet.

von Wurzel (Gast)


Lesenswert?

Kümmer dich drum das Niemand anders das Zeug was als root läuft 
missbrauchen kann.

von yesitsme (Gast)


Lesenswert?

Ich würde das Programm als root starten. Das Programm startet dann 
selber einen subprocess mit einem anderen User.

subprocess.Popen() hat das Argument preexec_fn.
os.setuid() und os.setgid() existieren...

Vielleicht kann man damit was bauen.

von Sheeva P. (sheevaplug)


Lesenswert?

Stefan S. schrieb:
> in einer Python-Software will eine Funktion unterbringen, die
> root-Rechte voraussetzt und eine andere, die aus Sicherheitsgründen als
> root nicht ausführbar ist. Ein Skript kann man aber ja nur entweder als
> root oder als User ausführen. Auf Anhieb fällt mir da nur ein, 2 vom
> Anwender separat zu startende Programme zu realisieren (eines
> wahrscheinlich am Besten als Thread), die miteinander kommunizieren. Die
> Kommunkation könnte über TCP/IP-Sockets (Loopback) gehen, das hätte ich
> schonmal gemacht, oder ich kucke mir bei der Gelegenheit dazu mal Pipes
> oder Shared Memory an. Aber eigentlich ist das doch mit Kanonen auf
> Spatzen geschossen, oder nicht? Wisst ihr vielleicht eine elegantere
> Lösung?

Ja. Programm als root starten, Subprozeß starten, das Hauptprogramm 
(oder nach Geschmack natürlich auch der Kindprozeß) können dann ihre 
Privilegien mit os.setgroups([]) und der os.set*id()-Familie droppen und 
die unsicheren Funktionen ausführen.

Wie die Prozesse dabei mit einander kommunizieren, bleibt vollständig 
Dir überlassen -- die Klasse Popen aus dem Modul subprocess oder auch 
die Funktion os.popen() bieten Dir dabei direkte Möglichkeiten, Pipes 
für die Interprozesskommunikation zu eröffnen.

von Sheeva P. (sheevaplug)


Lesenswert?

DPA schrieb:
> Ansonsten, den Teil in ein anderes Programm auslagern, setuid bit
> setzen

Aus Sicherheitsgründen funktioniert das Setuid-Bit nicht bei Skripten, 
da müßte dann ein kleiner binärer setuid-Wrapper her.

von bingo (Gast)


Lesenswert?

UDEV-Rule stricken

von Marten Morten (Gast)


Lesenswert?

Mit einer richtigen Programmiersprache kein Problem: group- und user-id 
wechseln.

Programmierbeispiele gibt es Haufenweise im Netz. Ein paar der besseren 
Beispiele für C:
https://www.oreilly.com/library/view/secure-programming-cookbook/0596003943/ch01s03.html

https://wiki.sei.cmu.edu/confluence/display/c/POS36-C.+Observe+correct+revocation+order+while+relinquishing+privileges

Da Python die entsprechenden Systemcalls wrapped sollte das auch mit dem 
Python-Zeug möglich sein.

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.