Tâches racine à l'aide de dbus et de policykit

10

À un moment donné, mon application doit effectuer des tâches administratives telles que la création d'un fichier dans / etc ou l'exécution de commandes avec des privilèges root.

Je sais que je pourrais juste faire un Q&D:

os.popen("pkexec foo bar")

Mais je sais aussi que ce n'est pas la manière propre prévue de le faire. Une sorte de gêne pour l'utilisateur car il a toujours besoin de ressaisir son mot de passe au lieu d'avoir une gestion de type session.

J'étais très optimiste en trouvant l'exemple python pour l'authentification .

C'est un exemple simple qui fonctionne immédiatement:

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

J'ai été assez naïf en pensant qu'après autorisation, je pouvais simplement continuer dans le script avec quelques commandes os.popen (). Maintenant je sais mieux :(

Je peux voir le résultat du tuple dans l'exemple ci-dessus, mais dans la documentation supplémentaire, je n'ai pas pu trouver de code de travail pour continuer à ce stade.

Que dois-je faire avec ce résultat? Comment puis-je continuer à effectuer les tâches dont j'ai besoin? Existe-t-il une référence python avec des exemples qui offrent les méthodes disponibles?

J'ai essayé de lister les méthodes d'autorisation en utilisant dir () mais je n'ai trouvé aucun indice sur la façon de continuer.

Je veux vraiment éviter d'utiliser mon secours, mais ce serait mon dernier recours. S'il vous plaît, aidez-moi à le faire de la bonne façon :)

Merci et salutations

André

Éditer:

Étant donné que je n'ai pas mis cela au travail et que mon ancienne solution en démarrant mon programme avec gksu ne fonctionne pas avec / opt /, j'ai finalement dû abandonner et implémenter mille demandes de mot de passe pour que le programme fonctionne rudimentairement pour obtenir au moins un T-Shirt dans l'épreuve de force de l'application.

Je n'ai pas remarqué le problème car j'ai d'abord fait un partage rapide. Là, tout fonctionnait bien. Demander une fois le mot de passe au début. Je suis totalement déprimé maintenant. Ma contribution pour AppShowdown était https://launchpad.net/armorforge . ;-(

liberavia
la source
Je pense que vous pourriez trouver de meilleures réponses sur StakOverflow. Vous devriez demander que cette question soit migrée là-bas.
jgomo3

Réponses:

7

Il y a un concept fondamental que vous devez d'abord comprendre: PolicyKit ne gère que l'autorisation, pas l'escalade de privilèges. PolicyKit répondra à la question: "l'utilisateur est-il autorisé à effectuer cette tâche?", Mais il ne vous accordera pas les privilèges root.

Le modèle couramment utilisé consiste à créer un service système DBus, qui s'exécute avec les privilèges root. Il accepte les demandes des processus non root, utilise PolicyKit pour déterminer si ce processus est autorisé à effectuer cette demande, puis effectue la tâche demandée.

J'ai écrit un tutoriel sur PolicyKit et DBus avec Python sur ubuntuforums.org il y a quelques années. Les principes sont les mêmes, bien qu'il puisse nécessiter une mise à jour. Je dois me coucher maintenant, alors jetez un œil et faites-moi savoir si elle a besoin d'une mise à jour.

Flimm
la source
Pourrait-il être utilisé pour autoriser les packs d'extension d'installation de virtualbox sous un utilisateur normal?
Gryu