GID, bieżące, podstawowe, uzupełniające, skuteczne i rzeczywiste identyfikatory grup?

22

Poniższe linki omawiają te pojęcia w różnych kontekstach. Przeczytałem ich definicje, ale nadal nie mogę powiedzieć, w jaki sposób są ze sobą powiązane lub czy niektóre z nich są takie same.

Oto przykład źródła mojego zamieszania:

Zgodnie z tym man id, jeśli piszę id, powinienem dostać to, co nazywają skutecznym i rzeczywistym identyfikatorem grupy.

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

Jednakże, Wikipedia odnosi się do mocy idodróżnić podstawowych i dodatkowych identyfikatorów. Ponadto Wikipedia rozróżnia identyfikatory grup pierwotnych i uzupełniających oraz skuteczne i rzeczywiste grupy. Jak te pojęcia się ze sobą wiążą?

Czy to prawda, że identyfikator grupy podstawowej = identyfikator grupy = bieżący identyfikator grupy?

Amelio Vazquez-Reina
źródło
Pytanie jest niejasne: podane linki zawierają wiele informacji. Co z tego nie rozumiesz?
psusi

Odpowiedzi:

24

Mieszasz tutaj dwa różne wyróżnienia:

  1. Pomiędzy rzeczywistymi i skutecznymi identyfikatorami grup
  2. Między głównymi i uzupełniającymi grupami użytkowników

Pierwsze rozróżnienie dotyczy sposobu uruchamiania procesów . Zwykle po uruchomieniu polecenia / programu jest on uruchamiany z uprawnieniami użytkownika. Ma rzeczywisty identyfikator grupy taki sam jak grupa podstawowa użytkownika. Można to zmienić w procesie, aby wykonać niektóre zadania jako członek innej specjalnej grupy. Aby to zrobić, programy używają setgidfunkcji, która zmienia ich efektywny identyfikator grupy.

Drugie rozróżnienie dotyczy użytkowników . Każdy użytkownik ma swoją podstawową grupę . Jest tylko jeden na użytkownika i na wyjściu polecenia jest określany jako gidid . Oprócz tego każdy użytkownik może należeć do szeregu dodatkowych grup - i są one wymienione na końcu danych idwyjściowych.

[Edytować] :

Zgadzam się, że strona man idnieco tutaj wprowadza w błąd. Jest tak prawdopodobnie dlatego, że jest to uproszczona wersja opisu podanego w dokumencie informacyjnym. Aby zobaczyć to wyraźniej, uruchom info coreutils "id invocation"(zgodnie z sugestią na końcu idinstrukcji).

rozcietrzewiacz
źródło
Dzięki @rozcietrzewiacz. To było bardzo pomocne. Czy mogę założyć, że bieżący identyfikator grupy = grupa podstawowa ?
Amelio Vazquez-Reina,
1
Ogólnie nie. Bieżącą „prawdziwą” grupę można zmienić za pomocą newgrppolecenia - patrz drugi akapit instrukcji w pierwszym linku!
rozcietrzewiacz
18

Widok jądra

Koncepcyjnie istnieją trzy zestawy grup, których członkiem jest proces. Każdy zestaw jest podzbiorem następnego.

  1. Pojedyncza grupa, która jest domyślną grupą procesu, do której będą należeć pliki utworzone przez ten proces.
  2. Zestaw grup sprawdzanych, gdy grupa wymaga uprawnień do otwarcia pliku.
  3. Zestaw grup, z których może korzystać proces działający z dodatkowymi uprawnieniami.

Ze względów historycznych zestawami tymi są odpowiednio:

  1. skuteczne identyfikator grupy (egid);
  2. efektywny identyfikator grupy plus dodatkowe identyfikatory grupy ;
  3. wszystkie powyższe plus prawdziwy identyfikator grupy i zapisany identyfikator grupy .

Zwykle program ma jeden identyfikator użytkownika. Jeśli plik wykonywalny ma ustawiony bit trybu setuid , wówczas program ma dwa identyfikatory użytkownika: jego efektywny identyfikator użytkownika jest tym, który ma znaczenie dla uprawnień do plików, limitów na użytkownika, określających, czy proces działa jako root i tak dalej. Proces może przełączać między efektywnym a rzeczywistym identyfikatorem użytkownika, jeśli nie potrzebuje on przez cały czas swoich dodatkowych uprawnień lub jeśli musi przełączać się między dwoma użytkownikami innymi niż root.

Ten sam mechanizm istnieje dla grupy. W przypadku grup istnieje dodatkowa funkcja, która nie istniała podczas projektowania systemu: proces może być członkiem dowolnej liczby grup; są to dodatkowe identyfikatory grup.

Widok bazy danych użytkowników

Po uwierzytelnieniu użytkownika proces logowania przełącza się na tego użytkownika, tuż przed uruchomieniem powłoki użytkownika (lub innego programu, którego zażądał użytkownik). Tuż przed przejściem do żądanego użytkownika (i utratą uprawnień roota) proces logowania przełącza się na pożądane grupy.

We wczesnych wersjach unixa proces mógł być tylko w jednej grupie. Ta grupa jest identyfikatorem grupy podstawowej użytkownika, przechowywanym w bazie danych użytkowników (zazwyczaj /etc/passwd). Ta grupa staje się rzeczywistym i skutecznym identyfikatorem grupy powłoki lub innego programu uruchomionego przez proces logowania.

W dzisiejszych czasach proces może być w wielu grupach, więc użytkownicy mogą być również w wielu grupach. Baza danych grupy (zazwyczaj /etc/group) zawiera listę użytkowników dla każdej grupy. Grupy te stają się dodatkowymi identyfikatorami grup dla programu uruchomionego przez proces logowania.

Gilles „SO- przestań być zły”
źródło
Dzięki. Mam pytania dotyczące zrozumienia Twojej odpowiedzi. unix.stackexchange.com/questions/466742/…
Tim
1

Wiele innych doskonałych odpowiedzi tutaj, ale jeśli nadal jesteś zdezorientowany tak jak ja, oto inne podejście. Pamiętaj, że jestem tylko uczniem tego, a nie mistrzem , więc ta odpowiedź jest w toku, i nie powinna być uważana za solidną odpowiedź, przynajmniej jeszcze nie. Rozważ tę odpowiedź v0.2.

Grupy są proste i złożone jednocześnie.

Klucz do identyfikatorów używanych poniżej:

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.

Nazwy identyfikatorów użytkowników i grup:

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

Jak procesy uzyskują identyfikatory:

1) Login uwierzytelnia nazwę użytkownika i zwraca LuIDoraz LgIDz /etc/passwd.

2) Pierwszy proces konfiguruje efektywne = rzeczywiste = logowanie, tj

EuID=RuID=LuID 
EgID=RgID=LgID

3) Rozwidlonych dzieci dziedziczą RuID, EuID, RgID, i EgID, (i ewentualnie zapisane i czopek), jednak

  • Jeśli s u trochę id (S) jest ustawiona na plik z nowym programem do wykonania, a następnie ustawić skuteczny z pliku:

    EuID = FuID

  • Jeśli bit (y) s g id jest ustawiony w pliku nowego programu do uruchomienia, ustaw efektywne z pliku:

    EgID = FgID

Uwaga: suid i nosuid systemu plików obowiązują również opcje instalacji .

4a) jeśli s U id użyto do zestawu EuID, a następnie EuIDmoże być tymczasowo zmienione (np obniżony z korzeni), ale najpierw jest oryginalna wartość jest zapisana w OuIDtak, że można przywrócić później, jeśli to pożądane.

4b) Jeśli do ustawienia użyto s g idEgID , EgIDmożna go tymczasowo zmienić (np. Obniżyć z katalogu głównego), ale najpierw zapisywana jest jego pierwotna wartość, OgIDaby w razie potrzeby można go było później przywrócić.


Kiedy plik ma zostać utworzony:

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

Aby otworzyć do czytania:

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.

Aby otworzyć do pisania:

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

Aby otworzyć do wykonania:

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

Kiedy wiadomość musi zostać wysłana:

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

Referencje: referencje człowieka

Dodatkowo: Oto narzędzie do wydrukowania pliku / 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 }'
Widok eliptyczny
źródło