Attività di root utilizzando dbus e policykit


10

Ad un certo punto la mia applicazione deve svolgere attività amministrative come la creazione di un file in / etc o l'esecuzione di comandi con privilegi di root.

So che potrei semplicemente fare una domanda e risposta:

os.popen("pkexec foo bar")

Ma so anche che questo non è il modo pulito previsto per farlo. Una sorta di fastidioso per l'utente perché deve sempre reinserire la password invece di avere una gestione simile a una sessione.

Ero molto ottimista poiché ho trovato l'esempio python per l'autenticazione .

È un semplice esempio che funziona immediatamente:

import dbus

bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy,  dbus_interface='org.freedesktop.PolicyKit1.Authority')

system_bus_name = bus.get_unique_name()

subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1            # AllowUserInteraction flag
cancellation_id = '' # No cancellation id

result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)

print result

Sono stato abbastanza ingenuo pensando che dopo l'autorizzazione avrei potuto continuare nello script con alcuni comandi os.popen (). Ora lo so meglio :(

Posso vedere il risultato di tupla nell'esempio sopra, ma nella documentazione ulteriore non sono riuscito a trovare un codice funzionante per continuare a questo punto.

Cosa devo fare con questo risultato? Come posso continuare a svolgere le attività di cui ho bisogno? Esiste un riferimento a Python con esempi che offrono i metodi disponibili?

Ho provato a elencare i metodi di autorizzazione usando dir () ma non sono riuscito a trovare alcun indizio su come procedere.

Voglio davvero evitare di usare il mio fallback ma sarebbe la mia ultima risorsa. Per favore, aiutami a farlo nel modo giusto :)

Grazie e saluti

André

Modificare:

A causa del fatto che non l'ho fatto funzionare e la mia precedente soluzione avviando il mio programma con gksu non funziona con / opt /, alla fine ho dovuto rinunciare e implementare mille richieste di password per rendere il programma rudimentale lavoro per ottenere almeno una maglietta nello showdown dell'app.

Non ho notato il problema perché prima ho fatto una condivisione rapida. Lì tutto ha funzionato bene. Chiedere una volta la password all'inizio. Sono totalmente giù adesso. Il mio contributo per AppShowdown è stato https://launchpad.net/armorforge . ;-(


Penso che potresti trovare risposte migliori su StakOverflow. Dovresti chiedere la migrazione di questa domanda.
jgomo3,

Risposte:


7

C'è un concetto fondamentale che devi prima capire: PolicyKit gestisce solo l'autorizzazione, non l'escalation dei privilegi. PolicyKit risponderà alla domanda: "l'utente è autorizzato a svolgere questa attività?", Ma non ti darà i privilegi di root.

Il modello comunemente usato è quello di creare un servizio di sistema DBus, che viene eseguito con i privilegi di root. Accetterà richieste da processi non root, utilizzerà PolicyKit per determinare se quel processo è autorizzato a fare quella richiesta, quindi eseguirà l'attività richiesta.

Ho scritto un tutorial su PolicyKit e DBus con Python su ubuntuforums.org qualche anno fa. I principi sono gli stessi, anche se potrebbe essere necessario un aggiornamento. Ora devo andare a letto, quindi dai un'occhiata e fammi sapere se ha bisogno di essere aggiornato.


Potrebbe essere utilizzato per consentire l'installazione di pacchetti di estensione virtualbox con utenti normali?
Gryu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.