Como configurar o pkexec para não solicitar senha?

12

Eu tenho um aplicativo GUI que precisa chamar um daemon (escrito em Python) com privilégios de superusuário. Eu gostaria de fazer isso sem solicitar ao usuário uma senha.

Como o daemon é um script, não posso definir o bit SUID diretamente. Eu poderia escrever um invólucro em C para isso, mas prefiro não reinventar a roda, especialmente quando um erro da minha parte poderia levar à segurança do sistema seriamente comprometida.

O que eu normalmente faria nessa situação é adicionar uma linha /etc/sudoersque permita aos usuários executar o daemon como root sem uma senha, usando a diretiva NOPASSWD. Isso funciona bem na linha de comando. No entanto, quando faço isso a partir da GUI, pkexecaparece uma caixa de diálogo solicitando a senha do usuário. Parece que no Ubuntu, as chamadas sudoda GUI estão sendo interceptadas de alguma forma pkexec.

Existe uma maneira limpa de contornar isso? Eu realmente prefiro não ter que lidar com os aborrecimentos de um script setuid.

Chinmay Kanchi
fonte
Sobre qual aplicativo você fala?
Radu Rădeanu
Qualquer aplicativo GUI. Quando um aplicativo GUI tenta executar sudo somecommand, a caixa de diálogo exibida é uma pkexeccaixa de diálogo com senha, independentemente de haver uma política de sudoers que permita a execução do programa.
Chinmay Kanchi

Respostas:

14

É impróprio dizer que: "Parece que, no Ubuntu, as chamadas sudoda GUI estão sendo interceptadas de alguma forma pkexec" . pkexecnão tem muito em comum com sudo. Em contraste com sudo, pkexecnão concede permissão de root a um processo inteiro, mas permite um nível mais fino de controle da diretiva do sistema centralizado.

Agora, se você deseja executar um aplicativo GUI sem ser solicitado por uma senha pkexec, isso não é difícil de ser feito. Vamos pegar, por exemplo, GParted . Ao abri-lo, você verá a seguinte janela de diálogo solicitando uma senha:

gparted authenticate

Clique em Detalhes e a janela de diálogo terá a seguinte aparência:

gparted authenticate - detalhes

A partir daqui, tudo o que você precisa fazer é abrir o arquivo usando, por exemplo, o seguinte comando:/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

gksu gedit /usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

e altere as seguintes linhas:

      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>

com os seguintes:

      <allow_any>yes</allow_any>
      <allow_inactive>yes</allow_inactive>
      <allow_active>yes</allow_active>

Salve o arquivo e feche-o. Em seguida, quando você abrir o GParted , não será mais solicitada uma senha.

Radu Rădeanu
fonte
Sim, o pkexec de fato intercepta chamadas para o sudo. Deixe-me ver se consigo criar um exemplo mínimo desse comportamento.
Chinmay Kanchi
Não consigo replicar isso em um aplicativo simples, isso pode acontecer apenas em algumas situações muito específicas e não tenho tempo para rastrear o bug. Eu vou aceitar sua resposta. Felicidades.
Chinmay Kanchi
@ChinmayKanchi Vamos ser mais claros. Vou pegar por exemplo novamente gparted. Ao executar a partir do terminal sudo gparted, você executa o /usr/sbin/gpartedarquivo com privilégios de root. Ao iniciar a gpartedpartir da GUI, você começa de fato gparted-pkexec(é possível verificar esse /usr/share/applications/gparted.desktoparquivo interno ), /usr/bin/gparted-pkexecque é um script de shell cujo objetivo é executar o seguinte comando: o pkexec "/usr/sbin/gparted"qual é equivalente a pkexec gparted. Então, nada a ver com sudo. E este comando você deve usar no terminal, não sudo gparted.
Radu Rădeanu
1
O @ChinmayKanchi sudodeve ser usado apenas para aplicativos shell, não aplicativos GUI. Veja man sudoe man pkexecneste sentido.
Radu Rădeanu
Sim, estou ciente dos dois pontos. Minha situação é que eu tenho um aplicativo GUI (escrito por mim) que tenta iniciar um programa shell (um daemon, também escrito por mim) usando o sudo. Por alguma razão, isso resulta na invocação do pkexec em vez do sudo, o que significa que todas as políticas do sudo que eu criei para o daemon serão ignoradas.
Chinmay Kanchi