¿Cómo uso argumentos de comando con Cmnd_Alias ​​en sudoers?

36

¿Cómo especifico argumentos de comando en sudoers? Como fondo, el awscomando es en realidad una puerta de entrada a un montón de subsistemas y quiero restringir al usuario para que solo se ejecuteaws s3 cp ...any other args...

Cuando intento lo siguiente en /etc/sudoers

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD

El shell lamentablemente solicita contraseña

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:

Si elimino el comando args en Cmnd_Alias, fluye según lo deseado (sin solicitud de contraseña), pero la autorización es demasiado amplia. Entonces, ¿cuál es la forma correcta de restringir solo a ciertos tipos de invocaciones de comandos ?

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws

Luego

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy

Muchas gracias.

Dinesh
fuente
¿Por qué tiene / usr / local / bin / aws, / usr / local / aws / bin / aws? ¿Quiero decir que repitiste el comando dos veces en la misma línea?
Mohammed Noureldin

Respuestas:

47

No ha utilizado ningún comodín, pero ha proporcionado dos argumentos. Por lo tanto, sudobusca los comandos exactamente como están escritos (excepto la búsqueda de ruta) (desde man 5 sudoers):

 If a Cmnd has associated command line arguments, then the arguments in
 the Cmnd must match exactly those given by the user on the command line
 (or match the wildcards if there are any).

Intenta algo como:

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *

Tenga en cuenta que:

 Wildcards in command line arguments should be used with care.  Because
 command line arguments are matched as a single, concatenated string, a
 wildcard such as ‘?’ or ‘*’ can match multiple words. 

Por lo tanto, solo se necesita un comodín por comando.

muru
fuente
1
+1 para una explicación sucinta y compartir conocimientos, gracias.
Dinesh
1
Tenga en cuenta que sudo no respeta adecuadamente la separación de argumentos que pueden usarse para exploits en algunos casos, consulte unix.stackexchange.com/a/279142/43920 . Entonces, en lugar de especificar /usr/local/bin/aws s3 cpen sudoers, es más seguro reemplazar eso con un script (solo escribible por root).
pcworld
6

Lo mismo que @muru, pero para aquellos que les gusta el ejemplo de trabajo completo:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *

# Make USER run specific commands on given HOSTNAME
# USER_NAME 

#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD

Mientras /sbin/cmd1, /sbin/cmd2puede ser cualquier otro comando.

El propósito de ECHO_CMDes presentar que sudo echo X Asolicitará una frase de contraseña, mientras que sudo echo A Xno, y permitirle ganar confianza a través de un experimento tan simple.

(Se asumió que el eco se encuentra /bin/echo, para verificar dónde está en su sistema, intente whereis echo)

Grzegorz Wierzowiecki
fuente
Sí, hay /bin/echobinarios, pero la mayoría de los shells también tienen una función incorporada echoque se usará en lugar de este binario si no proporciona la ruta completa.
Marki555