Estoy tratando de hacer lo seguro, y tengo un programa que necesita ejecutarse como root para eliminar sus privilegios cuando no los necesita. Esto funciona bien si chmod
mi binario con el bit SUID y lo hago pertenecer a root, ya que ahora tengo UID = algún usuario y EUID = root, entonces puedo usar seteuid(0)
y seteuid(getuid())
para subir y bajar derechos de administrador, respectivamente.¿Cómo se usa setuid() desde root para convertirse en usuario, con la posibilidad de volver a ser root más tarde?
Pero si uso sudo
en lugar de establecer el SUID, entonces UID == EUID == 0, y por lo tanto llamar a seteuid(getuid())
no tendrá ningún efecto. Y no puedo simplemente cambiar UID
a algún valor de algún usuario aleatorio, ya que la página del manual setuid()
indica claramente que si se llama desde un programa que se ejecuta como raíz, uno pierde los privilegios para siempre, sin esperanza de recuperarlos.
Entonces, ¿cómo hago que mi programa pierda temporalmente sus privilegios cuando se ejecuta usando sudo
?
¿Necesita volver al UID del usuario que ejecutó 'sudo', o simplemente a un usuario aleatorio, menos privilegiado? –
Me conformaré con 'nadie'. pero si conoces una forma simple de obtener la llamada sudo, estoy interesado. – Florian
meh, es fácil, solo necesito 'getenv (" SUDO_UID ")'. – Florian