¿Puedo hacer que un script siempre se ejecute como root?

27

¿Cómo hacer que un script se ejecute como root, sin importar quién lo ejecute?

Leí sobre setuid pero no estoy seguro de cómo hacerlo.

Estoy usando Linux, Ubuntu 12.04 LTS.

HappyDeveloper
fuente
¿En qué distribución de Linux estás? ¿O incluso Unix?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidno funcionará en los scripts: actualmente está deshabilitado por razones de seguridad en la mayoría de las distribuciones * nix. Puede configurarlo, pero será ignorado. ¿Quizás pueda explicar más sobre su problema real para que podamos ayudarlo a resolver esto? ¿Qué guión es? ¿Por qué necesitas que se ejecute como root? ¿Está usando sudouna alternativa?
slhck
Has intentado sudo -s?
Nam Phung

Respuestas:

29

Tenga mucho cuidado: ¡los guiones combinados con setuid son peligrosos!

Primero, eche un vistazo a esta pregunta / respuestas , especialmente en esta respuesta y advertencia de seguridad .

Si aún desea ejecutar su script con setuidset, puede escribir un programa corto en C como contenedor y establecer el setuidbit en el binario compilado.

Ejemplo de envoltura:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Otra solución usando sudo(mencionado aquí ):

  1. Como root, evite el acceso de escritura (y tal vez otro) a su script:

    raíz conocida /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Verifique que nadie, excepto la raíz, pueda reemplazar el script , por ejemplo, modificando los derechos de acceso de la carpeta principal:

    raíz del chown / absoluta / ruta / a / su /
    chmod 755 / absolute / path / to / your /
    
  3. Modifique los derechos de acceso a sudo /etc/sudoerscon visudo:

    TODOS TODOS = (raíz) NOPASSWD: /absolute/path/to/your/script.sh
    

    Puede encontrar más detalles sobre la configuración (por ejemplo, restringir el acceso a usuarios o grupos específicos) en la página de manual de sudoers.

Luego, todos los usuarios pueden ejecutar el script como root sin contraseña:

sudo /absolute/path/to/your/script.sh

Esto es similar al uso de la solución de envoltura / setuid anterior.

hablador
fuente
3
Los peligros específicos no son muy obvios, pero giran fuertemente en torno al medio ambiente. A diferencia de la mayoría de los programas, el comportamiento de un script de shell se puede cambiar significativamente por docenas de variables de entorno, lo suficiente como para que sin amplias protecciones, dicho script pueda ser engañado fácilmente para ejecutar código arbitrario.
Stephanie
1
Debería agregar una llamada a clearenv () antes de que el sistema llame a ese contenedor, eliminando completamente el entorno para que no haya configuraciones malignas para manipular el script. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@ Stephanie Debo estar haciendo algo mal, porque todo esto parece demasiado loco para una tarea común. Esto es lo que estoy tratando de hacer: serverfault.com/questions/401405/…
HappyDeveloper
@HappyDeveloper No es una locura para un script setuid, ya que uno mal asegurado es un camino a la raíz para cualquiera que logre ejecutarlo.
Stephanie
44
sudose puede usar para dar acceso a todos los usuarios a un programa particular (o script). En ese sentido, actúa como un elegante envoltorio setuid. Parece que eso sería una mejor opción que escribir su propio contenedor setuid.
jjlin
4

La forma más fácil y segura es usar bits SETUID en los permisos de archivos. de esa manera, los permisos de comando se elevarán a permisos de propietario de archivo.

para evitar que la secuencia de comandos de la edición no establezca escritura para todos los bits.

Tadas
fuente
0

No sé si esto puede ser útil, pero, para que el script solo se ejecute como root, puede usar este shebang en la primera línea del script:

#!/bin/su root
alexandre1985
fuente