Permitir que otro usuario ejecute un script específico como mi ID

Tengo un script en algún lugar de mi directory personal. Necesito otorgar permissions a otro usuario o grupo para que cuando ejecute ese script específico, se ejecute como si hubiera iniciado session y tuviera todos los permissions que mi ID tiene. No quiero usar sudo o su y seguir configurándolos como sudoers o ingresando passwords.

Con sudo puede get granularidad con sus permissions. Si desea otorgar permiso a un usuario para que solo ejecute su script y nada más, puede agregar esta línea a su / etc / sudoers:

user ALL=(yourusername) NOPASSWD: /path/to/your/script 

Luego, como el otro uso, ejecutarías:

 sudo -u yourusername /path/to/your/script 

Usar sudo es la forma más fácil. Pero requiere la cooperación del administrador del sistema para configurarlo.

Si desea hacer esto sin privilegios especiales, puede usar un file ejecutable setuid , pero debe tener cuidado de no permitir que la persona que llama haga más de lo que deseaba.

La mayoría de las variantes de Unix prohíben los scripts de shell setuid ; por ejemplo, en Linux, el núcleo siempre ignora el bit de setuid en un script. Entonces necesitas un contenedor en código nativo.

Tenga cuidado de que el contenedor elimine todo lo que pueda permitir que el usuario lo invoque para ejecutar código. Por ejemplo, las variables de entorno de la list blanca; cualquier cosa que no se sepa que es segura (por ejemplo, TERM ) debe irse.

Aquí hay una propuesta para un wrapper setuid que solo conserva la variable de entorno TERM . Tenga cuidado de no haberlo revisado o realmente probado; bienvenido.

 /* Comstacktion command: c99 -DTARGET='"/absolute/path/to/script"' -o setuid-wrapper setuid-wrapper.c */ #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> void die(const char *argv0, const char *obj, const char *msg) { if (msg == NULL) msg = strerror(errno); fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg); exit(127); } int env_want(const char *entry) { size_t n; for (n = 0; entry[n]; n++) { if (entry[n] == '=') { break; } else if (!(isalnum(entry[n]) || entry[n] == '_')) { return 0; } } if ((n == 7 && !strncmp(entry, "DISPLAY", n)) || (n == 10 && !strncmp(entry, "XAUTHORITY", n))) { return 1; } if ((n == 4 && !strncmp(entry, "LANG", n)) || (n >= 3 && !strncmp(entry, "LC_", 3)) || (n == 2 && !strncmp(entry, "TZ", n))) { return !strpbrk(entry, "/%"); } return 0; } int main(int argc, char *argv[], char **environ) { size_t i, j; const char *program_name = argv[0]; if (program_name == NULL) program_name = "setuid-wrapper"; /* Drop privileges */ if (setgid(getegid())) die(program_name, "setgid", NULL); /*if (setgroups(0, NULL)) die(program_name, "setgroups", NULL);*/ if (setuid(geteuid())) die(program_name, "setuid", NULL); /* Sanitize the environment */ for (i = j = 0; environ[i]; i++) { if (env_want(environ[i])) { environ[j] = environ[i]; j++; } } environ[j] = NULL; /* Execute the command */ execle(TARGET, TARGET, NULL, environ); die(program_name, TARGET, NULL); } 

Tenga en count que el progtwig objective se ejecutará con los grupos suplementarios de la persona que llama porque no puede descartar grupos suplementarios sin ser root.

Un enfoque alternativo sería ejecutar un server (por ejemplo, un server web) e invocar su secuencia de commands desde ese server. Hay muchos serveres HTTP pequeños que admiten scripts CGI. La principal ventaja de este enfoque es que es más fácil de proteger, ya que el server se ejecuta en un context elegido por el objective (la parte en cuyo context de security se ejecuta el código), no por el cliente.

Una variante de este enfoque sería activar la ejecución de la secuencia de commands a través de un sistema de files FUSE . Por ejemplo, monte un directory scriptfs que contenga su script con la opción allow_other mount. Esto requiere que la opción user_allow_other se establezca en /etc/fuse.conf .