Por que o comando sudo não precisa da senha de root?

47

Estou usando o Linux há algum tempo e sempre que digito sudo , acho que estou trocando para o usuário root por um comando.

Aparentemente, isso não é verdade, porque tudo que eu preciso é a senha da minha conta de usuário. Eu estou supondo desde que eu não trabalhei com vários usuários que eu realmente não notei isso no mundo real.

Não tenho certeza de como o Ubuntu configura minha primeira conta. Existe um usuário root? Eu sou root? Eu estou supondo que eu acabei de criar um novo usuário na instalação, mas isso me deu privilégios de root? Apenas um pouco confuso aqui ...

Então, por que tenho permissão para executar comandos de root com a senha do meu usuário?

    
por EGHDK 18.08.2014 / 03:46

5 respostas

65

Em detalhes, funciona da seguinte maneira:

    O arquivo executável
  1. /usr/bin/sudo tem o setuid bit definido, portanto, mesmo quando executado por outro usuário, ele é executado com o ID do usuário do proprietário do arquivo (root, nesse caso).

  2. sudo verifica no arquivo /etc/sudoers quais privilégios você possui e se você tem permissão para executar o comando que está invocando. Simplesmente, /etc/sudoers é um arquivo que define quais usuários podem executar quais comandos usando o mecanismo sudo .

    É assim que o arquivo aparece no meu Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    A terceira linha é o que presumivelmente lhe interessa. Permite que qualquer pessoa no grupo "sudo" execute qualquer comando como qualquer usuário.

    Quando o Ubuntu configura a primeira conta durante a instalação, adicione essa conta ao grupo "sudo". Você pode verificar a quais grupos os usuários pertencem com o comando group .

  3. sudo pede uma senha. Quanto ao fato de que ele precisa da senha do usuário, não da senha, isso é um trecho do manual do sudoers :

    Authentication and logging

    The sudoers security policy requires that most users authenticate themselves before they can use sudo. A password is not required if the invoking user is root, if the target user is the same as the invoking user, or if the policy has disabled authentication for the user or command. Unlike su(1), when sudoers requires authentication, it validates the invoking user's credentials, not the target user's (or root's) credentials. This can be changed via the rootpw, targetpw and runaspw flags, described later.

    No entanto, na verdade, sudo não precisa da sua senha de usuário para nada. Ele pede apenas para garantir que você é realmente você e para lhe fornecer algum tipo de aviso (ou chance de parar) antes de invocar algum comando potencialmente perigoso. Se você quiser desativar a senha, altere a entrada do sudo para:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Após a autenticação sudo gera o processo filho que executa o comando invocado. O filho herda o ID do usuário root de seu pai - o processo sudo .

Então, respondendo suas perguntas com precisão:

I thought I was switching over to the root user for a command.

Você estava certo. Cada comando precedido por sudo é executado com o ID do usuário root.

Is there a root user?

Sim, existe uma conta de usuário root, separada da conta de usuário criada durante a instalação do sistema. No entanto, por padrão, no Ubuntu, você não tem permissão para efetuar login no terminal interativo como usuário root.

Am I root?

Não, você não é uma raiz. Você só tem privilégio para executar comandos individuais como uma raiz , usando o mecanismo sudo descrito acima.

So why am I allowed to run root commands with my user's password?

Você só precisa inserir a senha do usuário devido ao mecanismo de segurança interno sudo . Pode ser facilmente desligado. Você ganha seus poderes de root por causa do bit setuid de /usr/bin/sudo , não por causa de qualquer senha que você digita.

    
por 18.08.2014 / 03:58
15
  • O objetivo de sudo é conceder a você privilégios de outra pessoa (geralmente root) sem solicitar a senha dessa outra conta (diferente de su ).

  • sudo está pedindo sua senha aqui apenas para garantir que um transeunte não usará seu terminal desbloqueado incorretamente.

  • O Ubuntu e muitos outros sistemas operacionais Linux e Unix estão concedendo uma conta inicial criada no momento da instalação, o direito de executar qualquer comando como root .

  • Embora root ainda seja uma conta no Linux, os root logins diretos estão desativados por padrão para uma melhor segurança e rastreabilidade.

por 18.08.2014 / 04:01
5

Piotr deu uma excelente explicação de como sudo funciona. No entanto, ele realmente não motivou porque funciona dessa maneira, então vou tentar adicionar isso aqui.

Antes da criação do comando sudo , tínhamos o comando su . Esse comando permite que um usuário execute comandos como outro usuário, geralmente root (como no caso de sudo , esse é o usuário de destino padrão). Foi totalmente indiscriminado, você pode executar qualquer comando. Como ele poderia ser usado por qualquer usuário, era efetivamente equivalente a fazer login como aquele usuário, exigia que você conhecesse a senha do usuário alvo.

Em algum momento, um pouco mais de controle de acesso foi adicionado: para usar su , você tinha que ser um membro do grupo wheel . Mas como você ainda pode executar qualquer comando, ainda faz sentido exigir que você saiba sua senha.

No entanto, exigir que os usuários conheçam a senha do outro ou do superusuário não era muito seguro. Freqüentemente você quer dar a certos usuários acesso limitado a alguma outra conta (isso é parte de um conceito de segurança chamado de princípio de menos privilégio ). Isso também torna a responsabilidade difícil: se várias pessoas souberem a senha de uma conta e essa conta estiver envolvida em um erro ou abuso, você não poderá dizer qual delas realmente fez isso.

Então, sudo foi criado. Em vez de permitir que os usuários executem qualquer comando, ele possui um elaborado arquivo de configuração, brevemente abordado na resposta de Piotr, que especifica exatamente quem pode usá-lo, a quais usuários ele pode mudar e quais comandos podem ser executados. Com esse controle refinado sobre quem pode fazer o que a quem, não precisamos mais fornecer aos usuários a senha da conta de destino; se o fizéssemos, eles poderiam facilmente ignorar todos os controles no arquivo de configuração fazendo login como esse usuário. Em vez disso, normalmente só exigimos que eles provem que são com quem se conectaram, inserindo sua própria senha - isso tem o objetivo de impedir que alguém tire proveito de uma conta se o terminal ficar sem supervisão.

Este requisito é dispensado para o superusuário - esta conta pode fazer quase qualquer coisa para o sistema sem usar sudo , por isso foi considerado supérfluo. Também é possível especificar no arquivo de configuração que os usuários não precisam digitar uma senha - algumas organizações usam isso quando acreditam que a segurança física de seu ambiente de estação de trabalho é suficiente para evitar abusos.

    
por 21.08.2014 / 01:58
3

A resposta para sua pergunta é:

Quando você executa um comando com sudo , executa o comando com privilégios elevados , ou seja, privilégios de raiz . Você só precisa digitar sua senha de usuário normal porque você (o usuário) foi adicionado ao arquivo sudoers, o que lhe dá privilégios de root .

    
por 18.08.2014 / 04:09
1

Primeiro, desabilitar uma conta geralmente é feito definindo a senha criptografada como *, que não é o valor criptografado de nenhuma string. Eu não posso checar agora, mas eu acredito que isso é o que o Ubuntu faz para root também. Então, tecnicamente, não há senha de root no Ubuntu.

Mas o sudo precede o Ubuntu; Ele foi projetado para sistemas em que certamente havia senhas de raiz. Então, por que não requer a senha de root? Basicamente, o sudo é projetado para dar permissão para executar comandos específicos para determinados usuários --- por exemplo, permitir que um acesso de desenvolvedor raiz reinicie o aplicativo da Web, mas não inicie servidores arbitrários. Conhecer a senha do root, por outro lado, lhe dá acesso ilimitado; você pode usar login ou su para abrir um shell de root e executar comandos arbitrários. Como o sudo precisa funcionar para pessoas sem esse nível de acesso, ele não pode exigir que a senha raiz seja executada.

    
por 18.08.2014 / 20:16

Tags