Tarefas raiz usando dbus e policykit

10

Em algum momento, meu aplicativo precisa executar tarefas administrativas, como criar um arquivo em / etc ou executar comandos com privilégios de root.

Eu sei que apenas poderia fazer um Q&D:

os.popen("pkexec foo bar")

Mas também sei que essa não é a maneira limpa prevista de fazê-lo. Algum tipo de aborrecimento para o usuário porque ele sempre precisa redigitar sua senha em vez de ter um tratamento parecido com uma sessão.

Fiquei muito otimista ao encontrar o exemplo de python para autenticação .

É um exemplo simples que funciona imediatamente:

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

Eu tenho sido ingênuo pensando que, após a autorização, eu poderia continuar no script com alguns comandos os.popen () -. Agora eu sei melhor :(

Eu posso ver o resultado da tupla no exemplo acima, mas na documentação adicional não consegui encontrar um código de trabalho para continuar neste momento.

O que eu tenho a ver com esse resultado? Como posso continuar executando as tarefas que preciso? Existe uma referência python com exemplos que oferecem os métodos disponíveis?

Tentei listar os métodos de autorização usando dir (), mas não consegui encontrar nenhuma pista sobre como prosseguir.

Eu realmente quero evitar usar meu substituto, mas seria meu último recurso. Por favor, me ajude a fazê-lo da maneira certa :)

Obrigado e cumprimentos

André

Editar:

Como eu não trouxe isso para funcionar, e minha solução anterior, iniciando meu programa com o gksu, não funciona em / opt /, finalmente tive que desistir e implementar mil solicitações de senha para fazer com que o programa funcionasse de maneira rudimentar para obter pelo menos uma camiseta no showdown do aplicativo.

Não percebi o problema porque primeiro compartilhei rapidamente. Lá tudo deu certo. Solicitando uma vez a senha no início. Estou totalmente triste agora. Minha contribuição para o AppShowdown foi https://launchpad.net/armorforge . ;-(

liberavia
fonte
Acho que você pode encontrar melhores respostas no StakOverflow. Você deve solicitar que essa pergunta seja migrada para lá.
Jgomo3

Respostas:

7

Há um conceito fundamental que você precisa entender primeiro: o PolicyKit manipula apenas a autorização, não a escalação de privilégios. O PolicyKit responderá à pergunta: "o usuário está autorizado a executar esta tarefa?", Mas não fornecerá privilégios de root.

O modelo comumente usado é criar um serviço de sistema DBus, que é executado com privilégios de root. Ele recebe solicitações de processos não raiz, usa o PolicyKit para determinar se esse processo está autorizado a fazer essa solicitação e, em seguida, executa a tarefa solicitada.

Eu escrevi um tutorial sobre o PolicyKit e o DBus com o Python no ubuntuforums.org alguns anos atrás. Os princípios são os mesmos, embora possa precisar de alguma atualização. Eu preciso ir para a cama agora, então dê uma olhada e deixe-me saber se ele precisa ser atualizado.

Flimm
fonte
Poderia ser usado para permitir pacotes de extensão de instalação do virtualbox sob usuário regular?
Gryu 03/04