Tengo un proceso que comienza con un damon que se ejecuta como root, ahora quiero "degradar" los privilegios de este proceso a los de su usuario promedio. es posible? Si es así, ¿cómo?
PD: ejecutar unix en una mac
process
privileges
Samantha Catania
fuente
fuente
setuid()
solo no es suficiente.sudo tcpdump -Z
usa initgroups (3), setgid (2) y setuid (2) para eliminar los privilegios de raíz de su propio proceso.fuente
initgroups
,setgid
,setuid
(Última!) Es precisamente el paradigma de la derecha en UNIX, y siempre se debe seguir. Además, una función responsable de "droproot" verifica que su uid y gid realmente se hayan configurado, incluso si las tres funciones principales devolvieron el éxito.Puede ejecutar comandos como otros usuarios usando
su
:Se ejecutará
COMMAND
con privilegios reducidos aUSER
.Tenga en cuenta que, de forma predeterminada,
su
utilizará el intérprete de shell del usuario objetivo para ejecutar el comando. Por el contrario, el comportamiento predeterminado desudo
es tratar elCOMMAND
como un programa independiente, es decir, ejecutar el entorno actual. Por supuesto, estos comportamientos predeterminados se pueden cambiar con varios modificadores y variables de entorno.fuente
su
que no funciona si USERNAME no tiene un shell definido (o/bin/false
) mientras que sudo sí funciona.su
lo reflejará. Sin embargo, uno siempre puede anular eso usando el-s
interruptor. Tenga en cuenta que el propósito desu
es imitar el comportamiento de un usuario dado, que normalmente está influenciado por su shell. Por el contrario,sudo
ignoraría (por defecto) la configuración del shell del usuario objetivo.Para eliminar privilegios, necesita un usuario que no sea root para acceder. Entonces es solo cuestión de cambiar a ese usuario:
Tenga en cuenta que esto se realiza dentro del propio programa , en lugar de hacerlo en un script de contenedor. Muchos programas requieren privilegios de root para algún propósito específico (por ejemplo, para enlazar a un puerto de número bajo), pero no necesitan root después de eso. Entonces, estos programas comenzarán como root, pero luego abandonarán los privilegios una vez que ya no sean necesarios.
Si no necesita privilegios de root, simplemente no lo ejecute como root. P.ej:
fuente
setuid
función solo establece el UID efectivo , no el UID real. Debería usarlosetreuid
si no desea que el proceso pueda recuperar los privilegios. (Y el código anterior no tratar con privilegios de grupo suplementarios ya sea Es adecuado sólo para el lanzamiento de código sobre todo de confianza..)setuid()
establece usuarios reales y guardados; usted puede estar pensandoseteuid()
. No todos los sistemas tienensetreuid()
, por lo que no se puede usar en todas partes. La semántica exacta desetuid()
se complica, pero si tiene euid 0, podrá eliminar todos los privilegios de identificación de usuario tradicionalessetuid()
. La mayor omisión en esta respuesta es queinitgroups
osetgroups
debe llamarse así comosetgid
ysetuid
, y que al final deben hacerse afirmaciones más exhaustivas.Si está ejecutando un ejecutable diferente, es decir, está llamando a
execve
otra función de laexec
familia, tal vez indirectamente a través de una función comosystem
opopen
, y el proceso secundario debería ejecutarse sin privilegios desde el principio, entonces la forma más simple es obtener un shell involucrado, y llamesu
. Aquí hay una descripción general de cómo se vería el código en Perl, mostrando las citas necesarias para:Si el proceso secundario necesita comenzar como root pero luego elimina los privilegios, vea el código en esta respuesta , que ilustra cómo degradar los privilegios en un proceso.
fuente