10 votes

Tâches racine utilisant dbus et policykit

À 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 simplement 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. Un peu ennuyeux pour l'utilisateur car il doit toujours saisir à nouveau son mot de passe au lieu d'avoir une gestion de type session.

J'étais très optimiste lorsque j'ai trouvé l'exemple en 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            # Drapeau AllowUserInteraction
cancellation_id = '' # Pas de ID d'annulation

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

print result

J'ai été assez naïf de penser qu'après l'autorisation, je pourrais simplement continuer dans le script avec des commandes os.popen(). Maintenant, je sais mieux :(

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

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

J'ai essayé de répertorier les méthodes d'autorisation en utilisant dir() mais je n'ai trouvé aucun indice sur la marche à suivre.

Je veux vraiment éviter d'utiliser mon solution de secours mais ce serait mon dernier recours. S'il vous plaît, aidez-moi à faire les choses correctement :)

Merci et cordialement

André

Éditer:

Comme je n'ai pas réussi à le faire fonctionner et que ma solution précédente consistant à démarrer mon programme avec gksu ne fonctionne pas en dehors de /opt/, j'ai finalement dû abandonner et implémenter mille demandes de mot de passe pour que le programme fonctionne de manière rudimentaire pour obtenir au moins un T-shirt dans l'AppShowdown.

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 abattu maintenant. Ma contribution à l'AppShowdown était https://launchpad.net/armorforge. ;-(

7voto

Flimm Points 36395

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

Le modèle couramment utilisé est de créer un service système DBus, qui s'exécute avec des privilèges root. Il prendra des demandes de processus non root, utilisera PolicyKit pour déterminer si ce processus est autorisé à faire cette demande, puis effectuera 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 aller me coucher maintenant, donc jetez-y un coup d'œil et dites-moi s'il a besoin d'être mis à jour.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X