IDs de grupo GID, atual, primário, suplementar, efetivo e real?

22

Os links a seguir discutem esses conceitos em diferentes contextos. Eu li as definições deles, mas ainda não sei dizer como eles estão relacionados ou se alguns deles são iguais.

Aqui está um exemplo da fonte da minha confusão:

De acordo com man id, se eu digitar id, devo obter o que eles chamam de identificações de grupo efetivas e reais .

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

No entanto, Wikipedia refere-se à saída de idpara distinguir entre IDs primários e suplementares . Além disso, a Wikipedia distingue entre IDs de grupo primário x suplementar e efetivo x real . Como esses conceitos se relacionam?

Além disso, é verdade que o ID do grupo primário = ID do grupo = ID do grupo atual ?

Amelio Vazquez-Reina
fonte
A pergunta não é clara: os links que você fornece fornecem muita informação. O que você não entende?
Psusi 6/08/11

Respostas:

24

Você mistura duas distinções diferentes aqui:

  1. Entre IDs de grupo reais e efetivos
  2. Entre grupos de usuários primários e suplementares

A primeira distinção se refere a como os processos estão sendo executados . Normalmente, quando você executa um comando / programa, ele é executado com os privilégios do seu usuário. Ele tem o ID do grupo real igual ao grupo principal do usuário. Isso pode ser alterado por um processo para executar algumas tarefas como membro de outro grupo especial. Para fazer isso, os programas usam a setgidfunção que altera sua identificação de grupo efetiva .

A segunda distinção refere-se a usuários . Cada usuário tem seu grupo principal . Há apenas um por usuário e é referido como gid na saída do idcomando. Além disso, cada usuário pode pertencer a vários grupos suplementares - e eles são listados no final da idsaída.

[Editar]:

Concordo que a página de manual idé um pouco enganadora aqui. Provavelmente é porque é uma versão simplificada da descrição fornecida pelo documento info. Para vê-lo mais claramente, execute info coreutils "id invocation"(como sugerido no final do idmanual).

rozcietrzewiacz
fonte
Obrigado @rozcietrzewiacz. Isso foi muito útil. Posso então assumir que o ID do grupo atual = grupo primário ?
Amelio Vazquez-Reina
1
Em geral, não. O grupo "real" atual pode ser alterado usando o newgrpcomando - veja o segundo parágrafo do manual no seu primeiro link!
rozcietrzewiacz
18

A visão do kernel

Conceitualmente, existem três conjuntos de grupos dos quais um processo é membro. Cada conjunto é um subconjunto do seguinte.

  1. O grupo único que é o grupo padrão do processo, ao qual os arquivos criados por esse processo pertencerão.
  2. O conjunto de grupos que são verificados quando o grupo requer permissão para abrir um arquivo.
  3. O conjunto de grupos que um processo em execução com privilégios extras processa.

Por razões históricas, esses conjuntos são respectivamente:

  1. o ID do grupo efetivo (egid);
  2. o ID do grupo efetivo mais os IDs de grupo suplementares ;
  3. todas as opções acima, mais o ID do grupo real e o ID do grupo definido salvo .

Normalmente, um programa possui um único ID de usuário. Se o executável tiver o bit do modo setuid definido, o programa terá dois IDs de usuário: seu ID de usuário efetivo é o que importa para permissões de arquivo, limites por usuário, determinando se o processo está sendo executado como raiz e assim por diante. O processo pode alternar entre os IDs de usuário efetivo e real, se não precisar de privilégios extras o tempo todo ou se precisar alternar entre dois usuários não-root.

O mesmo mecanismo existe para o grupo. Para grupos, há um recurso adicional que não existia quando o sistema foi projetado: um processo pode ser membro de qualquer número de grupos; esses são os IDs de grupo suplementares.

A visualização do banco de dados do usuário

Depois que um usuário é autenticado, o processo de login muda para esse usuário, imediatamente antes de iniciar o shell do usuário (ou qualquer outro programa solicitado pelo usuário). Pouco antes de mudar para o usuário desejado (e perder privilégios de root), o processo de login muda para os grupos desejados.

Nas primeiras versões do unix, um processo só podia estar em um único grupo. Este grupo é o ID do grupo principal do usuário, armazenado no banco de dados do usuário (normalmente /etc/passwd). Esse grupo se torna o ID do grupo real e efetivo do shell ou outro programa iniciado pelo processo de login.

Atualmente, um processo pode estar em vários grupos, para que os usuários também possam estar em vários grupos. O banco de dados do grupo (normalmente /etc/group) contém uma lista de usuários para cada grupo. Esses grupos se tornam IDs de grupo suplementares para o programa iniciado pelo processo de login.

Gilles 'SO- parar de ser mau'
fonte
Obrigado. Tenho algumas perguntas para entender sua resposta. unix.stackexchange.com/questions/466742/…
Tim
1

Muitas outras excelentes respostas aqui, mas se você ainda está confuso como eu, aqui está outra abordagem. Observe que eu sou apenas um estudante dessas coisas, não um mestre , portanto esta resposta é um trabalho em andamento e não deve ser considerada uma resposta sólida, pelo menos ainda não. Considere esta resposta v0.2.

Os grupos são simples e complexos ao mesmo tempo.

Chave para os IDs usados ​​abaixo:

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.

Nomes de usuário e ID do 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     
                         ...  

Como os processos adquirem IDs:

1) Login autentica nome de usuário e retorna LuIDe LgIDde /etc/passwd.

2) O primeiro processo configura eficaz = real = login, ou seja,

EuID=RuID=LuID 
EgID=RgID=LgID

3) as crianças bifurcada herdar RuID, EuID, RgID, e EgID, (e, possivelmente, salvou & supp), no entanto,

  • Se o s u pouco id (s) é definido no arquivo do novo programa para executar, em seguida, defina eficaz a partir do arquivo:

    EuID = FuID

  • Se o s g bit (s) id está definido no arquivo do novo programa para executar, em seguida, defina eficaz a partir do arquivo:

    EgID = FgID

Nota: As opções de montagem suid e nosuid do sistema de arquivos subjacentes também se aplicam.

4a) Se s u id foi usado para definir EuID, EuIDpode ser temporariamente alterado (por exemplo, desatualizado a partir do root), mas primeiro o valor original é salvo, OuIDpara que possa ser restaurado mais tarde, se desejado.

4b) Se s g id foi usado para definir EgID, ele EgIDpode ser alterado temporariamente (por exemplo, desatualizado a partir da raiz), mas primeiro o valor original é salvo, OgIDpara que possa ser restaurado mais tarde, se desejado.


Quando um arquivo deve ser criado:

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

Para abrir para leitura:

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 escrever:

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

Para abrir para execução:

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

Quando uma mensagem precisa ser enviada:

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

Referências: credenciais do homem

Extra: Aqui está um utilitário para imprimir seu arquivo / 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
fonte