GID, ID de groupe actuel, principal, supplémentaire, efficace et réel?


22

Les liens suivants présentent ces concepts dans différents contextes. 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.

Voici un exemple de la source de ma confusion:

Selon man id, si je tape id, je devrais obtenir 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 idpour faire la distinction entre les identifiants principaux et supplémentaires . De plus, Wikipedia fait la distinction entre les identifiants de groupe principaux et supplémentaires et les identifiants de groupe efficaces et réels . Comment ces concepts sont-ils liés les uns aux autres?

De plus, est-il vrai que l' ID de groupe principal = l' ID de groupe = l' ID de groupe actuel ?


La question n'est pas claire: les liens que vous fournissez donnent beaucoup d'informations. Et vous ne comprenez pas?
psusi

Réponses:


24

Vous mélangez deux distinctions différentes ici:

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

La première distinction concerne la façon dont les processus sont exécutés . Normalement, lorsque vous exécutez une commande / un programme, il est exécuté avec les privilèges de votre utilisateur. Il a le vrai id du groupe même que le groupe principal de votre utilisateur. Cela peut être modifié par un processus afin d'effectuer certaines tâches en tant que membre d'un autre groupe spécial. Pour ce faire, les programmes utilisent la setgidfonction qui modifie leur identifiant de groupe effectif .

La deuxième distinction concerne les utilisateurs . Chaque utilisateur a son groupe principal . Il n'y en a qu'un par utilisateur et est appelé gid dans la sortie de la idcommande. En dehors de cela, chaque utilisateur peut appartenir à un certain nombre de groupes supplémentaires - et ceux-ci sont répertoriés à la fin de la idsortie.

[Modifier] :

Je conviens que la page de manuel de idest quelque peu trompeuse ici. C'est probablement parce qu'il s'agit d'une version allégée de la description fournie par le document d'information. Pour le voir plus clairement, lancez info coreutils "id invocation"(comme suggéré à la fin du idmanuel).


Merci @rozcietrzewiacz. C'était très utile. Puis-je alors supposer que l' ID de groupe actuel = groupe principal ?
Amelio Vazquez-Reina

1
En général, non. Le groupe "réel" actuel peut être changé en utilisant la newgrpcommande - voir le deuxième paragraphe du manuel dans votre premier lien!
rozcietrzewiacz

18

La vue du noyau

Sur le plan conceptuel, il existe trois ensembles de groupes dont un processus est membre. Chaque ensemble est un sous-ensemble du suivant.

  1. Le groupe unique qui est le groupe par défaut du processus, auquel les fichiers créés par ce processus appartiendront.
  2. Ensemble de groupes qui sont vérifiés lorsque le groupe nécessite l'autorisation d'ouvrir un fichier.
  3. L'ensemble de groupes sur lequel un processus s'exécutant avec des privilèges supplémentaires peut s'appuyer.

Pour des raisons historiques, ces ensembles 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-ensemble enregistré .

Normalement, un programme a un seul ID utilisateur. Si l'exécutable a le bit de mode setuid défini, alors le programme a deux ID utilisateur: son ID utilisateur effectif est celui qui compte pour les autorisations de fichier, les limites par utilisateur, déterminant si le processus s'exécute en tant que root et ainsi de suite. Le processus peut basculer entre les ID utilisateur effectifs et réels, s'il n'a pas besoin de ses privilèges supplémentaires tout le temps, ou s'il doit basculer entre deux utilisateurs 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 conception du système: un processus peut être membre de n'importe quel nombre de groupes; ce sont les ID de groupe supplémentaires.

La vue de la base de données utilisateur

Une fois qu'un utilisateur est authentifié, le processus de connexion passe à cet utilisateur, juste avant de lancer le shell de l'utilisateur (ou le programme que l'utilisateur a demandé). Juste avant de passer à l'utilisateur souhaité (et de perdre les privilèges root), le processus de connexion bascule vers les groupes souhaités.

Dans les premières versions d'Unix, un processus ne pouvait être que dans un seul groupe. Ce groupe est l'ID de groupe principal de l'utilisateur, stocké dans la base de données utilisateur (généralement /etc/passwd). Ce groupe devient l'ID de groupe réel et efficace du shell ou d'un autre programme lancé par le processus de connexion.

De nos jours, un processus peut être dans plusieurs groupes, donc les utilisateurs peuvent aussi être dans plusieurs groupes. La base de données de groupe (généralement /etc/group) contient une liste d'utilisateurs pour chaque groupe. Ces groupes deviennent des ID de groupe supplémentaires pour le programme lancé par le processus de connexion.


Merci. J'ai des questions pour comprendre votre réponse. unix.stackexchange.com/questions/466742/...
Tim

1

Beaucoup d'autres excellentes réponses ici, mais si vous êtes toujours aussi confus que moi, voici une autre approche. Veuillez noter que je ne suis qu'un étudiant de ce genre de choses, pas un maître , donc cette réponse est un travail en cours et ne doit pas être considérée comme une réponse solide, du moins pas encore. Considérez cette réponse v0.2.

Les groupes sont simples et complexes à la fois.

Clé des identifiants utilisés ci-dessous:

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.

Noms d'ID utilisateur et groupe:

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     
                         ...  

Comment les processus acquièrent les ID:

1) La connexion authentifie le nom d'utilisateur et renvoie LuIDet LgIDde /etc/passwd.

2) Le premier processus met en place effective = real = login, c'est-à-dire

EuID=RuID=LuID 
EgID=RgID=LgID

3) les enfants fourchus Hériter RuID, EuID, RgIDet EgID, (et peut - être sauvé et supp), cependant,

  • Si le ou les bits s u id sont définis dans le fichier du nouveau programme à exécuter, définissez-les à partir du fichier:

    EuID = FuID

  • Si le ou les bits s g id sont définis dans le fichier du nouveau programme à exécuter, définissez-les à partir du fichier:

    EgID = FgID

Remarque: Les options de montage suid et nosuid du système de fichiers sous-jacent s'appliquent également.

4a) Si s u id a été utilisé pour le définir EuID, il EuIDpeut être temporairement modifié (par exemple rétrogradé de la racine), mais d'abord sa valeur d'origine est enregistrée OuIDafin de pouvoir être restaurée plus tard si vous le souhaitez.

4b) Si s g id a été utilisé pour définir EgID, il EgIDpeut être temporairement modifié (par exemple rétrogradé de la racine), mais d'abord sa valeur d'origine est enregistrée OgIDafin qu'elle puisse être restaurée plus tard si vous le souhaitez.


Lorsqu'un fichier doit être créé:

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

Pour ouvrir en lecture:

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.

Pour ouvrir en écriture:

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

Pour ouvrir pour exécution:

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

Lorsqu'un message doit être envoyé:

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

Références: informations d'identification de l'homme

Extra: Voici un utilitaire pour imprimer joliment votre fichier / 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 }'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.