ID de grupo GID, actual, primario, suplementario, efectivo y real?

22

Los siguientes enlaces discuten estos conceptos en diferentes contextos. He leído sus definiciones, pero todavía no puedo decir cómo están relacionadas, o si algunas de ellas son iguales.

Aquí hay un ejemplo de la fuente de mi confusión:

Según man id, si escribo id, debería obtener lo que ellos llaman ID de grupo real y efectivo .

id uid=501(joe) gid=501(joe) groups=501(joe), 100(users)

Sin embargo, Wikipedia se refiere a la salida de iddistinguir entre IDs primarios y suplementarios . Además, Wikipedia distingue entre identificadores de grupo primarios versus suplementarios y efectivos versus reales . ¿Cómo se relacionan estos conceptos entre sí?

Además, ¿es cierto que la ID del grupo primario = ID del grupo = ID del grupo actual ?

Amelio Vazquez-Reina
fuente
La pregunta no está clara: los enlaces que proporciona proporcionan mucha información. ¿Qué pasa con eso no entiendes?
psusi

Respuestas:

24

Mezclas dos distinciones diferentes aquí:

  1. Entre identificadores de grupo reales y efectivos
  2. Entre grupos de usuarios primarios y suplementarios

La primera distinción se refiere a cómo se ejecutan los procesos . Normalmente, cuando ejecuta un comando / programa, se ejecuta con los privilegios de su usuario. Tiene la identificación del grupo real igual que el grupo principal de su usuario. Esto puede cambiarse mediante un proceso para realizar algunas tareas como miembro de otro grupo especial. Para hacer eso, los programas usan la setgidfunción que cambia su identificación de grupo efectiva .

La segunda distinción se refiere a los usuarios . Cada usuario tiene su grupo primario . Solo hay uno por usuario y se conoce como gid en la salida del idcomando. Además de eso, cada usuario puede pertenecer a varios grupos suplementarios , y estos se enumeran al final de la idsalida.

[Editar]:

Estoy de acuerdo en que la página de manual ides algo engañosa aquí. Probablemente se deba a que es una versión reducida de la descripción proporcionada por el documento de información. Para verlo más claramente, ejecute info coreutils "id invocation"(como se sugiere al final del idmanual).

rozcietrzewiacz
fuente
Gracias @rozcietrzewiacz. Eso fue muy útil. ¿Puedo suponer que la ID del grupo actual = grupo primario ?
Amelio Vazquez-Reina
1
En general, no. El grupo "real" actual se puede cambiar usando el newgrpcomando - ¡vea el segundo párrafo del manual en su primer enlace!
rozcietrzewiacz
18

La vista del núcleo

Conceptualmente, hay tres conjuntos de grupos de los que un proceso es miembro. Cada conjunto es un subconjunto del siguiente.

  1. El grupo único que es el grupo predeterminado del proceso, al que pertenecerán los archivos creados por este proceso.
  2. El conjunto de grupos que se verifican cuando el grupo requiere permiso para abrir un archivo.
  3. El conjunto de grupos a los que puede recurrir un proceso que se ejecuta con privilegios adicionales.

Por razones históricas, estos conjuntos son respectivamente:

  1. la identificación efectiva del grupo (egid);
  2. la ID de grupo efectiva más las ID de grupo suplementarias ;
  3. todo lo anterior más la ID de grupo real y la ID de grupo de conjunto guardada .

Normalmente, un programa tiene una sola identificación de usuario. Si el ejecutable tiene el bit de modo setuid establecido, entonces el programa tiene dos ID de usuario: su ID de usuario efectiva es la que importa para los permisos de archivos, los límites por usuario, determinar si el proceso se ejecuta como root, etc. El proceso puede cambiar entre las ID de usuario efectivas y reales, si no necesita sus privilegios adicionales todo el tiempo, o si necesita cambiar entre dos usuarios no root.

El mismo mecanismo existe para el grupo. Para los grupos, hay una característica adicional que no existía cuando se diseñó el sistema: un proceso puede ser miembro de cualquier número de grupos; Estas son las ID de grupo suplementarias.

La vista de la base de datos del usuario

Una vez que un usuario se autentica, el proceso de inicio de sesión cambia a ese usuario, justo antes de iniciar el shell del usuario (o cualquier programa que el usuario solicite). Justo antes de cambiar al usuario deseado (y perder los privilegios de root), el proceso de inicio de sesión cambia a los grupos deseados.

En las primeras versiones de Unix, un proceso solo podía estar en un solo grupo. Este grupo es el ID de grupo principal del usuario, almacenado en la base de datos del usuario (normalmente /etc/passwd). Este grupo se convierte en el ID de grupo real y efectivo del shell u otro programa lanzado por el proceso de inicio de sesión.

Hoy en día, un proceso puede estar en múltiples grupos, por lo que los usuarios también pueden estar en múltiples grupos. La base de datos del grupo (típicamente /etc/group) contiene una lista de usuarios para cada grupo. Estos grupos se convierten en ID de grupo suplementarios para el programa lanzado por el proceso de inicio de sesión.

Gilles 'SO- deja de ser malvado'
fuente
Gracias. Tengo algunas preguntas para entender su respuesta. unix.stackexchange.com/questions/466742/…
Tim
1

Aquí hay muchas otras respuestas excelentes, pero si todavía estás confundido como yo, aquí hay otro enfoque. Tenga en cuenta que solo soy un estudiante de estas cosas, no un maestro , por lo que esta respuesta es un trabajo en progreso y no debe considerarse una respuesta sólida, al menos todavía no. Considere esta respuesta v0.2.

Los grupos son simples y complejos al mismo tiempo.

Clave para las ID utilizadas a continuación:

KEY  Full name --------  Description---------------------------------------------

 u   User                 uID = User  ID (a unique # associated with each user)
 g   Group                gID = Group ID (a unique # associated with each group)
                            While each /etc/passwd entry has one uID and one gID,
                            additional gIDs can be associated with a users via
                            /etc/group.


 L   Login          IDs - uID and gID produced from the Login process.  
                            ('L' is not exactly standard Linux terminology, but
                            useful for explanations below.)

 F   File           IDs - uID and gID retrieved from a file's ownership.
                            ('F' is not exactly standard Linux terminology, but
                            useful for explanations below.)


 R   Real           IDs - Who actually                      runs a process 
 E   Effective      IDs - Who spoofed via setuid or setgid, runs a process
 O   Original Eff.  IDs - Place to save the original Effective ID when changing 
                          it (e.g. temporarily downgrading it) so can later 
                          restore it.  Also called "Saved ID"; (but 'S' was not 
                          used for here to help avoid confusion with the 'S' in  
                          'SetUserID' & SetGroupID.)
 +   Supplimentary gIDs - Optional, additional groups (none or more) running 
                          this process which can be used to test for permissions.

Nombres de ID de usuario y grupo:

Category          USER  GROUP  Notes  
----------------- ----  -----  -------------------------------------------  
 From login:      LuID  LgID   From /etc/passwd lookup

 From files:      FuID  FgID   Each file has these. Set by creator process.


 For each running process:

            Real  RuID  RgID   Actual   user starting the program
       Effective  EuID  EgID   Assigned user starting the program*
           Saved  OuID  OgID   Saves original effective ID.
   Supplementary        +gID1  (optional, additional groups)
                        +gID2     
                         ...  

Cómo los procesos adquieren ID:

1) Iniciar sesión autentica nombre de usuario y devoluciones LuIDy LgIDde /etc/passwd.

2) El primer proceso establece efectivo = real = inicio de sesión, es decir

EuID=RuID=LuID 
EgID=RgID=LgID

3) los niños bifurcada hereda RuID, EuID, RgID, y EgID, (y posiblemente salvado y supl), sin embargo,

  • Si el bit u s bit (s) está establecido en el archivo del nuevo programa a ejecutar, entonces establezca efectivo desde el archivo:

    EuID = FuID

  • Si el / los bit (es) s g id se configuran en el archivo del nuevo programa a ejecutar, entonces se establece como efectivo desde el archivo:

    EgID = FgID

Nota: Las opciones de montaje suid y nosuid del sistema de archivos subyacente también se aplican.

4a) Si se usó s u id para establecerlo EuID, entonces EuIDse puede cambiar temporalmente (por ejemplo, degradado desde la raíz), pero primero se guarda su valor original OuIDpara que se pueda restaurar más tarde si se desea.

4b) Si se usó s g id para establecer EgID, entonces EgIDse puede cambiar temporalmente (por ejemplo, degradado desde la raíz), pero primero se guarda su valor original OgIDpara que se pueda restaurar más tarde si se desea.


Cuando se va a crear un archivo:

File's new id's are set from effective id's: FuID=EuID and FgID=EgID
(Permissions are set from umask.)

Para abrir para leer:

If FuID = EuID  and  user-read bit is set, or  
If FgID = EgID  and group-read bit is set, or  
If FgID = +gID1 and group-read bit is set, or  
If FgID = +gID2 and group-read bit is set, ...  
then allow reading.

Para abrir para escribir:

(Same as above but write bit set to allow writing.)

Para abrir para la ejecución:

(Same as above but execute bit set to allow execution.)

Cuando un mensaje necesita ser enviado:

Use RuID and RgID.  (Not EuID or EgID). *(Not sure where I read this.)*

Referencias: credenciales de hombre

Extra: Aquí hay una utilidad para imprimir bastante su archivo / etc / group:

cat /etc/group | sort -t: -k3n | awk  -F ':' \
  'BEGIN{printf "\n%-20s %-3s %-8s %s", \
           "Group name","pw", "Group ID ", "User list"}\
   BEGIN{printf "\n%-20s %-3s %-8s %s\n", \
           "----------","--", "---------", "---------"} \
        { printf "%-20s %-3s %8d %s\n", $1, $2, $3, $4 }'
Vista elíptica
fuente