Permitir comandos sudo complejos en Debian Linux

13

Necesito permitir un comando específico en un cuadro de Debian Linux para un solo usuario. He intentado esto en el /etc/sudoersarchivo:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

Esto no funciona como se esperaba. Si ejecuto el comando como usuario zabbix con sudo, me pide la contraseña (aunque he especificado elNOPASSWD opción).

Sin embargo, esto funciona:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

Pero tiene el inconveniente de que todos los subcomandos apt-getestán permitidos. ¿Hay alguna forma de solucionar esto para permitir solo un comando específico?

Daniel
fuente

Respuestas:

10

No estoy de acuerdo con la mentira. Aunque funcionará, no es necesario awkque se ejecute como root. No me sentiría cómodo con esto porque podrías atacarawk de alguna manera. Es un intérprete completo de lenguaje de programación después de todo.

Cuando uno se ejecuta sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}', en realidad se está ejecutando sudo /usr/bin/apt-get --print-uris -qq -y upgradey luego canalizando / redirigiendo como usuario llamante.

Prueba esto: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

Por cierto, no hay nada de malo en poner esto en un guión como lo hace lain y aún puedes hacerlo. Simplemente evitaría ejecutar awk como root si es posible.

usuario606723
fuente
1
Tienes razón, pero si el guión es inseguro, no importa lo que contenga, se puede sobrescribir y el mundo es tu ostra. Si el script es seguro, entonces lo que contiene es seguro también.
user9517
25

Probablemente te estés equivocando por la forma en que la redirección interactúa con sudo. La redirección se realiza en el usuario llamante, no en el usuario privilegiado. Probablemente sería más fácil para usted ajustar su comando en un script y luego permitir que el usuario de zabbix ejecute ese script, por ejemplo

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

los sudoers establecidos como

zabbix  ALL=NOPASSWD: /path/to/script

Ahora todo el script se ejecutará como el usuario privilegiado y no solo el comando apt-get en particular. Sin embargo, asegúrese de que el usuario de zabbix no pueda escribir en el script.

usuario9517
fuente
1
Probablemente alguien pueda corregirme si sudo ya se encarga de eso (parece recordar haber tenido problemas con las variables env no pasadas), pero sugeriría que awk y wc tengan sus rutas completas como una mejor práctica general para los scripts para que un usuario pueda no exporte PATH = ~ user / bin: $ PATH y pegue los comandos que desee en un script llamado awk (o wc) en ~ user / bin
Foon
@Foon: Creo que estás confundiendo sudo con cron.
usuario9517
1
No lo confundo , pero superuser.com/questions/232231/… indica que sudo evita la manipulación de la RUTA (y LD_LIBARRAY_PATH por defecto)
Foon
Hice algo similar solo que obtuve el script evocador y lo escribí solo de raíz. Pruebe si funciona para el usuario con permisos 711, luego ni siquiera puede ver lo que está haciendo para tratar de eludirlo.
Chris K