Permitir al usuario ejecutar un comando con argumentos (que contiene espacios)

17

Quiero permitir que un usuario ejecute grep (a través de sudo) y grep para una cadena específica en un archivo específico. No quiero permitir que este usuario pueda ejecutar grep en todos los archivos. El usuario no tiene acceso de lectura al archivo, de ahí el requisito de usar sudo. Estoy tratando de escribir un cheque nagios que agrupa el archivo de registro de otro servicio en la máquina.

Sin embargo, no funciona, sudo sigue pidiendo una contraseña.

Mi comando es: sudo grep "string I want (" /var/log/thefilename.log(sí, hay un (espacio en bruto y algunos espacios en la cadena que quiero grep)

/etc/sudoers.d/user-can-grep tiene este contenido:

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

Este archivo sudoers es propiedad root:rooty tiene permisos-r--r-----

El servidor es Ubuntu confiable 14.04.3 LTS.

¿Cómo puedo hacer que esto funcione?

Rory
fuente
¿La verificación de nagios llama explícitamente a / bin / grep o / usr / bin / grep?
Jeff Schaller
Escriba un script de shell que haga esto y luego deje que se ejecute el script sudo.
user253751
@JeffSchaller FYI, el script simplemente llama grepy which grepme dice que está usando /bin/grep. AFAIK en el archivo sudo necesita especificar la ruta completa del binario, incluso si lo llama sin la ruta completa.
Rory

Respuestas:

13

Aparentemente, sudo aplana el comando en una cadena antes de compararlo con una especificación en el archivo sudoers. Entonces, en su caso, no necesita usar comillas ni ninguna otra forma de escape:

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

Editar : como @ user23013 señala en los comentarios, esto se puede explotar para grep para "string I want" en cualquier archivo (y, por extensión, también para "string I" y "string"). Por favor, considere detenidamente antes de usando la comprobación de argumentos de sudo!


También tenga en cuenta que las siguientes invocaciones son equivalentes, es decir, no podrá restringir a los usuarios a una representación específica:

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

Esto se debe al hecho de que las cotizaciones y los escapes son manejados por el shell y nunca llegan sudo.

Alexander Batischev
fuente
Interesante, me pregunto si eso es explotable, es decir, convencerte de sudoque escribiste una cosa (que coincide con la especificación), pero cuando se trata de ejecutarla, es algo completamente diferente.
EightBitTony
44
@EightBitTony ¡Por supuesto que sí! En su sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(con la intención de permitir a los usuarios editar "Editar archivo de sudoers") puede explotarse cdingresando /etc/y ejecutándose sudo vim Editing sudoers file. Yo diría que para cualquier comando de complejidad razonable uno debe ir con el enfoque sugerido en su comentario: el shell proporciona una $@variable donde puede verificar que los argumentos están agrupados de la manera que espera que estén agrupados.
Alexander Batischev
8
Cree una ruta en ( /var/logcualquier lugar y enlace simbólico thefilename.loga cualquier archivo, el usuario puede seleccionar string I wantdesde cualquier archivo.
user23013
2
La respuesta de @ EightBitTony (escribir un script de contenedor, permitir el acceso de sudo a ese script) es mucho mejor y más segura.
cas
Wow, esa es una práctica extremadamente pobre para una herramienta centrada en la seguridad.
Sam Watkins,
32
  1. Escribir un guión (solo se puede escribir por raíz)
  2. En ese script, ejecute lo grepque necesita
  3. En la configuración de sudoers, permita solo el acceso a ese script
  4. Configure cualquier herramienta o avise a cualquier usuario que simplemente ejecute el script a través de sudo

Mucho más fácil de depurar, más fácil bloquear el acceso específico a un archivo específico y mucho más difícil de explotar.

OchoBitTony
fuente
2

Ya que sólo necesita root para el acceso a los archivos, considere el uso cat, teeo algo similar y tuberías que a grep, o cualquier programa que necesita para funcionar. Por ejemplo, de sudo cat /file/path | grep …esta manera restringe la raíz a donde la necesita absolutamente.

usuario167676
fuente
0

sudoes genial, pero a veces no es la mejor opción. Para esto me gusta usar super. supertambién permite permisos elevados, sin embargo, asume alias de comando, lo cual es conveniente cuando se permiten líneas de comando complicadas, ya que se usan como líneas de comando simples.

su super.tab se vería así:

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

y sería invocado como super grepcmd.

hildred
fuente
sudohas Cmnd_Alias(que puede contener uno o más comandos, con o sin restricciones arg).
cas
No es lo mismo en absoluto. Cmnd_Alias ​​es una herramienta para simplificar el archivo de configuración, no expone un alias al usuario, que es el modo principal de operación de super (razón por la cual uso sudo cuando no estoy aliasando comandos o ejecutando scripts suid (la mayoría de las veces) , y super para estos dos casos de uso).
hildred
para eso están los scripts de envoltura ... y no se limitan a frases simples o tienen problemas de citas molestos.
cas