Esto es algo en lo que no he podido encontrar mucha información, por lo que agradecería cualquier ayuda.
Mi entendimiento es así. Toma el siguiente archivo:
-rw-r----- 1 root adm 69524 May 21 17:31 debug.1
El usuario phil
no puede acceder a este archivo:
phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied
Si phil
se agrega al adm
grupo, puede:
root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [ 0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014
Si, sin embargo, un proceso que se inicia al mismo tiempo establecer explícitamente la user:group
que phil:phil
no puede leer el archivo. El proceso comenzó así:
nice -n 19 chroot --userspec phil:phil / sh -c "process"
Si el proceso se inicia como phil:adm
, puede leer el archivo:
nice -n 19 chroot --userspec phil:adm / sh -c "process"
Entonces la pregunta realmente es:
¿Qué tiene de especial ejecutar un proceso con un combo de usuario / grupo específico que impide que el proceso pueda acceder a archivos propiedad de grupos suplementarios de ese usuario y hay alguna forma de evitarlo?
Respuestas:
Un proceso se ejecuta con un uid ang un gid. Ambos tienen permisos asignados a ellos. Puede llamar a chroot con una especificación de usuario de un usuario y grupo, donde en realidad el usuario no está en ese grupo. El proceso se ejecutaría con los usuarios uid y los grupos dados gid.
Mira un ejemplo. Tengo un usuario llamado
user
, y él está en el grupostudent
:Tengo un archivo de la siguiente manera:
No puede leerlo:
Ahora, puedo ejecutar el
cat
proceso en el contexto del usuariouser
Y el gruporoot
. Ahora, el proceso cat tiene los permisos necesarios:Es interesante ver lo que
id
dice:Hm, pero el usuario
user
no está en ese grupo (root
). ¿De dóndeid
obtiene su información? Si se llama sin argumento,id
usa las llamadas al sistemagetuid()
,getgid()
ygetgroups()
. Entoncesid
se imprime el contexto del proceso en sí mismo. Ese contexto con el que nos hemos alterado--userspec
.Cuando se llama con un argumento,
id
solo determina las asignaciones de grupo del usuario:A su pregunta:
Puede establecer el contexto del proceso de seguridad que se necesita para resolver cualquier tarea que el proceso necesite hacer. Cada proceso tiene un conjunto de UID y GID bajo el cual se ejecuta. Normalmente, el proceso "toma" a los usuarios que llaman uid y gid como contexto. Con "tomas" me refiero al núcleo, de lo contrario sería un problema de seguridad.
Entonces, en realidad no es el usuario, que no tiene permisos para leer el archivo, son los permisos del proceso (
cat
). Pero el proceso se ejecuta con el uid / gid del usuario llamante.Por lo tanto, no tiene que estar en un grupo específico para que un proceso se ejecute con su uid y el gid de ese grupo.
fuente
EUID
forma parte llamandoinitgroups(3)
. Sin embargo,initgroups(3)
es una operación relativamente costosa, ya que necesita enumerar todos los grupos. Por esta razón, los procesos solo llamaninitgroups(3)
si tienen una razón específica para hacerlo.El uso de la
--userspec
opción enchroot
especifica el usuario y un solo grupo para usar al ejecutar elchroot
. Para definir grupos suplementarios, también debe usar la--groups
opción.De manera predeterminada, los procesos heredan los grupos primarios y suplementarios del usuario que los ejecuta, pero al usarlos
--userspec
le indicachmod
que anule eso usando el grupo único especificado.La documentación detallada de los permisos en Linux está disponible en la página de
credentials(7)
manual.fuente
Cuando inicia sesión en Linux, el proceso de inicio de sesión login, después de verificar que puede iniciar sesión como phil , obtiene el uid de phil y los grupos a los que pertenece, estableciéndolos como un proceso que luego se inicia como su shell. Los grupos uid, gid y suplementarios son propiedad del proceso.
Cualquier programa posterior iniciado después de eso, es un descendiente de ese shell, y simplemente recibe una copia de esas credenciales. * Esto explica por qué cambiar los derechos del usuario no afecta los procesos en ejecución. Sin embargo, los cambios se recogerán en el próximo inicio de sesión.
* La excepción son los programas cuyos bits setuid o setgid están establecidos, que tendrán una identificación de usuario efectiva diferente . Esto se usa, por ejemplo, en su (1) para que pueda ejecutarse con
root
privilegios incluso cuando es ejecutado porphil
.Después de que haya agregado
phil
aladm
grupo, él podría ejecutarsu phil
ysu
, al ejecutarse como root, verificará que realmente proporcione la contraseña de phil y luego lo colocará en un shell con los grupos uid, gid y suplementarios a los que phil pertenece. Y como esto se hace después de agregar al usuario al grupo, ese shell ya estaría en eladm
grupo.No considero que chroot (1) sea el programa más adecuado para ejecutarse como un usuario diferente , pero ciertamente hace el trabajo. El parámetro
--userspec phil:phil
hace que se ejecute con el uid dephil
y el gid dephil
. No se establecen grupos adicionales (para eso proporcionaría--groups
). Por lo tanto, el proceso de los niños no está en eladm
grupo.Una forma más normal de ejecutar su proceso como phil sería
su phil -c "process"
. A medida que sesu
cargan los grupos uid, gid y suplementarios de la información de la base de datos del usuario,process
tendrán las mismas credenciales que el usuario tiene actualmente.¹ Esto puede ser login (1) , sshd, su, gdb u otros programas. Además, es probable que se administre a través de módulos pam.
fuente