
Estoy intentando crear un servicio que inicie un proceso.
Quiero que el inicio del proceso pueda ejecutar algunos comandos como root y luego ejecutar el resto del proceso como un usuario no humano con menos privilegios.
Por ejemplo: sé que el apache
usuario requiere algunos privilegios de root para realizar algunas configuraciones del servidor web con puertos e iniciar varios procesos del servidor, pero no se ejecuta como root todo el tiempo. No puedo encontrar ningún código que haga algo similar a esto y me preguntaba si hay otros ejemplos que pueda usar.
Básicamente mi pregunta es,¿Cómo puedo otorgar privilegios de root temporales a un usuario no root para ejecutar procesos específicos de root únicamente?
¿O estoy pensando en esto de manera incorrecta?¿No le concedo privilegios de root al usuario y en su lugar hago que el usuario root ejecute los procesos necesarios para root?
Respuesta1
Hay bastantes opciones dependiendo de lo que esté haciendo exactamente como usuario root. Sin embargo, para los servicios automatizados ("como Apache"), generalmente comienza como root y pasa a un usuario restringido.
La configuración de estilo Debian (incluidos Ubuntu y Mint) tendría un archivo en /etc/default/mi-nombre-de-servicioconfigurar a qué usuario se cambia. Otras distribuciones de Linux tienen un lugar diferente para almacenar la configuración, pero la técnica en última instancia es la misma.
Si está escribiendo el programa de servicio usted mismo, utilizarásetuid(). Una vez que haya llamado a setuid, el proceso no podrá volver a tener privilegios de root. Necesitarasbuscar el usuario por nombrey tambiénestablecer los grupos para el usuario.
simplificando un código que escribí hace mucho tiempo:
int lockToUser(const char * user) {
# Look up the username in /etc/passwd
struct passwd * pwd = getpwnam(user);
if (!pwd) {
# Failed... Could not find user, see errno
return 0;
}
# setuid sets the user
# setgid sets the main group similar to the group in /etc/passwd
# Sets the other groups which will grant additional permissions.
# similar to the groups in /etc/groups
if (initgroups(user, pwd->pw_gid) || setgid(pwd->pw_gid) || setuid(pwd->pw_uid)) {
# Failed... Could not lock down to user, see errno
return 0;
}
return 1;
}