Possible de vérifier la capacité de sudo avant sudo'ing?

11

J'écris un petit programme utilitaire. Je voudrais qu'il essaie de sudolancer quelque chose si nécessaire.

C'est-à-dire: si les autorisations de fichier ne permettent pas à l'utilisateur actuel d'opérer sur un fichier particulier (et que les sudorègles le permettent), j'aimerais que mon utilitaire sudoexécute quelque chose en tant que propriétaire du fichier.

J'espère vérifier cette capacité à l'avance, car je préférerais que les journaux système ne se remplissent pas de bruit provenant d'échecs sudo. Comme l' sudoindique lui-même l'échec: "Cet incident sera signalé".

Donc, j'espère vérifier par programme: peut user <x>fonctionner command <y>via sudo?.

Voici le problème: tandis que /etc/sudoerscontient ce mappage, il appartient à root et n'est pas lisible par les utilisateurs réguliers.

J'envisageais de créer un sous-processus à exécuter sudo -l(qui génère des commandes que l'utilisateur actuel peut exécuter sudo). Je voudrais ensuite analyser la sortie de cela. Cependant, cela semble un peu fragile. La sortie contient les informations que je veux, mais il semble qu'elle ait été conçue pour être lue par les humains (pas pour la consommation programmatique). Je ne sais pas s'il y a une garantie que la sortie suivra le même format à l'avenir, ou sur différentes plates-formes.

L'analyse syntaxique des sudo -lsorties est-elle considérée comme sûre? Sinon, existe-t-il de meilleures options pour déterminer à l'avance si une commande sudo réussira?


(Contexte sur le X / Y: cet utilitaire est destiné à être utilisé par un compte de rôle à accès limité. Je m'attends à ce que d'autres utilisateurs optent effectivement pour permettre au compte à accès limité de fonctionner sur leurs fichiers via les règles sudo. ne sais pas à l'avance lesquels de ces autres utilisateurs ont la règle sudo pertinente en place)

Peter Martin
la source
3
Je vous recommande d'adopter une approche légèrement différente. Au lieu d'avoir des règles par utilisateur, pourquoi ne pas avoir un groupe autorisé à faire ce que vous voulez qu'il fasse. De cette façon, vous pouvez simplement vérifier si l'utilisateur est dans le groupe. Serait-ce une alternative décente?
terdon

Réponses:

13

Selon la page de manuel sudo:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

donc cela se résumera à

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Comme l' a souligné Muru, utilisez -U $USERou -U $USERTOTESTou rien, en fonction de vos besoins.

Archemar
la source
Si vous vouliez $USERdire l'utilisateur actuel, vous pouvez simplement vous sudo -l <command>en passer -U $USER.
muru
Merci - c'est utile. Une chose que j'ai remarquée en testant cette approche est qu'elle ne semble pas prendre en charge les cas où la règle sudo a été configurée pour autoriser TOUTES les commandes avec des exceptions particulières, telles que (targetUser) ALL, !/usr/bin/foo .. dans ce cas, sudo -l -u targetUser /usr/bin/fooil semble toujours sortir /usr/bin/fooet quitter avec le statut 0. Pourtant, c'est fondamentalement suffisant pour ma simple vérification et bat l'analyse de la sudo -lsortie la plus verbeuse .
Peter Martin