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

OP #6069640
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.