(10 respuestas)
Cerrado hace 6 años.
Quiero asegurarme de que mi programa solo pueda ser ejecutado por el usuario xyz
utilizando el privilegio de root. Para hacer esto, configuro el bit setuid con:
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
Además, agregué al usuario xyz
a la house
grupo para que solo xyz
y root puede ejecutar program1.sh.
En program1.sh hay
id -u
para que me muestre el ID efectivo.
Ejecutando program1.sh
como root, muestra root
. Pero corriendo con el xyz
cuenta, muestra xyz
. Parece que no se ejecutó con privilegios de root. No sé qué está mal aquí.
Respuesta aceptada:
Al ejecutar secuencias de comandos de shell que tienen el bit setuid (por ejemplo, permisos de rwsr-xr-x), las secuencias de comandos se ejecutan como el usuario que las ejecuta, no como el usuario que las posee. Esto es contrario a cómo se maneja setuid para los archivos binarios (por ejemplo, /usr/bin/passwd), que se ejecutan como el usuario que los posee, independientemente del usuario que los ejecute.
Consulte esta página:https://access.redhat.com/site/solutions/124693
Esta es una medida de seguridad tomada por el sistema operativo. Deberías usar tu script con sudo en su lugar.
Si realmente necesita usar setuid en su script, puede crear un binario que haga el trabajo. Cree un nuevo archivo “program.c” y copie el siguiente código:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
return 0;
}
Compile y ejecute el código usando los siguientes comandos:
$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program
De esta manera funcionará. El setuid funciona para el archivo compilado, y este archivo puede ejecutar otros archivos como root.