Por que posso criar usuários com o mesmo UID?


37

Meu entendimento dos UIDs é que é um número inteiro positivo único atribuído por um sistema operacional do tipo Unix a cada usuário. Cada usuário é identificado no sistema por seu UID, e os nomes de usuário geralmente são usados ​​apenas como uma interface para humanos.

Como dois usuários podem ter o mesmo UID, isso não é um conflito para o meu sistema e pacotes?

root@kdc:~# id test12
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~# id test13
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~#

Adicionei dois usuários com o mesmo UID e GID: test12e test13

A saída de /etc/passwd:

client@kdc:~$ cat /etc/passwd | grep test12
test12:x:1005:1000::/home/test12:/bin/sh
client@kdc:~$ cat /etc/passwd | grep test13
test13:x:1005:1000::/home/test13:/bin/sh

Eu adicionei os usuários por useradd -ou 1005 -g1000 username.

Fiquei confuso qual é o objetivo disso, e isso pode afetar as permissões e os logs do usuário, etc. Então agora, se um usuário for adicionado uid=0e gid=0tiver privilégios como uma conta root?


Não tenho certeza, mas acho que a saída está imprimindo o UID do usuário "test10" nos dois comandos. Por que está fazendo isso, não tenho idéia, mas deve ser algum usuário que você criou anteriormente.
— animaletdesequia 27/02

como se estivesse dizendo que existe um usuário com esse ID
— nux 27/02

OK, eu não entendi a pergunta. Eu pensei que você criou os usuários normalmente e o sistema lhes atribuiu o mesmo UID.
— animaletdesequia

nenhum homem normalmente não, a questão aqui, como o sistema aceitar uids únicas
— nux

Consegui. Boa pergunta, então, obrigado pela explicação :)
— animaletdesequia

Respostas:


40

A resposta aqui é que o Linux não protege você de si mesmo.

Se você realmente deseja su rootacessar os arquivos / etc e fornecer a todos os usuários o mesmo UID, é possível. É apenas um arquivo de texto.

Mas você realmente não deveria e terá conseqüências não intencionais.


4
minha pergunta é por que o sistema aceita isso?
— nux 27/02

46
O que você quer dizer com "aceitar"? Como NÃO o aceitaria? é como ser um chef e perguntar por que a sopa permitiu que você colocasse muito sal nela. Em termos de computação moderna, você provavelmente está acostumado a uma mentalidade de RDBMS, onde restrições sobre coisas importantes, como IDs, impedem que você se atire no pé. Os IDs de usuário do Linux são muito mais primitivos e não têm verificação ou correção interna.
— Digital Chris

5
Certo, e usando useradd -ovocê reconhece que está fora da norma adduser. Como o @psusi mencionou, ele cria dois logins apontando para o mesmo ID, tanto quanto as permissões de arquivo, etc. Provavelmente também cria problemas, pois esse não é um caso de uso normal e, sem dúvida, não foi testado com muitos pacotes.
— Digital Chris

2
Resposta: para ter 2 logins, aponte para permissões idênticas no sistema de arquivos.
— Digital Chris

5
@ Josh é claro, existem razões válidas para ter vários usuários com o mesmo UID, veja minha resposta para um exemplo.
— terdon

38

Na verdade, existem razões válidas para isso. Por exemplo, eu costumava trabalhar em um laboratório em que cada um de nós tinha um computador, mas o nosso $HOMEestava em uma unidade compartilhada exportada por um servidor. Portanto, a minha $HOMEera

/users/terdon

Como a /userspasta não estava na minha máquina local, mas foi exportada pelo NFS, para qualquer análise pesada de E / S, eu usaria os dados armazenados nos discos rígidos locais para não sobrecarregar a rede do laboratório. Para esse fim, eu, e todos os outros, tínhamos dois usuários: um que abrangia todo o sistema e outro local para a máquina em questão. A casa do usuário local era

/home/localuser

No entanto, eu precisava ter acesso total aos meus arquivos, independentemente de estar logado como terdonou como localusere como nosso administrador de sistemas implementou isso, fornecendo o mesmo localusere terdono mesmo UID. Dessa forma, eu poderia manipular livremente meus arquivos locais, independentemente de qual usuário estava atualmente conectado.


6
Para apoiar esta resposta, vale a pena notar que algumas configurações, como hospedagem de email virtual, usam isso com grande efeito, ou seja, um grande número de contas de email virtuais compartilhando um único UID - a documentação para o servidor de email Dovecot na verdade sugere isso como uma abordagem opcional em wiki2.dovecot.org/UserIds#mailusers
— Matt Thomason

não chmod 666teria os mesmos efeitos?
— Brian

3
@GIJoe, que permitiria aos dois usuários ler / gravar, mas não preservaria a propriedade, o que poderia ser um problema. Além disso, nem todos os arquivos podem ser definidos para essas permissões (teclas ssh, por exemplo) e não é prático precisar jogar com permissões o tempo todo.
— terdon

12

Dois usuários podem ter o mesmo UID porque é apenas um número em um arquivo de texto, para que você possa configurá-lo para o que quiser, incluindo um valor que já seja usado. Como você viu, não é uma boa ideia.


como o sistema lida com os usuários então? permissões de compartilhamento
— nux

12
@ux, ambos são o mesmo usuário. Eles podem simplesmente ter um nome de usuário / senha diferente para o propósito de exploração madeireira no.
— psusi

4
@ bigbadonk420, o termo "suportado" é bastante nebuloso. Certamente, é algo que você sempre foi capaz de fazer em sistemas unix e costumava ser um backdoor bastante comum para configurar outro usuário com uid 0, para que você possa efetuar login e efetivamente ser root, sem precisar saber ou alterar a senha. no usuário root normal.
— psusi 27/02

11
@ bigbadonk420 é suportado, há casos em que isso é útil, veja minha resposta para um exemplo.
— terdon

11

Na verdade, é bastante comum ter dois usuários com o mesmo ID. No FreeBSD, geralmente existem dois usuários com o UID 0: root e toor. O Root usa o shell / bin / sh interno e o toor usa um shell diferente, geralmente o bash.


11

Sistemas Unix e Linux geralmente não fazem nada para proibir duplicatas no /etc/passwdarquivo. A intenção desse arquivo é associar um UID a um nome físico que possa ser exibido por ferramentas de linha de comando, como lsquando o usuário está listando arquivos.

$ ls -n | head -5
total 986000
drwxrwxr-x.   3 1000 1000      4096 Feb 13 19:51 1_archive_sansa
-rw-rw-r--.   1 1000 1000    760868 Dec 16 08:21 2.18.x Database Scheme.jpg
-rw-rw-r--.   1 1000 1000       972 Oct  6 20:26 abcdefg
drwxrwxr-x.   2 1000 1000      4096 Feb 11 03:34 advanced_linux_programming

O outro objetivo deste arquivo é especificar qual shell o usuário obterá quando efetuar o login.

$ getent passwd saml
saml:x:1000:1000:saml:/home/saml:/bin/bash

Um vetor de ataque comum em sistemas do tipo Unix é adicionar linhas como estas ao /etc/passwdarquivo do sistema :

$ getent passwd r00t
r00t:x:0:0:root:/root:/bin/bash

$ getent passwd toor
toor:x:0:0:root:/root:/bin/bash

A função do /etc/passwdarquivo NÃO se destina apenas a rastrear contas de usuário. A função de rastrear nomes de usuário e senhas é de responsabilidade do /etc/shadowarquivo. Arquivos como /etc/passwde /etc/groupsão realmente destinados a fornecer um nome legível por humanos quando o sistema estiver listando arquivos de discos.

Lembre-se de que seus arquivos são gravados no disco usando nomes não reais de UID / GID.

$ stat afile 
  File: ‘afile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 6560621     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-02-27 15:54:21.852697029 -0500
Modify: 2014-02-27 15:54:21.852697029 -0500
Change: 2014-02-27 15:54:21.852697029 -0500
 Birth: -

Observe o Uid:e Gid:, os números são o que realmente está gravado no disco!


9

No Linux, todos os usuários e grupos são na verdade apenas números. É o que idmostra a saída do comando que você postou.

O /etc/passwdarquivo mapeia nomes de usuário para IDs de usuário (números) e, no exemplo que você forneceu, você simplesmente mapeou dois nomes de usuário para o mesmo ID de usuário.

Efetivamente, você criou um usuário, test12ID 1005, que também possui um segundo nome de usuário test13. No entanto, o sistema mapeará o UID 1005 para o primeiro nome de usuário encontrado, o que seriatest12

O Linux "permite" que você faça isso porque não há sistema para impedir que você faça isso. /etc/passwdé apenas um arquivo de texto, os nomes de usuário são mapeados para o UID encontrado para sua entrada nesse arquivo, os UIDs são mapeados para o primeiro nome de usuário encontrado nesse arquivo.

Mas o que você criou é uma situação confusa para outros administradores de systams; evite alterando o UID detest13


este é o meu homem máquina virtual de teste, a minha pergunta é há um propósito para mapear dois usuários para o mesmo uid
— nux

11
O único objetivo em que consigo pensar é fornecer a um UID um segundo nome de usuário alternativo. Mas esse é um comportamento indefinido e não recomendado. Realmente esta é uma situação indesejável: você é melhor fora com uma relação 1: 1 entre nomes de usuários e UIDs
— Josh

é por isso que eu fiz esta pergunta que eu precisava saber, eu senti que é uma maneira confundindo
— nux

Isto é confuso; é por isso que você não deve fazê-lo. Não tem um "propósito", é mais um uso indevido do /etc/passwdarquivo. Mas não há meios para impedir que você faça isso. Isso faz sentido?
— 27714 Josh

11
um usuário mencionou que o objetivo é ter 2 logins apontando para permissões idênticas do sistema de arquivos.
— nux 27/02

5

A razão pela qual isso é permitido hoje é simplesmente porque o sistema não o impede.

Se isso mudasse, os sistemas onde os administradores tinham uso para esse recurso seriam interrompidos (veja o exemplo de Terdon). Portanto, nunca foi alterado, e acho que nunca.

Originalmente, havia apenas os arquivos passwd e group, e eles serviram a seu propósito. não havia nenhum comando adduser , nenhum addgroup , os arquivos foram editados pela raiz usando vi ou ed.

Houve algumas peculiaridades!

Para lembrar o próximo ID de usuário a ser usado, era comum os administradores terem um usuário especial como a última linha que tinha um nome de usuário !(porque !era um nome de usuário inválido) e essa entrada foi usada para armazenar o próximo ID do usuário. Bruto, admito, mas funcionou! Então, por que quebrar o intestino, tornando-o mais complicado, semelhante ao desenvolvimento ágil hoje?

Havia falhas conhecidas. O ser principal, que tinha que ser legível pelo mundo, para que utilitários como lspudessem mapear user-id => name. Isso significava que qualquer um podia ver a senha criptografada de todos e todos os usuários e IDs no sistema.

Alguns sistemas Unix começaram a introduzir alguns scripts de shell adduser addgroup, geralmente esses foram ignorados, porque eram inconsistentes entre os Unixes; portanto, a maioria das pessoas continuou a edição manual.

Demorou alguns anos, antes que o shadowarquivo de senha fosse inventado, isso fornecia um pouco mais de segurança, ocultando as senhas criptografadas. Mais uma vez, foi acrescentada complexidade suficiente, mas ainda assim era bastante grosseira e simples. Os utilitários useradde groupaddforam introduzidos, que foram mantidos shadowe shadow-atualizados. Para começar, esses eram geralmente simples invólucros de scripts de shell em torno dos utilitários proprietários adduser / addgroup dos fornecedores . Mais uma vez, foi apenas o suficiente para continuar.

As redes de computadores estavam crescendo, as pessoas trabalhavam em várias de uma vez para realizar tarefas, de modo que a administração dos passwd/grouparquivos estava se tornando um pesadelo, especialmente com o NFS; assim, as Páginas Amarelas também são conhecidas como NIS para aliviar o fardo.

Estava se tornando óbvio agora que algo um pouco mais flexível era necessário e o PAM foi inventado. Portanto, se você fosse realmente sofisticado e desejasse um sistema de autenticação centralizado, seguro e com identificação única, todos os sinos e assobios, você chamaria um servidor central para autenticar, talvez um servidor Radius, servidor LDAP ou Active Directory.

O mundo cresceu. Mas os arquivos passwd / group / shadow ainda permaneciam para nós, usuários / desenvolvedores / laboratórios menores. Ainda não exigimos realmente todos os sinos e assobios. Eu acho que a filosofia havia mudado um pouco até agora, "Se você iria melhorar, você não usaria nada" , então não se preocupe.

É por isso que acho que o arquivo passwd simples nunca será alterado. Não há mais razão, e é ótimo para aqueles Raspberry Pi de £ 30 com 2 talvez 3 temperaturas de monitoramento de usuários e feeds do twitter. OK, você só precisa ter um pouco de cuidado com seus IDs de usuário, se quiser que sejam exclusivos, e não há nada para impedir que o entusiasta agrupe useradd em um script que primeiro selecione o próximo ID exclusivo de um banco de dados (arquivo) para definir um ID único, se é isso que você deseja. É de código aberto, afinal.


2

O /etc/passwdarquivo apenas mapeia nomes de usuário simbólicos para o ID do usuário real. Se você deliberadamente criar dois nomes simbólicos que mapeiam para um ID do usuário, ele permitirá.

Isso não significa que é uma boa ideia fazê-lo. Algumas pessoas podem ter encontrado casos de uso muito específicos nos quais podem tirar proveito desse recurso, mas em geral você não deve fazê-lo.

O Linux (e outros UNIXes) consideram que o administrador sabe o que está fazendo. Se você disser para fazer algo estúpido, a culpa é sua, da mesma maneira que se você disser que seu carro dirige por um penhasco, não poderá ir aos fabricantes e perguntar por que o carro permitiu que você fizesse isso.


por que foi mencionado como um bug?
— nux 28/02

1

Existem identificadores que o sistema operacional espera serem únicos, mas são usados ​​para rastrear o hardware. O conhecimento de que um determinado identificador universalmente único corresponde a um disco rígido contendo arquivos do sistema pode ajudá-lo a continuar operando se a configuração do hardware for alterada. A Microsoft chama esses identificadores globalmente exclusivos e os usa para rastrear todos os softwares do Windows. Ironicamente, essas siglas foram mal escolhidas.

Da perspectiva do sistema operacional, a maioria das alterações de identificador de usuário e grupo equivale a alterar sua interface externa. Poderia funcionar normalmente apesar das colisões; principalmente o que é exigido dos usuários e grupos do sistema é que eles existem. Ele não pode saber o que os usuários precisam. Em situações como essa, a filosofia do Unix é que o sistema operacional deve assumir que os administradores sabem o que estão fazendo e ajudá-los a fazê-lo rapidamente.


0

Encontrei algumas evidências que apóiam a resposta de @ andybalholm.

No APUE , §8.15:

Qualquer processo pode descobrir seu ID do usuário real e eficaz e o ID do grupo. Às vezes, porém, queremos descobrir o nome de login do usuário que está executando o programa. Poderíamos chamar getpwuid( getuid()), mas e se um único usuário tiver vários nomes de login, cada um com o mesmo ID de usuário? ( Uma pessoa pode ter várias entradas no arquivo de senha com o mesmo ID do usuário para ter um shell de login diferente para cada entrada .) O sistema normalmente controla o nome em que efetuamos login (Seção 6.8), egetlogin função fornece uma maneira para buscar esse nome de login.

....

Dado o nome de login, podemos usá-lo para procurar o usuário no arquivo de senhas - para determinar o shell de login, por exemplo - usando getpwnam.

Btw, gostaria de saber se é possível mudar para outro shell enquanto estiver conectado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.