Autoriser l'utilisateur à exécuter une commande avec des arguments (qui contient des espaces)

17

Je veux autoriser un utilisateur à exécuter grep (via sudo) et à grep pour une chaîne spécifique dans un fichier spécifique. Je ne veux pas autoriser cet utilisateur à pouvoir exécuter grep sur tous les fichiers. L'utilisateur n'a pas accès en lecture au fichier, d'où l'obligation d'utiliser sudo. J'essaie d'écrire un chèque nagios qui greps le fichier journal d'un autre service sur la machine.

Cependant, cela ne fonctionne pas, sudo continue de demander un mot de passe.

Ma commande est: sudo grep "string I want (" /var/log/thefilename.log(oui, il y a un raw (et quelques espaces dans la chaîne que je veux grep)

/etc/sudoers.d/user-can-grep a ce contenu:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Ce fichier sudoers appartient à root:rootet dispose d'autorisations-r--r-----

Le serveur est Ubuntu trusty 14.04.3 LTS.

Comment puis-je faire fonctionner cela?

Rory
la source
Le contrôle nagios appelle-t-il explicitement / bin / grep ou / usr / bin / grep?
Jeff Schaller
Écrivez un script shell qui fait cela, puis laissez le script s'exécuter sudo.
user253751
@JeffSchaller FYI le script appelle juste grep, et which grepme dit qu'il utilise /bin/grep. AFAIK dans le fichier sudo, vous devez spécifier le chemin complet du binaire, même si vous l'appelez sans le chemin complet.
Rory

Réponses:

13

Apparemment, sudo aplatit la commande en une chaîne avant de la comparer à une spécification du fichier sudoers. Donc, dans votre cas, vous n'avez pas besoin d'utiliser des guillemets ou toute autre forme d'échappement:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Edit : Comme @ user23013 le fait remarquer dans les commentaires, cela pourrait être exploité pour grep pour "chaîne que je veux" dans n'importe quel fichier (et, par extension, également pour "chaîne I" et "chaîne".) Veuillez bien réfléchir avant en utilisant la vérification des arguments de sudo!


Notez également que les invocations suivantes sont équivalentes, c'est-à-dire que vous ne pourrez pas restreindre les utilisateurs à une représentation spécifique:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Cela est dû au fait que les guillemets et les échappements sont gérés par le shell et ne parviennent jamais sudo.

Alexander Batischev
la source
Intéressant, je me demande si c'est exploitable, c'est à dire convaincre que sudovous avez tapé une chose (qui correspond à la spécification) mais quand il s'agit de l'exécuter, c'est autre chose.
EightBitTony
4
@EightBitTony Bien sûr que ça l'est! Dans votre sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(avec l'intention de laisser les utilisateurs éditer "Édition du fichier sudoers") peut être exploité cden entrant /etc/et en exécutant sudo vim Editing sudoers file. Je dirais que pour toute commande d'une complexité raisonnable, il faut suivre l'approche suggérée dans votre commentaire: le shell fournit une $@variable où vous pouvez vérifier que les arguments sont groupés comme vous vous attendez à ce qu'ils soient groupés.
Alexander Batischev
8
Créez un chemin ( /var/logn'importe où et un lien symbolique thefilename.logvers n'importe quel fichier, l'utilisateur peut alors récupérer à string I wantpartir de n'importe quel fichier.
user23013
2
@ La réponse de EightBitTony (écrire un script wrapper, autoriser l'accès sudo à ce script) est bien meilleure et plus sûre.
cas
Wow, c'est une pratique extrêmement mauvaise pour un outil axé sur la sécurité.
Sam Watkins
32
  1. Écrire un script (accessible en écriture uniquement par root)
  2. Dans ce script, exécutez le dont grepvous avez besoin
  3. Dans la configuration sudoers, autorisez uniquement l'accès à ce script
  4. Configurez n'importe quel outil ou conseillez à l'utilisateur de simplement exécuter le script via sudo

Beaucoup plus facile à déboguer, plus facile à verrouiller un accès spécifique à un fichier spécifique, et beaucoup plus difficile à exploiter.

EightBitTony
la source
2

Puisque vous n'avez besoin que de root pour l'accès au fichier, envisagez d'utiliser cat, teeou quelque chose de similaire, et canalisez-le vers grepou tout autre programme que vous devez exécuter. Par exemple sudo cat /file/path | grep …, vous limitez root à l'endroit où vous en avez absolument besoin.

user167676
la source
0

sudoest super, mais parfois ce n'est pas le meilleur choix. Pour cela, j'aime utiliser super. superautorise également des autorisations élevées, mais il suppose des alias de commande, ce qui est pratique lorsque vous autorisez des lignes de commande complexes, car ils sont utilisés comme de simples lignes de commande.

votre super.tab ressemblerait à:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

et serait invoqué comme super grepcmd.

hildred
la source
sudohas Cmnd_Alias(qui peut contenir une ou plusieurs commandes, avec ou sans restrictions d'argument).
cas
Pas du tout la même chose. Cmnd_Alias ​​est un outil pour simplifier le fichier de configuration, il n'expose pas un alias à l'utilisateur qui est le mode de fonctionnement principal de super (c'est pourquoi j'utilise sudo lorsque je n'aliase pas de commandes ou n'exécute pas de scripts suid (la plupart du temps) , et super pour ces deux cas d'utilisation).
hildred
c'est à cela que servent les scripts d'encapsulation ... et ils ne sont pas limités aux lignes simples ou ont des problèmes de citation ennuyeux.
cas