verificar - what is posix in linux




Diferença entre ID de usuário real, ID de usuário efetivo e ID de usuário salvo (2)

Eu já estou ciente da identificação real do usuário. É o número exclusivo para um usuário no sistema. No meu sistema, meu uid é

$ echo $UID
1014
$                 

Quais são os outros dois IDs. E qual é o uso do ID do usuário efetivo e do ID do usuário salvo e onde o usamos no sistema.


A distinção entre um ID do usuário real e um efetivo é feita porque você pode precisar temporariamente da identidade de outro usuário (na maioria das vezes, isso seria root , mas poderia ser qualquer usuário). Se você tivesse apenas um ID de usuário, não haveria maneira de voltar ao seu ID de usuário original posteriormente (exceto tomar sua palavra como certa e, caso você seja root , usando os privilégios de root para mudar para qualquer usuário) .

Portanto, o ID do usuário real é quem você realmente é (aquele que possui o processo), e o ID do usuário efetivo é o que o sistema operacional analisa para tomar uma decisão sobre se você pode ou não fazer algo (na maioria das vezes) , existem algumas exceções).

Quando você efetua login, o shell de logon define o ID do usuário real e efetivo com o mesmo valor (seu ID de usuário real) fornecido pelo arquivo de senha.

Agora, também acontece que você executa um programa setuid e, além de executar como outro usuário (por exemplo, root ), o programa setuid também deve fazer algo em seu nome. Como é que isso funciona?
Depois de executar o programa setuid, ele terá seu ID real (já que você é o proprietário do processo) e o ID do usuário efetivo do proprietário do arquivo (por exemplo, root ), pois ele é setuid.

O programa faz a mágica necessária com privilégios de superusuário e, em seguida, deseja fazer algo em seu nome. Isso significa que a tentativa de fazer algo que você não deveria poder falhar . Como isso acontece? Bem, obviamente, alterando seu ID de usuário efetivo para o ID de usuário real!

Agora que o programa setuid não tem como voltar atrás, pois tudo que o kernel sabe é seu ID e ... seu ID . Bang, você está morto.

É para isso que serve o ID do usuário definido salvo.


Vou tentar explicar passo a passo com alguns exemplos.

Fundo curto

Cada processo possui suas próprias 'credenciais de processo', que incluem atributos como PID , PPID , PGID , session ID e também os IDs reais e efetivos de usuários e grupos: RUID , EUID , RGID , EGID .

Vamos nos concentrar neles.


Parte 1 - Compreender UID e GID

Agora vou entrar no shell com minhas credenciais e executar:

 $ grep $LOGNAME /etc/passwd rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash 

Você pode ver meu nome de log (rotem), o UID e o GID, ambos com 1000 e outros detalhes, como o shell no qual estou logado.


Parte 2 - Entenda RUID e RGID

Todo processo tem um proprietário e pertence a um grupo .
Em nosso shell, todos os processos que executaremos agora herdarão os privilégios da minha conta de usuário e serão executados com o mesmo UID e GID.

Vamos executar um comando simples para verificá-lo:

 $ sleep 10 & ps aux | grep 'sleep' 

E verifique o processo UID e GID:

 $ stat -c "%u %g" /proc/$pid/ 1000 1000 

Esses são o ID do usuário real ( RUID ) e o ID do grupo real ( RGID ) do processo .

(*) Marque outras opções para visualizar o UID e o GID e as formas de obter isso em uma única linha .

Por enquanto, aceite o fato de que os atributos EGID e EGID são 'redundantes' e são iguais a RUID e RGID nos bastidores.


Parte 3 - Compreender EUID e EGID

Até esse momento, era simples e silencioso. Agora precisamos nos esforçar um pouco mais para entender.

Vamos tomar o comando ping como nosso exemplo.

Procure o local binário com o which comando e execute ls -la :

 -rwsr-xr-x 1 root root 64424 Mar 10 2017 ping 

Você pode ver que o proprietário e o grupo de ambos os arquivos são root . Isso ocorre porque o comando ping precisa abrir um soquete e o kernel do Linux exige privilégios de root para isso.

Mas como posso usar o ping se não tenho privilégios de root ?
Observe a letra 's' em vez de 'x' na parte do proprietário da permissão do arquivo.
Este é um bit de permissão especial para arquivos executáveis ​​binários específicos (como ping e sudo ), conhecido como setuid .

É aqui que EUID e EGID entram em cena.
O que acontecerá é que, quando um binário setuid como ping executado, o processo alterará sua ID efetiva do usuário ( EUID ) do RUID padrão para o proprietário desse arquivo executável binário especial que, neste caso, é - root .
Tudo isso é feito pelo simples fato de esse arquivo ter o bit setuid .

O kernel toma a decisão de saber se esse processo tem o privilégio EUID o EUID do processo. Porque agora o EUID aponta para a root - esta operação não será rejeitada pelo kernel.

Aviso : Nas versões mais recentes do Linux, a saída do comando ping será diferente devido ao fato de terem adotado a abordagem de Recursos do Linux em vez dessa abordagem setuid - para aqueles que não estão familiarizados - leia aqui .

Parte 4 - E o SUID e o SGID?

O ID do usuário salvo ( SUID ) está sendo usado quando um processo privilegiado está em execução ( root por exemplo) e precisa executar algumas tarefas não privilegiadas.

Nesse caso, o UID efetivo ( EUID ) de antes será salvo no SUID e, em seguida, alterado para um valor não privilegiado. Quando a tarefa não privilegiada for concluída, o EUID será retirado do valor de SUID e retornado à conta privilegiada.


Espero que tenha sido claro o suficiente.





posix