Limitar el uso de `sudo -s`

8

Estoy configurando Nagios en algunos de mis servidores Linux y me he encontrado con un pequeño problema. El check_ide_smartcomplemento requiere acceso de root al sistema para ejecutarse. Para ejecutarlo, utilizo el check_by_sshcomplemento para ingresar a la cuenta nagios en el host remoto, luego ejecuto check_ide_smartusando sudo.

Inicialmente agregué las siguientes líneas /etc/sudoerspara permitir que el programa funcione:

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

Si bien esto funcionó bien cuando se ejecuta localmente, estaba teniendo un problema cuando se ejecutaba desde Nagios: no se generaba TTY, lo que impedía que el complemento funcionara.

Busqué sudo en la página de manual y encontré la opción -s, que genera un shell y ejecuta el programa allí. Cuando intenté usar sudo -s, me encontré con problemas de permisos ya que aparentemente -s cambia el comando a /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart, que no está permitido por el archivo sudoers. Intenté cambiar el archivo sudoers para usar ese comando en su lugar, pero eso no funcionó, y el uso de comillas es un error de sintaxis.

Eventualmente lo puse a trabajar usando la siguiente línea en /etc/sudoers:

nagios ALL=/bin/bash

Esto se siente realmente mal para mí, ya que estoy permitiendo que el usuario nagios genere un shell raíz, con el que puede hacer cualquier cosa.

En este punto, pensé que tal vez, al poner el comando en un script de shell en el que el usuario nagios tiene privilegios de solo lectura funcionaría, entonces creé un script de shell:

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

Desafortunadamente, nunca pude hacer que los parámetros pasados ​​( $@) funcionen correctamente con el complemento, por lo que no sé si esto funcionaría. Editar: necesitaba citar el $@para que funcione. Gracias @derobert y @pjz. Todavía no sé si funcionaría desde que lo hice funcionar usando la solución de @Mike Arthur.

¿Hay alguna manera de que pueda ponerme sudo -sa trabajar sin permitir el engendro de un shell raíz?

Responder:

Se agregó la siguiente línea a /etc/sudoers:

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

Tenga en cuenta el asterisco final; sin ella, esto no funciona. Gracias @ Mike Arthur por la respuesta.

Chris Lieb
fuente

Respuestas:

7

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

Esto debería funcionar y permitir argumentos.

Mike McQuaid
fuente
Eso no funcionó. Vea mi edición para más detalles.
Chris Lieb
@ Chris Lieb: tendrá que cambiar su llamada de "sudo -s ..." a "sudo / bin / bash -c ...". Entonces debería funcionar. Tengo una configuración similar trabajando aquí (no nagios, pero similar).
Martin C.
Lo he solucionado, pruébalo ahora (con el asterisco para comodines).
Mike McQuaid
2

Para su información, necesita citar $ @ en su script de shell para que funcione correctamente:

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

$@es mágico. Desde la página de manual de bash,

@ Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión se produce entre comillas dobles, cada parámetro se expande a una palabra separada. Es decir, "$ @" es equivalente a "$ 1" "$ 2" ... Si la expansión entre comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y la expansión del último parámetro se une con la última parte de la palabra original. Cuando no hay parámetros posicionales, "$ @" y $ @ se expanden a nada (es decir, se eliminan).

Además, comenzar bash no generará una pty; aunque estoy perplejo de por qué su complemento nagios necesita un terminal para ejecutarse. No debería ¿Quizás el problema real es la desinfección del medio ambiente de sudo?

derobert
fuente
Este complemento es el único que ha causado problemas. Ninguno de los otros que he configurado hasta ahora requiere acceso de root, por lo que no necesitaba usar sudo para ellos. Debido a esto, no estoy seguro de si el problema es causado por sudo que no genera un shell o por el complemento check_ide_smart que requiere un shell para ejecutarse.
Chris Lieb
1

En lugar de usar sudo -sy lanzar un shell de root, solo permita que su usuario de nagios use sudo sin usar tty !requiretty. Su /etc/sudoersdebe tener lo siguiente:

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

... que permitirá el acceso directo a sudo, sin contraseña y sin tty. Puede dejar "check_ide_plugin" desactivado si desea sudo acceso a todos los complementos.

También usamos NRPE, que parece un poco más seguro que check_by_ssh, pero requiere un poco más de configuración. La misma idea en / etc / sudoers aunque, simplemente intercambie nagios con nrpe. :)

~ tommy

TommyTheKid
fuente
0

Intente el script nuevamente pero ponga comillas dobles alrededor de su $ @:

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

No creo que sea posible usar -s sin generar un shell raíz (suponiendo que necesite privilegios de root). La opción -s está específicamente allí para generar un shell. Eso es lo que significa. Desde 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
fuente
1
Se ejecuta un shell, pero su actual es permitir cualquier llamada a /bin/bash, lo que también permite generar un shell interactivo sin ninguna limitación y sin restricciones sobre qué comandos se pueden llamar.
Martin C.