ubuntu: permite que un usuario ejecute un script con permisos de root

9

Tengo ubuntu 8.04 y quiero escribir un script bash que se ejecute como el rootque puede ejecutar cada usuario.

Yo mismo puedo hacer sudo.

¿Cómo puedo hacer eso?

ACLARACIÓN : No quiero hacerlo con sudo, porque los usuarios tendrán que escribir su contraseña. Solo quiero que ejecuten el script como root, quizás algo setuid, no sé.

flybywire
fuente

Respuestas:

23

Si se trata de un binario normal, puede configurarlo ejecutando

# chmod u+s /path/to/binary

Desafortunadamente, los scripts no se pueden configurar. (Bueno, puedes, pero se ignora). La razón de esto es que la primera línea del script le dice al sistema operativo en qué intérprete ejecutar el script. Por ejemplo, si tenía un script con:

#!/bin/bash

En realidad terminarías corriendo

/bin/bash /path/to/script

Obviamente, necesitaría que el intérprete sea setuid, lo que significaría que todos los scripts serían setuid. Esto seria malo.

Puede hacer esto con sudo poniendo lo siguiente en su archivo / etc / sudoers ejecutando visudo.

ALL ALL=NOPASSWD: /path/to/script

Y ahora cualquier usuario puede ejecutar

$ sudo /path/to/script

Esto les permite ejecutar el script sin escribir su contraseña.

Hay una alternativa que no requiere sudo en el comando, que requiere crear un pequeño binario setuidizado que ejecute su script, pero cada binario setuid adicional agrega otro posible problema de seguridad.

David Pashley
fuente
Creo que esta es la respuesta que estaba buscando. ¿No puedo configurar un script bash, solo un binario? (Por supuesto, tomaría medidas para que no se pueda editar)
flybywire
No, no puede crear un script setuid.
wfaulk
wfaulk: Solías poder hacerlo, pero las distribuciones de Linux más recientes ya no lo permiten. Puede usar una herramienta como shc para 'compilar' el script y luego configurarlo.
Kyle Brandt
wfaulk: Por supuesto, eso sería hacer todo lo posible para hacer algo que está deshabilitado intencionalmente, por lo que probablemente sea una mala idea :-)
Kyle Brandt el
Reemplace el término ALLcon un nombre de usuario para permitir que ese sudoer pueda ejecutarse sin ingresar una contraseña.
Hdave
3

Necesitaba insertar esa línea AL FINAL de / etc / sudoers: ALL ALL = NOPASSWD: <filename> Aparentemente, una %admin ALL=(ALL) ALLanulación posterior requería una contraseña para los usuarios administradores.

No hay ningún problema de seguridad que permita que un script se ejecute como root siempre que el script realice una acción bien determinada, inofensiva y permitida y, si los valores de cualquier parámetro no pueden hacer que el script se comporte mal.

Pero hay un problema ...

Utilice siempre rutas completas en los nombres de comandos y archivos. Si escribe algo como echo Hello world!en myrootscript, alguien podría escribir un ~/bin/echo scripty myrootscriptejecutaría como root lo que sea que esté en él.

/bin/echo "Hoping this will keep you safe" :-)

André
fuente
si es posible que un usuario no root en la máquina edite ese script, entonces ese usuario puede hacerse cargo de la máquina. Si ese mismo usuario tiene una contraseña débil, nada impide que su máquina se vea totalmente comprometida.
Hdave
2

Por defecto, los miembros del wheelgrupo tienen permiso para sudocualquier comando como root. Probablemente así es como lo está usando sudohasta la fecha.

Para permitir otro usuario, deberá crear una sudoersregla. Por ejemplo:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Permitirá al usuario mickey.mouseejecutar el comando /usr/local/bin/test.shcomo si rootno requiriera una solicitud de contraseña adicional.

Debe leer este documento para más información.

Dan Carley
fuente
Debian / Ubuntu usa el grupo de administración en lugar de la rueda. Es posiblemente un nombre un poco más preciso.
David Pashley
Llámame anticuado, pero ...;)
Dan Carley
1
anticuado: P
David Pashley
0

Use chmod +s <filename>para ver el bit suid. Esto significa que cuando se ejecuta el archivo, se ejecuta con los permisos del propietario del archivo (por lo tanto, conózcalo en la raíz para que se ejecute de esa manera).

Sin embargo, esto puede ser MUY peligroso con algo como un script de bash, porque un usuario encuentra la manera de cambiarlo, puede obtener fácilmente un shell raíz. Asegúrese de que nadie pueda escribirle, excepto root.

Linux no le permite configurar los scripts, para ello tendría que compilarlo como un programa. En su lugar, puede usar el archivo sudoers (/ etc / sudoers) y agregar una línea como esta.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
fuente
0

Otra alternativa: puede hacer un pequeño contenedor C setuid alrededor de ese script que

  • comprueba cualquier limitación que desee aplicar (lista de usuarios, hora, carga del sistema, ...)
  • ejecución de registros / auditorías si se desea
  • ejecuta el script

Algo así como tu propio subconjunto de las múltiples capacidades de sudo.

mpez0
fuente