Como o sudo realmente funciona? [duplicado]

4

Essa pergunta pode ser estúpida, mas eu mesmo não sou capaz de responder.

Eu sempre achei que o "sudo" apenas iniciava outro processo de login, especificamente usando "root" como nome de usuário e solicitando a senha para o login. Depois de executar algum programa, ele termina e efetua logout (ou: mantém a sessão aberta por algum tempo e depois a fecha). Não faço ideia de onde ouvi isso, mas isso pareceu razoável para mim.

Mas agora descobri essa opção de sudoers:

ALL    ALL = (root) NOPASSWD: /my/command

Isso me permite executar qualquer programa de qualquer usuário como root sem pedindo qualquer senha. Isso me deixou pensando:

Como isso funciona? Como um programa ganha direitos de usuário? O sudo precisa de um servidor (rodando como root como daemon ou mais) e se conecta a esse servidor, envia o que deve ser executado e esse servidor o executa com direitos de root?

E os outros usuários?

Existe alguma explicação boa e simples sobre como isso funciona?

    
por Norman 28.04.2014 / 16:10

2 respostas

15

sudo é o chamado "SetUID binário", como você pode ver na saída de ls -l :

$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo

O s na quarta coluna (onde você normalmente encontra um x nos arquivos executáveis) informa que o bit SetUID está definido. Esse bit tem um significado significativo: quando um binário com o conjunto de bits SetUID é executado, ele não é executado com o ID do usuário chamado, mas com o ID do usuário do binário (neste caso, root ).

E essa é a pista. sudo é sempre executado com privilégios de superusuário (como root ). Portanto, sudo tem a capacidade de executar algumas tarefas privilegiadas, como chamar funções do sistema, somente permitidas para root . Uma dessas chamadas de sistema (a essencial) são setuid(2) e amigos. Ao chamar setuid() , um processo pode alterar seu UID para qualquer UID desejado (representando-se, assim, outro usuário).

O que o sudo faz é:

  • leia e analise /etc/sudoers , procure o usuário solicitante e suas permissões,
  • solicite uma senha ao usuário solicitante (geralmente, essa é a senha do usuário, mas também pode ser a senha do usuário de destino ou ignorada como com NOPASSWD )
  • crie um processo filho no qual ele chama setuid() para alterar para o usuário de destino
  • executa um shell ou o comando dado como arguemnts neste filho
por 28.04.2014 / 16:28
1

A resposta simples é suid no sudo:

ls -l /usr/bin/sudo
---s--x--x. 1 root root 130712 02-26 13:31 /usr/bin/sudo

SUID no arquivo executável, faz com que seja considerado quem o executa, ele funcionará no direito efetivo de proprietário deste arquivo. Neste exemplo, isso é raiz.

Resto é o código do programa e sua configuração. Então o SUDO analisa sua configuração e determina se o usuário deve poder trabalhar com o sudo (executar programas específicos) e se deve (sudo) perguntar sobre a senha do usuário ou não.

Quanto ao timestamp, basta verificar o sudo, se você o estiver executando novamente em algum período de tempo específico, criando e alterando o registro de data e hora no arquivo. No meu caso (RHEL7-rc):

[artur@asus-ux21e ~]$ sudo ls -l /var/db/sudo/artur
total 12
-rw-------. 1 root artur 48 04-24 14:07 0
-rw-------. 1 root artur 48 04-24 11:27 1
-rw-------. 1 root artur 48 04-24 11:26 2
    
por 28.04.2014 / 16:27

Tags