GID, ID de groupe actuel, primaire, supplémentaire, effectif et réel?

Les liens suivants traitent de ces concepts dans différents contexts. J'ai lu leurs définitions, mais je ne sais toujours pas comment elles sont liées, ou si certaines d'entre elles sont identiques.

  • ID de groupe actuel
  • ID du groupe
  • ID de groupe primaire et supplémentaire
  • ID de groupe effectif et réel (également sur Wikipedia )

Voici un exemple de la source de ma confusion:

Selon l' man id , si je tape l' id , je devrais get ce qu'ils appellent des ID de groupe efficaces et réels .

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

Cependant, Wikipedia se réfère à la sortie de l' id pour distinguer les ID primaires et supplémentaires . De plus, Wikipédia fait la distinction entre les identifiants de groupe primaire vs supplémentaire et effectif et les identifiants de groupe réel . Comment ces concepts se rapportent-ils les uns aux autres?

En outre, est-il vrai que l' ID de groupe principal = ID de groupe = ID de groupe actuel ?

Vous mélangez deux distinctions différentes ici:

  1. Entre les identifiants de groupe réels et effectifs
  2. Entre groupes d'users primaires et supplémentaires

La première distinction concerne la façon dont les process sont exécutés . Normalement, lorsque vous exécutez une command / programme, il s'exécute avec les privilèges de votre user. Il a le véritable ID de groupe identique au groupe principal de votre user. Cela peut être changé par un process afin de préformer certaines tâches en tant que membre d'un autre groupe spécial. Pour ce faire, les programmes utilisent la fonction setgid qui modifie leur identifiant de groupe effectif .

La deuxième distinction concerne les users . Chaque user a son groupe primaire . Il n'y en a qu'un par user et est appelé gid dans la sortie de la command id . En dehors de cela, chaque user peut appartenir à un certain nombre de groupes supplémentaires – et ceux-ci sont listés à la fin de la sortie id .

[Modifier] :

Je suis d'accord que la page de manuel pour id est quelque peu trompeuse ici. C'est probablement parce que c'est une version dépouillée de la description fournie par le document d'information. Pour le voir plus clairement, exécutez info coreutils "id invocation" (comme suggéré à la fin du manuel d' id ).

La vue du kernel

Conceptuellement, il existe trois sets de groupes dont un process est membre. Chaque set est un sous-set du suivant.

  1. Le groupe unique qui est le groupe par défaut du process, auquel appartiennent les files créés par ce process.
  2. Ensemble de groupes qui sont vérifiés lorsque le groupe requirejs l'autorisation d'ouvrir un file.
  3. L'set de groupes qu'un process exécutant avec des privilèges supplémentaires peut utiliser.

Pour des raisons historiques, ces sets sont respectivement:

  1. l' ID de groupe effectif (egid);
  2. l'ID de groupe effectif plus les ID de groupe supplémentaires ;
  3. tout ce qui précède, plus l' ID de groupe réel et l' ID de groupe défini .

Normalement, un programme a un ID user unique. Si l'exécutable a le bit de mode setuid défini, le programme a deux ID user: son ID user effectif est celui qui est important pour les permissions de file, les limites par user, pour déterminer si le process s'exécute en tant que root, etc. Le process peut basculer entre les ID user effectif et réel, s'il n'a pas besoin de ses privilèges supplémentaires tout le time ou s'il doit basculer entre deux users non root.

Le même mécanisme existe pour le groupe. Pour les groupes, il existe une fonctionnalité supplémentaire qui n'existait pas lors de la design du système: un process peut être membre d'un certain nombre de groupes; ce sont les ID de groupe supplémentaires.

La vue de la database user

Une fois qu'un user est authentifié, le process de connection passe à cet user, juste avant de lancer le shell de l'user (ou le programme que l'user a demandé). Juste avant de passer à l'user désiré (et de perdre les privilèges root), le process de connection passe aux groupes souhaités.

Dans les premières versions d'unix, un process ne pouvait être que dans un seul groupe. Ce groupe est l'ID de groupe principal de l'user, stocké dans la database des users (généralement /etc/passwd ). Ce groupe devient l'ID de groupe réel et effectif du shell ou d'un autre programme lancé par le process de connection.

De nos jours, un process peut être dans plusieurs groupes, de sorte que les users peuvent également être dans plusieurs groupes. La database du groupe (généralement /etc/group ) contient une list d'users pour chaque groupe. Ces groupes deviennent des ID de groupe supplémentaires pour le programme lancé par le process de connection.