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

21

Os links a seguir discutem esses conceitos em diferentes contextos. Li suas definições, mas ainda não sei dizer como estão relacionadas ou se algumas delas são iguais.

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

De acordo com man id , se eu digitar id , Eu deveria conseguir o que eles chamam de IDs de grupo efetivo e real .

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

No entanto, Wikipedia se refere à saída de id para distinguir entre principal e IDs suplementares . Além disso, a Wikipedia distingue entre IDs de grupo principal vs suplementar e eficaz vs real . Como esses conceitos se relacionam entre si?

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

    
por Amelio Vazquez-Reina 06.08.2011 / 20:33

3 respostas

21

Você mistura duas distinções diferentes aqui:

  1. Entre ids de grupo real e eficaz
  2. Entre grupos de usuários principais e suplementares

A primeira distinção refere-se a como os processos estão sendo executados . Normalmente, quando você executa um comando / programa, ele é executado com os privilégios do 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 função setgid que altera seu ID de grupo eficaz .

A segunda distinção refere-se a usuários . Cada usuário tem seu grupo principal . Há apenas um por usuário e é chamado de gid na saída do comando id . Além disso, cada usuário pode pertencer a um número de grupos suplementares - e estes são listados no final de id output.

[Editar]:

Concordo que a página de manual para id é um tanto enganadora aqui. É provavelmente porque é uma versão simplificada da descrição fornecida pelo documento de informação. Para ver mais claramente, execute info coreutils "id invocation" (como sugerido no final do manual id ).

    
por 07.08.2011 / 00:36
15

A visualização do kernel

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

  1. O único grupo que é o grupo padrão do processo, ao qual os arquivos criados por este 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 em que um processo em execução com privilégios extras pode ser utilizado.

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

  1. o ID do grupo eficaz (egid);
  2. o ID do grupo eficaz mais os IDs de grupo suplementares ;
  3. todos os itens acima, mais o ID real do grupo e o avançou a ID do grupo definido .

Normalmente, um programa possui um único ID de usuário. Se o executável tiver o conjunto de bits do modo setuid , o programa terá dois IDs de usuário: seu ID de usuário efetivo é aquele que questões para permissões de arquivos, limites por usuário, determinando se o processo está sendo executado como root e assim por diante. O processo pode alternar entre os IDs de usuário real e efetivo, 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, existe um recurso adicional que não existia quando o sistema foi projetado: um processo pode ser um membro de qualquer número de grupos; estes são os IDs de grupo suplementares.

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

Uma vez que um usuário é autenticado, o processo de login muda para aquele usuário, antes de lançar o shell do usuário (ou qualquer programa que o usuário solicitou). 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 unix, um processo só poderia estar em um único grupo. Esse grupo é o ID do grupo principal do usuário, armazenado no banco de dados do usuário (geralmente /etc/passwd ). Este grupo se torna o ID real e efetivo do grupo do shell ou outro programa lançado pelo processo de login.

Hoje em dia, um processo pode estar em vários grupos, portanto, os usuários também podem estar em vários grupos. O banco de dados do grupo (geralmente /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.

    
por 08.08.2011 / 01:30
1

Muitas outras excelentes respostas aqui, mas se você ainda está confuso como eu, aqui está outra abordagem. Por favor, note que eu sou apenas um aluno deste material, não um mestre , então esta resposta é um trabalho em andamento, e não deve ser considerada uma resposta sólida, pelo menos não ainda. 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ários e grupos:

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 o nome de usuário e retorna LuID e LgID de /etc/passwd .

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

EuID=RuID=LuID 
EgID=RgID=LgID

3) As crianças bifurcadas herdam RuID , EuID , RgID e EgID , (& possivelmente salvo & supp), no entanto,

  • Se o (s) bit (s) de id u estiver definido no arquivo do novo programa a ser executado, defina como efetivo a partir do arquivo:

    EuID = FuID

  • Se o (s) bit (s) de id g estiver definido no arquivo do novo programa a ser executado, configure-o a partir do arquivo:

    EgID = FgID

Observação: as opções de montagem suid e nosuid do sistema de arquivos subjacente também se aplicam.

4a) Se o u id foi usado para definir EuID , então EuID pode ser temporariamente alterado (por exemplo, rebaixado da raiz), mas primeiro é original O valor é salvo em OuID , para que possa ser restaurado mais tarde, se desejado.

4b) Se s g id foi usado para definir EgID , então EgID pode ser temporariamente alterado (por exemplo, rebaixado da raiz), mas primeiro é original O valor é salvo em OgID , para 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 a 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 a 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 }'
    
por 02.04.2018 / 07:44