Limiter l'utilisation de `sudo -s`

8

J'installe Nagios sur certains de mes serveurs Linux et j'ai rencontré un peu de problème. Le check_ide_smartplugin nécessite un accès root au système pour fonctionner. Pour l'exécuter, j'utilise le check_by_sshplugin pour ssh dans le compte nagios sur l'hôte distant, puis je lance en check_ide_smartutilisant sudo.

J'ai initialement ajouté les lignes suivantes /etc/sudoerspour permettre au programme de fonctionner:

nagios  ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart

Bien que cela ait très bien fonctionné lorsqu'il était exécuté localement, je rencontrais un problème lorsqu'il était exécuté à partir de Nagios: aucun TTY n'était généré, ce qui empêchait le plugin de fonctionner.

J'ai creusé la page de manuel de sudo et trouvé l'option -s, qui génère un shell et exécute le programme là-dedans. Lorsque j'ai essayé d'utiliser sudo -s, j'ai rencontré des problèmes d'autorisation car le -s change apparemment la commande en /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart, ce qui n'est pas autorisé par le fichier sudoers. J'ai essayé de changer le fichier sudoers pour utiliser cette commande à la place, mais cela n'a pas fonctionné, et l'utilisation de guillemets est une erreur de syntaxe.

Je l'ai finalement fait fonctionner en utilisant la ligne suivante dans /etc/sudoers:

nagios ALL=/bin/bash

Cela me semble vraiment mal car j'autorise l'utilisateur nagios à générer un shell racine, avec lequel il peut faire n'importe quoi.

À ce stade, je pensais que peut-être, en mettant la commande dans un script shell sur lequel l'utilisateur nagios aurait des privilèges de lecture seule, cela fonctionnerait, alors j'ai créé un script shell:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin $@

Malheureusement, je n'ai jamais pu obtenir les paramètres passés ( $@) pour fonctionner correctement avec le plugin, donc je ne sais pas si cela fonctionnerait. Edit: je devais citer le $@pour que cela fonctionne. Merci @derobert et @pjz. Je ne sais toujours pas si cela fonctionnerait depuis que je l'ai fait fonctionner avec la solution de @Mike Arthur.

Existe-t-il un moyen de me mettre sudo -sau travail sans autoriser le frai d'un shell racine?

Réponse:

Ajout de la ligne suivante à /etc/sudoers:

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Notez l'astérisque de fin; sans cela, cela ne fonctionne pas. Merci @Mike Arthur pour la réponse.

Chris Lieb
la source

Réponses:

7

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Cela devrait fonctionner et autoriser les arguments.

Mike McQuaid
la source
Ça n'a pas marché. Voir ma modification pour plus de détails.
Chris Lieb
@Chris Lieb: vous devrez changer votre appel de "sudo -s ..." en "sudo / bin / bash -c ...". Ensuite, cela devrait fonctionner. J'ai une configuration similaire qui fonctionne ici (pas nagios, mais similaire).
Martin C.
Je l'ai corrigé, essayez-le maintenant (avec l'astérisque pour les caractères génériques).
Mike McQuaid
2

Pour info, vous devez citer $ @ dans votre script shell pour que cela fonctionne correctement:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"

$@est magique. Depuis la page de manuel bash,

@ Développe les paramètres positionnels, en commençant par un. Lorsque l'expansion se produit entre guillemets doubles, chaque paramètre se développe en un mot distinct. Autrement dit, "$ @" est équivalent à "$ 1" "$ 2" ... Si l'expansion entre guillemets se produit dans un mot, l'expansion du premier paramètre est jointe à la partie de début du mot d'origine et l'expansion du dernier paramètre est joint à la dernière partie du mot d'origine. Lorsqu'il n'y a pas de paramètres de position, "$ @" et $ @ se développent à rien (c'est-à-dire qu'ils sont supprimés).

De plus, le démarrage de bash ne générera pas de pty; bien que je ne sache pas pourquoi votre plugin nagios a besoin d'un terminal pour fonctionner. Ça ne devrait pas. Peut-être que le problème réel est la désinfection de l'environnement de sudo?

derobert
la source
Ce plugin est le seul à avoir causé des problèmes. Aucun des autres que j'ai mis en place jusqu'à présent ne nécessite un accès root, donc je n'avais pas besoin d'utiliser sudo pour eux. Pour cette raison, je ne sais pas si le problème est dû au fait que sudo ne génère pas de shell ou au plugin check_ide_smart nécessitant un shell pour s'exécuter.
Chris Lieb
1

Au lieu d'utiliser sudo -set de lancer un shell root, permettez simplement à votre utilisateur nagios d'utiliser sudo sans utiliser de tty !requiretty. Vous /etc/sudoersdevriez avoir les éléments suivants:

# Allow Nagios extra privs
Defaults:nagios !requiretty
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_plugin

... qui permettra un accès direct à sudo, sans mot de passe, et sans tty. Vous pouvez laisser le "check_ide_plugin" désactivé si vous voulez que sudo accède à tous les plugins.

Nous utilisons également NRPE, qui semble un peu plus sûr que check_by_ssh, mais il nécessite un peu plus de configuration. Même idée dans / etc / sudoers tho, il suffit d'échanger nagios avec nrpe. :)

~ tommy

TommyTheKid
la source
0

Essayez à nouveau le script mais mettez des guillemets autour de votre $ @:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"
pjz
la source
-1

Je ne pense pas qu'il soit possible d'utiliser -s sans générer un shell root (en supposant que vous ayez besoin des privilèges root). L'option -s est spécifiquement là pour générer un shell. C'est ce que signifie -s. Depuis sudo (8):

-s [command]
    The -s (shell) option runs the shell specified by the SHELL
    environment variable if it is set or the shell as specified
    in passwd(5).  If a command is specified, it is passed to
    the shell for execution.  Otherwise, an interactive shell
    is executed.
Christopher Cashell
la source
1
Un shell est exécuté, mais son courant est d'autoriser tout appel à /bin/bash, ce qui permet également la génération d'un shell interactif sans aucune limitation et sans aucune restriction sur les commandes qui peuvent être appelées.
Martin C.