Tutorial de Linux / Usuários, grupos e propriedade de arquivos: UID e GID
No Linux, cada conta tem um identificador de usuário (UID, user ID) e cada grupo tem um identificador de grupo (GID, group ID). Os arquivos registram um usuário proprietário e um grupo proprietário; uma conta pode participar de um grupo primário e de grupos suplementares. Use id, groups, getent e ls -l para conferir essas relações antes de investigar o acesso a um arquivo.
Esta aula ensina a ler as informações de identidade e propriedade sem modificar contas ou trocar os proprietários dos arquivos. A aula de propriedade e permissões de acesso, em inglês desenvolve a interpretação das permissões. Para diagnosticar corretamente um acesso, também é necessário distinguir a configuração da conta dos grupos que já estão ativos na sessão.
O que significam UID, GID e participação em grupos?
Um nome de conta, como learner, corresponde a um UID numérico. Um grupo também tem um nome e um GID. O grupo primário é o grupo principal registrado nos dados da conta; os grupos suplementares representam participações adicionais. Os nomes facilitam a leitura, mas o sistema também usa os números para identificar usuários e grupos.
A decisão de acesso combina a identidade do processo, o proprietário, o grupo do arquivo, os bits de permissão e outras regras do sistema. Participar de um grupo não concede automaticamente leitura ou escrita em todos os arquivos desse grupo. Da mesma forma, ser proprietário não deve ser confundido com ter qualquer ação sempre autorizada.
A conta administrativa root normalmente corresponde ao UID 0. Não suponha que os UIDs ou GIDs das contas comuns comecem sempre em 1000: os valores dependem do sistema e da política de criação de contas. Um nome de usuário e seu grupo também não precisam ser iguais.
Conferir o usuário e os grupos da sessão atual
Execute os comandos abaixo como usuário comum; eles consultam informações, sem alterar a conta. Sem um nome de usuário como argumento, id descreve o processo atual. id -un pede o nome do usuário efetivo, id -gn o nome do grupo efetivo e id -nG os nomes dos grupos. Em uma sessão comum, sem uma mudança específica da identidade do processo, o grupo efetivo corresponde normalmente ao grupo primário da conta.
id
id -un
id -gn
id -nG
groups
Um resultado ilustrativo de id é uid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel). Ele não é uma saída que você deva copiar nem um requisito para sua instalação: nomes, números e grupos variam. Nesse exemplo, gid=... identifica o grupo principal do processo e groups=... mostra seus grupos. Quando identidades reais e efetivas diferem, a saída padrão de id pode apresentar campos adicionais.
groups, sem argumentos, oferece uma lista mais curta dos grupos do processo atual. Se um administrador acabou de mudar sua participação em grupos, a sessão já aberta pode continuar com os grupos herdados no login. Uma nova sessão de login costuma ser necessária para que os processos iniciados nela recebam a lista atualizada. Consultar novamente o banco de contas e conferir os grupos ativos de um processo são verificações diferentes.
Se um nome não puder ser resolvido, você poderá ver um identificador numérico ou um diagnóstico em vez do nome esperado. Não interprete isso como ausência automática do grupo nem ignore um estado de saída diferente de zero. Para separar a identificação numérica da resolução de nomes, confira id -u, id -g e id -G e investigue o serviço de consulta de nomes quando necessário.
Consultar os dados da conta com getent
Em sistemas que usam a interface correspondente, getent consulta os bancos de contas e grupos por meio do Name Service Switch (NSS), o mecanismo de seleção de fontes de informações de nomes. Na GNU C Library, a configuração em /etc/nsswitch.conf determina as fontes e sua ordem. Conforme o ambiente, os dados podem vir de arquivos locais ou de um serviço de diretório externo; ler somente /etc/passwd pode não mostrar todas as contas que o sistema consegue resolver.
Os comandos seguintes usam o nome do usuário e o nome do grupo do contexto atual. A expressão $(...) executa o comando entre parênteses e usa sua saída como argumento; as aspas mantêm o resultado em um único argumento. Confira antes se id -un e id -gn produziram os nomes esperados sem erro:
getent passwd "$(id -un)"
getent group "$(id -gn)"
Uma linha do banco passwd normalmente tem sete campos separados por dois-pontos: nome, campo de senha, UID, GID primário, descrição, diretório pessoal e shell de login. O campo de senha costuma conter um marcador, como x; isso não significa que uma senha em texto simples deva aparecer na consulta. O GID desse registro é o grupo primário configurado para a conta, que pode não coincidir com o grupo efetivo de uma sessão cuja identidade foi alterada.
Uma linha de getent group contém nome do grupo, campo de senha, GID e lista de membros. Essa lista, sozinha, não precisa incluir todos os usuários que têm o grupo como primário. Compare a configuração da conta com id e groups sem argumentos para entender a sessão em uso; consultas com um usuário informado podem consultar dados atualizados do banco, em vez dos grupos herdados por um processo antigo.
Se uma consulta não retornar a entrada esperada, verifique seu estado de saída e se a fonte de nomes está disponível antes de concluir que a conta deixou de existir. Instalações mínimas podem não fornecer getent, e outras bibliotecas C ou distribuições podem oferecer ferramentas e mecanismos diferentes. Consulte a documentação do ambiente instalado. Não edite /etc/passwd, /etc/group ou /etc/nsswitch.conf para tentar fazer esta prática funcionar.
Ler o usuário e o grupo proprietários de um arquivo
Crie um arquivo de prática em um local no qual seu usuário comum possa gravar. Se ~/linux-course-16-practice já existir, escolha outro nome e substitua-o nas duas primeiras linhas. Execute uma linha por vez e pare se mkdir ou cd falhar. Antes de touch, confirme que pwd mostra o diretório novo e que own.txt ainda não existe: executar touch sobre um arquivo existente pode alterar seus horários. O sucesso de pwd não prova, sozinho, que cd funcionou.
mkdir ~/linux-course-16-practice
cd ~/linux-course-16-practice
pwd
touch own.txt
ls -l own.txt
Na saída longa de ls -l, os campos depois das permissões e da contagem de links normalmente identificam o usuário e o grupo proprietários. Depois aparecem o tamanho, o horário e o nome do arquivo. Se o sistema não conseguir resolver um nome, poderá mostrar o ID numérico. Não leia esses dois campos de propriedade como uma lista de todos os usuários autorizados a acessar o arquivo.
O arquivo novo costuma pertencer ao usuário que o criou, mas o grupo depende também do diretório pai e do comportamento do sistema de arquivos. No Linux, por exemplo, um diretório com o bit setgid pode fazer o arquivo herdar o grupo do diretório. Portanto, compare os valores realmente mostrados e não suponha que o grupo de todo arquivo novo será sempre o grupo primário da conta. Tamanho e horários também variam conforme a prática e o ambiente.
O stat do GNU Coreutils permite mostrar os nomes e os números lado a lado. %U e %G representam os nomes do usuário e do grupo proprietários; %u e %g representam seus IDs numéricos, e %n mostra o nome do arquivo:
stat -c '%U | %G | %u | %g | %n' own.txt
Um resultado possível, apenas para ilustrar o formato, é learner | learner | 1000 | 1000 | own.txt. Confira seus próprios valores; não altere a conta ou o proprietário para reproduzir esse exemplo. Se os nomes estiverem indisponíveis, os IDs continuam sendo uma referência importante para investigar a consulta de nomes. A opção -c mostrada aqui é do GNU stat; outras implementações podem usar uma sintaxe diferente.
A propriedade registra quem é o proprietário; as permissões e outras regras determinam quais ações são permitidas. chown altera a propriedade e pode afetar dados reais, por isso não faz parte desta prática de leitura. Os comandos de inspeção podem ser repetidos para comparar as informações, sem precisar mudar o proprietário ou os grupos da conta.
Manter claras três diferenças
- Nome de usuário e UID: o nome facilita a exibição e a consulta; o sistema também identifica a conta pelo número.
- Grupo primário e grupos suplementares: distinga o grupo configurado na conta dos grupos e da identidade efetivamente usados pelo processo.
- Dados da conta e sessão aberta: uma atualização do banco não muda necessariamente os grupos dos processos que já estavam em execução.
Ao investigar um problema de acesso, confira primeiro o usuário e os grupos da sessão com id; depois leia o proprietário e o grupo do arquivo com ls -l ou stat. Compare as identidades antes de examinar as permissões, o acesso aos diretórios do caminho e outras regras aplicáveis. Assim você evita tratar uma falha de resolução de nomes ou uma sessão antiga como se fossem automaticamente um problema nos bits de permissão do arquivo.
Documentação oficial
O manual do GNU Coreutils descreve id, groups, ls e stat. Os manuais getent(1) e nsswitch.conf(5) explicam a consulta aos bancos e a escolha das fontes. O manual passwd(5) detalha os campos da conta, e open(2) descreve como a propriedade é escolhida ao criar um arquivo no Linux.




