Como o bash passa grupos de usuários para um filho?

2

É bem conhecido que, se eu me adicionar a um novo grupo, essa alteração não será refletida até que eu faça o logout e volte:

$ sudo adduser me newgroup
$ groups
me sudo
$ groups me
me sudo newgroup
$

Esse comportamento estranho é porque groups é interpretado pelo shell e a nova associação ao grupo não é mostrada. Mas groups me realmente faz referência a /etc/group e, portanto, a nova associação é mostrada.

Mas o que eu acho curioso é que um novo shell não percebe a mudança:

$ bash
$ groups
me sudo

As maneiras que conheço para refletir a nova associação ao grupo são (1) newgrp , ou sg ou su , (2) sair e voltar.

Portanto, bash deve passar a lista de grupos para seu filho de alguma forma. Não está no ambiente (tentei printenv ) e não está na task_struct do kernel (que tem apenas gid, egid, sgid e fsgid).

Eu não consigo entender como.

    
por Fixee 22.09.2014 / 23:38

2 respostas

2

Os grupos são herdados por um processo de seu pai. Bash não tem escolha no assunto. Um processo executado como root pode obter novos grupos suplementares mediante solicitação; um processo que não está em execução como root só pode abandonar grupos suplementares.

O comando groups sem argumentos retorna sua própria lista de grupos (que é herdada de seus pais): grupo real, grupo efetivo e grupos suplementares. O comando group SOMEUSER pesquisa os grupos associados a SOMEUSER nos bancos de dados de usuários e grupos.

Ao efetuar login, os grupos são atribuídos com base nos bancos de dados do usuário e do grupo, como parte do processo de login, antes que o processo de login alterne da raiz para o usuário de destino. Os comandos newgrp , su e sg são capazes de adquirir grupos extras enquanto está em execução porque é setuid raiz; o código deles é escrito de tal forma que eles só concedem grupos que o usuário receberia ao efetuar login (exceto que o root pode obter o grupo que quiser).

No kernel do Linux, os UIDs e GIDs de um processo são registrados em um struct cred . Os grupos suplementares estão no campo group_info , que aponta para um struct group_info que contém uma matriz de IDs de grupo.

    
por 24.09.2014 / 01:48
2

Os grupos são atribuídos durante o login antes que os privilégios sejam descartados. Seu shell não pode simplesmente atribuir novos grupos a si mesmo, caso contrário, seria inútil como um sistema de segurança; em que grupos um processo está mantido pelo kernel. Veja a saída de cat /proc/$$/status por exemplo e veja a linha Groups:; Essa é a lista definitiva de grupos em que seu shell está ($$ é um atalho para o ID do processo do shell).

O comando groups username examinará / etc / groups (como você disse) e simplesmente mostrará os grupos para os quais o usuário está configurado. Sem um nome de usuário, o comando groups apenas mostra a lista / proc / $$ / status dos grupos, ou seja, os grupos atuais reais aos quais o processo pertence.

    
por 23.09.2014 / 09:57

Tags