2012-09-05 10 views
13

Después de la puesta en marcha, me gustaría que mi programa de Linux descarte los privilegios de root y cambie a una cuenta no privilegiada. He encontrado varios ejemplos en línea, pero nada canónica para mis necesidades, específicamente:privilegios de root de forma permanente en Linux moderno

  1. esto es una caída permanente
  2. tanto GID (e) uid y (e) deberían cambiar a no root
  3. solamente El soporte de Linux (kernel> 2.6.32)
  4. sin necesidad de grupos suplementarios

El mejor método que he encontrado es:

uid_t new_uid = ...; 
gid_t new_gid = ...; 

gid_t rgid, egid, sgid; 
if (setresgid(new_gid, new_gid, new_gid) < 0) 
{ 
    perror("setresgid"); 
    exit(EXIT_FAILURE); 
} 
if (getresgid(&rgid, &egid, &sgid) < 0) 
{ 
    perror("getresgid"); 
    exit(EXIT_FAILURE); 
} 
if (rgid != new_gid || egid != new_gid || sgid != new_gid) 
{ 
    printf("unexpected gid"); 
    exit(EXIT_FAILURE); 
} 

if (setgroups(0, 0) != 0) 
{ 
    perror("setgroups"); 
    exit(EXIT_FAILURE); 
} 

uid_t ruid, euid, suid; 
if (setresuid(new_uid, new_uid, new_uid) < 0) 
{ 
    perror("setresuid"); 
    exit(EXIT_FAILURE); 
} 
if (getresuid(&ruid, &euid, &suid) < 0) 
{ 
    perror("getresuid"); 
    exit(EXIT_FAILURE); 
} 
if (ruid != new_uid || euid != new_uid || suid != new_uid) 
{ 
    printf("unexpected uid"); 
    exit(EXIT_FAILURE); 
} 

puedo terminar esto en un exe y demostrar que las de UID y de gid aparecen usando correcta:

ps -eO user,uid,ruid,suid,group,gid,rgid,sgid 

El programa no se puede unir a un puerto privilegiado o manipular la mayoría de los archivos de propiedad raíz, por lo que es todo bueno.

También encontré el programa captest (incluido en libcap-ng-utils) que verifica que el proceso no tiene ningún capabilities(7) inesperado.

Sin embargo, dado que la seguridad es una preocupación, me gustaría tener más confianza en que he descartado correctamente todos los privilegios no esenciales. ¿Cómo puedo estar seguro?

Gracias.

+0

¿Ha revisado [setuidgid] (http://cr.yp.to/daemontools/setuidgid .html)? Es parte de [D.J. Bernstein's] (http://cr.yp.to/djb.html) [Paquete de herramientas de Daemon] (http://cr.yp.to/daemontools.html). La revisión de la fuente de este programa podría ser útil. –

+0

Puede echar un vistazo a la fuente 'sudo' o' su' para ver cómo se puede lograr esto. – Kevin

Respuesta

1

La forma "canónica" de hacer esto fue implementada por D.J.Bernstein en su código 'setuidgid', que se utilizó originalmente en su programa QMail, actualmente incluido en 'daemontools'.

El código real utilizado en GNU coreutils se basa en la descripción del procedimiento de DJB, su código es visible aquí https://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c

+0

Ah, genial. Voy a seguir adelante y acepto esta respuesta, aunque no puedo usarla directamente debido a la licencia. –

+0

El enlace está roto. – alexander255

+0

gracias por notarlo, corregido ahora – Jaromil

Cuestiones relacionadas