web-dev-qa-db-fra.com

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

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 ( Brut 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:root Et dispose des autorisations -r--r-----

Le serveur est Ubuntu trusty 14.04.3 LTS.

Comment puis-je faire fonctionner cela?

17
Rory

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 le souligne @ user23013 dans les commentaires, cela peut être exploité pour grep pour "string I want" dans n'importe quel fichier (et, par extension, également pour "string I" et "string". ) Merci de bien réfléchir avant d'utiliser 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 n'atteignent jamais Sudo.

13
  1. Écrire un script (accessible en écriture uniquement par root)
  2. Dans ce script, exécutez le grep dont vous avez besoin
  3. Dans la configuration sudoers, autorisez uniquement l'accès à ce script
  4. Configurer n'importe quel outil ou conseiller à 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.

32
EightBitTony

Étant donné que vous n'avez besoin que de root pour l'accès aux fichiers, pensez à utiliser cat, tee ou quelque chose de similaire et à le canaliser vers grep ou tout autre programme que vous devez exécuter. Par exemple. Sudo cat /file/path | grep … De cette façon, vous limitez root à l'endroit où vous en avez absolument besoin.

2
user167676

Sudo est génial, mais parfois ce n'est pas le meilleur choix. Pour cela, j'aime utiliser super. super permet également des autorisations élevées, mais il suppose des alias de commande, ce qui est pratique lorsque vous autorisez des lignes de commande compliquées, car elles sont utilisées 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.

0
hildred