Diferença entre proprietário / raiz e RUID / EUID

24

Sou relativamente novo nos conceitos mencionados na pergunta e ler sobre eles de diferentes fontes apenas os torna mais confusos. Então é isso que eu entendi até agora:

Quando recebemos permissões para um arquivo, elas se parecem com isso:

-rwsr-xr-- 1 user1 users 190 Oct 12 14:23 file.bin

Assumimos que um usuário user2que está no grupo userstenta executar file.bin. Se o bit setuid não fosse definido, isso significaria que tanto o RUID quanto o EUID de file.bineram iguais ao UID deuser2 . Mas como o bit setuid está definido, isso significa que o RUID agora é igual ao UID de user2, enquanto EUID é o UID do proprietário do arquivo user1.

Minhas perguntas são:

  1. Qual é a diferença entre o proprietário do arquivo e root? Fazroot as mesmas permissões que o proprietário? Ou precisaríamos de uma entrada separada na lista de permissões root?
  2. Diferença entre RUID e EUID?
    • Pelo que entendi, o RUID e o EUID são aplicados apenas a processos. Se for esse o caso, por que eles têm o valor dos IDs de usuário?
    • Se RUID é o usuário que cria o processo e EUID é o usuário que está executando o processo no momento, a primeira frase da primeira resposta nesta pergunta não faz sentido para mim.
    • Entendi corretamente o que o bit setuid faz?
user1956190
fonte

Respostas:

35

Aqui estão as respostas:

  1. rootsempre tem acesso total a arquivos e diretórios. O proprietário do arquivo geralmente também os possui, mas isso nem sempre é verdade. Por exemplo:

    -r-xr----- 1 user1 users 199 Oct 14 18:42 otherfile.bin
    

    user1é o dono ; no entanto, eles podem apenas ler e executar , mas rootainda têm acesso total ( rwx ) ao arquivo.

  2. RUID é o ID do usuário real e nunca (quase) muda. Se user2efetuar login no sistema, o shell será iniciado com seu ID real definido como user2. Todos os processos que eles iniciam no shell herdarão o ID real user2como seu ID real.

    EUID é o ID do usuário efetivo , ele muda para os processos (não para o usuário) que o usuário executa e definiu o bit setuid .

    Se user2executado file.bin, o RUID será user2e o EUID do processo iniciado será user1.

Vamos usar o caso de passwd:

-rwsr-xr-x 1 root root 45396 may 25  2012 /usr/bin/passwd
  • Quando user2deseja alterar sua senha , eles executam /usr/bin/passwd.

  • O RUID será, user2mas o EUID desse processo será root.

  • user2pode ser usado passwdpara alterar apenas sua própria senha, porque passwdverifica internamente o RUID e, se não estiver root, suas ações serão limitadas à senha do usuário real.

  • É neccesary que o EUID torna-se rootno caso de passwdporque as necessidades do processo de gravação de /etc/passwde / ou /etc/shadow.

jcbermu
fonte
Obrigado! Agora tudo está mais claro. Eu tenho mais uma pergunta, no entanto. O EUID muda apenas quando um usuário executa um processo com o bit setuid definido? Ou pode mudar também em outra situação? E se sim, qual é essa situação?
user1956190
11
Eu acho que não há outra maneira senão executar processos com o setuidbit definido.
jcbermu
3
Um processo em execução a partir de um programa "setuid" (ou seja, um processo que tenha UID efetivo U UID real) pode definir o EUID de volta para o RUID. Em alguns casos, ele pode alternar o EUID entre o valor inicial (ou seja, o proprietário do arquivo do programa) e o RUID. Além disso, ele pode definir seu RUID igual ao seu EUID. ... (continua)
Scott
2
(Continua) ... processos privilegiados (aqueles com EUID = 0, aka root) pode definir EUID e RUID para valores arbitrários (por exemplo, a login, sue sudoprogramas fazem isso). Geralmente, quando um processo privilegiado altera seus UIDs para valores diferentes de zero, ele não é mais privilegiado e não pode se tornar rootnovamente. Veja as páginas de manual setuid (2) , seteuid (2) e setreuid (2) .
Scott
11
(Continua) ... Foi introduzido como um hack para resolver um problema, que foi posteriormente resolvido de uma maneira mais ampla. Pode ter sido removido do Linux, exceto pelo fato de que essa poda interromperia os programas que a utilizam. Michael Kerrisk, autor de The Linux Programming Interface , diz que, em sua versão da página de manual setfsuid (2) , " setfsuid()hoje em dia é desnecessário e deve ser evitado em novos aplicativos".
Scott