Vou tentar explicar passo a passo com alguns exemplos.
Fundo curto
Cada processo tem suas próprias 'credenciais processo' que inclui atributos como PID
, os PPID
, PGID
, session ID
e também os IDs de usuário e grupo reais e eficazes:
RUID
, EUID
, RGID
, EGID
.
Vamos nos concentrar nisso.
Parte 1: Compreender UID e GID
Agora, vou entrar em um 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 GID que são 1000 e outros detalhes como o shell em que estou conectado.
Parte 2: Entenda RUID e RGID
Todo processo tem um dono 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 verificar:
$ sleep 10 & ps aux | grep 'sleep'
E verifique o UID e GID do processo:
$ stat -c "%u %g" /proc/$pid/
1000 1000
Esses são o ID do usuário real ( ) e o ID do grupo real ( ) do processo .RUID
RGID
(*) Marque outras opções para visualizar o UID e GID e maneiras de obtê-los em uma linha .
Por enquanto, aceite o fato de que os atributos EUID
e EGID
são 'redundantes' e são iguais a RUID
e RGID
nos bastidores.
Parte 3: Compreender EUID e EGID
Vamos tomar o ping
comando como 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 do arquivo são root
. Isso ocorre porque o ping
comando precisa abrir um soquete e o kernel do Linux exige root
privilégio para isso.
Mas como posso usar ping
se não tenho root
privilégios?
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 binários executáveis específicos (como ping
e sudo
) conhecido como setuid .
Isto é onde EUID
e EGID
entra em jogo.
O que acontecerá é que quando um binário setuid como é ping
executado, o processo muda seu ID de usuário efetivo ( EUID
) do padrão RUID
para o proprietário deste arquivo executável binário especial que neste caso é -root
.
Isso tudo é feito pelo simples fato de que esse arquivo tem a setuid
bit.
O kernel toma a decisão se este processo tem o privilégio, observando o EUID
do processo. Porque agora EUID
aponta para root
, a operação não será rejeitada pelo kernel.
Aviso : Nos últimos lançamentos do Linux, a saída do ping
comando parecerá diferente devido ao fato de que eles adotaram a abordagem de recursos do Linux em vez desta abordagem setuid - para aqueles que não estão familiarizados - leia aqui .
Parte 4: E quanto a SUID e SGID?
O ID de usuário salvo ( SUID
) está sendo usado quando um processo privilegiado está em execução (como root
por exemplo) e precisa realizar algumas tarefas não privilegiadas.
Nesse caso, o UID ( EUID
) efetivo anterior será salvo internamente SUID
e então alterado para uma tarefa sem privilégios. Quando a tarefa sem privilégios for concluída, o EUID
será retirado do valor de SUID
e voltará para a conta com privilégios.