Um processo possui apenas um “id de grupo efetivo” associado a ele?

1

Cada processo tem três IDs de usuário:

  • ID do usuário real ( ruid ).
  • ID do usuário efetivo ( euid ).
  • ID do usuário salvo ( suid ).

Da mesma forma, um processo tem três IDs de grupo:

  • ID real do grupo ( rgid ).
  • ID efetivo do grupo ( egid ).
  • ID do grupo salvo ( sgid ).

Com base em meu entendimento, o euid é usado ao acessar um arquivo para corresponder ao proprietário do arquivo.

Mas não tenho certeza sobre o egid . O egid também é usado ao acessar um arquivo para combiná-lo com o grupo do arquivo? Em caso afirmativo, não deveria cada processo ter muitos IDs de grupos efetivos, já que cada usuário pode pertencer a muitos grupos?

    
por user7681202 04.12.2017 / 15:38

1 resposta

3

Existe um egid . Contudo! Pelo menos no BSDlandia (e copiado pelo Linux; não tenho certeza do que o SysV faz aqui) existe a chamada setgroups(2)

DESCRIPTION
     setgroups() sets the group access list of the current user process
     according to the array gidset.  The parameter ngroups indicates the
     number of entries in the array and must be no more than {NGROUPS_MAX}.

     Only the superuser may set new groups.

e getgroups(2) para recuperar essa lista.

Alguns programas notavelmente descartam a lista suplementar de grupos, por exemplo httpd no OpenBSD em src/usr.sbin/httpd/proc.c

    if (setgroups(1, &pw->pw_gid) ||
        setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
        setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
            fatal("%s: cannot drop privileges", __func__);

que pode ser surpreendente se você estivesse esperando que esses grupos suplementares estivessem por perto.

NGROUPS_MAX é outro limite divertido, especialmente envolvendo NFS e pessoas em muitos grupos, embora agora existam maneiras de contornar isso (além da maneira antiga de não adicionar um usuário a mais do que os típicos 16 grupos).

    
por 04.12.2017 / 16:07