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

OP #6069640
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!
Gast #6069718
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.
Gast #6069727
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.
Gast #6069759
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.
#6069799
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.
Gast #6069949
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren