Comment configurer pkexec pour ne pas demander de mot de passe?

12

J'ai une application graphique qui doit appeler un démon (écrit en Python) avec des privilèges de superutilisateur. Je voudrais le faire sans demander à l'utilisateur un mot de passe.

Étant donné que le démon est un script, je ne peux pas définir directement le bit SUID. Je pourrais écrire un wrapper C pour cela, mais je préférerais ne pas réinventer la roue, surtout lorsqu'une erreur de ma part pourrait conduire à une sécurité sérieuse du système.

Ce que je ferais normalement dans cette situation est d'ajouter une ligne /etc/sudoersqui permet aux utilisateurs d'exécuter le démon en tant que root sans mot de passe, en utilisant la directive NOPASSWD. Cela fonctionne très bien à partir de la ligne de commande. Cependant, lorsque je fais cela à partir de l'interface graphique, une pkexecboîte de dialogue apparaît pour demander le mot de passe de l'utilisateur. Il semble que sur Ubuntu, les appels sudodepuis l'interface graphique soient en quelque sorte interceptés par pkexec.

Existe-t-il une solution claire à ce problème? Je préfère vraiment ne pas avoir à gérer les tracas d'un script setuid.

Chinmay Kanchi
la source
De quelle application parlez-vous?
Radu Rădeanu
Toute application GUI. Lorsqu'une application GUI tente de s'exécuter sudo somecommand, la boîte de dialogue qui s'affiche est une pkexecboîte de dialogue de mot de passe, qu'il existe ou non une stratégie sudoers permettant l'exécution du programme.
Chinmay Kanchi

Réponses:

14

Il est incorrect de dire que: "Il semble que sur Ubuntu, les appels à sudopartir de l'interface graphique soient en quelque sorte interceptés par pkexec" . pkexecn'a pas grand chose en commun avec sudo. Contrairement à sudo, pkexecn'accorde pas d'autorisation root à tout un processus, mais permet plutôt un niveau de contrôle plus fin de la stratégie système centralisée.

Maintenant, si vous voulez exécuter une application graphique sans être invité par un mot de passe pkexec, ce n'est pas difficile à faire. Prenons par exemple GParted . Lorsque vous l'ouvrirez, vous verrez la boîte de dialogue suivante vous demander un mot de passe:

authentifier gparted

Cliquez sur Détails et la fenêtre de dialogue ressemblera maintenant à:

gparted authenticate - détails

De là, tout ce que vous avez à faire est d'ouvrir le fichier en utilisant par exemple la commande suivante:/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

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

et modifiez les lignes suivantes:

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

avec les suivants:

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

Enregistrez le fichier et fermez-le. Ensuite, lorsque vous ouvrirez GParted, il ne vous sera plus demandé de mot de passe.

Radu Rădeanu
la source
Oui, pkexec intercepte en effet les appels vers sudo. Voyons si je peux construire un exemple minimal de ce comportement.
Chinmay Kanchi
Je ne peux pas reproduire cela dans une application simple, cela ne peut se produire que dans certaines situations très spécifiques et je n'ai pas le temps de retrouver le bug. Je vais accepter votre réponse. À votre santé.
Chinmay Kanchi
@ChinmayKanchi Soyons plus clairs. Je vais reprendre par exemple gparted. Lorsque vous exécutez à partir du terminal sudo gparted, vous exécutez le /usr/sbin/gpartedfichier avec les privilèges root. Lorsque vous démarrez à gpartedpartir de l'interface graphique, vous démarrez en fait gparted-pkexec(vous pouvez vérifier ce /usr/share/applications/gparted.desktopfichier à l' intérieur ) qui /usr/bin/gparted-pkexecest un script shell dont le but est d'exécuter la commande suivante: pkexec "/usr/sbin/gparted"qui est équivalente à pkexec gparted. Donc, rien à voir avec ça sudo. Et cette commande que vous devez utiliser dans le terminal, non sudo gparted.
Radu Rădeanu
1
@ChinmayKanchi sudodoit être utilisé uniquement pour les applications shell, pas les applications GUI. Voir man sudoet man pkexecdans ce sens.
Radu Rădeanu
Oui, je connais vos deux points. Ma situation est que j'ai une application graphique (écrite par moi) qui tente de lancer un programme shell (un démon, également écrit par moi) en utilisant sudo. Pour une raison quelconque, cela entraîne l'invocation de pkexec au lieu de sudo, ce qui signifie que toutes les politiques sudo que j'ai créées pour le démon sont ignorées.
Chinmay Kanchi