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

48

Estou usando o Linux há algum tempo e, sempre que digitava sudo, pensava em mudar para o usuário root para obter um comando.

Aparentemente, isso não é verdade porque tudo o que preciso é da senha da minha conta de usuário. Acho que, como não trabalhei com vários usuários, não percebi isso no mundo real.

Não tenho certeza de como o Ubuntu configura minha primeira conta. Existe um usuário root? Eu sou raiz? Acho que acabei de criar um novo usuário na instalação, mas ele me deu privilégios de root? Só um pouco confuso aqui ...

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

EGHDK
fonte
Usando qual usuário você precisa da senha e em qual não? Qual comando você está executando? Lembre-se de que o sudo armazena sua senha por um tempo antes que você precise digitá-la novamente.
Braiam 18/08/14
11
sudotem o bit "setuid" definido. Portanto, ele é executado como o usuário que o possui (que é raiz em todos os sistemas padrão, se não me engano), não como o usuário que o inicia. sudodepois carrega o /etc/sudoersarquivo e verifica o que é permitido com base em quem o lançou.
LawrenceC
1
Sinto muito se estou repetindo algo que alguém disse, mas não consegui encontrar. A resposta é: é uma decisão política. Meu melhor palpite sobre a motivação é que, em uma grande instalação onde você tem muitas pessoas com sudoprivilégios, talvez trabalhando em locais geograficamente distribuídos e em turnos 24 × 7, você deseja revogar o acesso privilegiado de uma pessoa imediatamente (por exemplo, se você suspeita da integridade dele). Se todo mundo estiver usando a senha de root única, e você a alterar sem coordenação prévia, poderá ocorrer o caos. …
G-Man diz 'Restabelecer Monica
1
@HagenvonEitzen Eu sei que estou com alguns dias de atraso, mas como isso não é um engodo da nossa pergunta?
strugee

Respostas:

65

Em detalhes, funciona da seguinte maneira:

  1. /usr/bin/sudoO arquivo executável possui o conjunto de bits setuid ; portanto, mesmo quando executado por outro usuário, ele é executado com o ID do proprietário do arquivo (raiz nesse caso).

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

    É assim que esse arquivo fica 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, ele é adicionado ao grupo "sudo". Você pode verificar a quais grupos os usuários pertencem com o groupcomando

  3. sudosolicita uma senha. Quanto ao fato de precisar da senha do usuário, e não da raiz, isso é um trecho do manual do sudoers :

    Autenticação e registro

    A política de segurança do sudoers exige que a maioria dos usuários se autentique antes de poder usar o sudo. Uma senha não será necessária se o usuário que está chamando for raiz, se o usuário de destino for o mesmo que o usuário que está chamando ou se a política tiver desabilitado a autenticação para o usuário ou comando. Diferente do su (1), quando o sudoers requer autenticação, ele valida as credenciais do usuário que está chamando, e não as credenciais do usuário de destino (ou raiz). Isso pode ser alterado através dos sinalizadores rootpw, targetpw e runaspw, descritos mais adiante.

    No entanto, de fato, sudonão precisa da sua senha de usuário para nada. Ele pede apenas para garantir que você é realmente você e fornecer a você algum tipo de aviso (ou chance de parar) antes de invocar algum comando potencialmente perigoso. Se você deseja desativar a solicitação de senha, altere a entrada sudoers para:

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


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

Eu pensei que estava mudando para o usuário root para um comando.

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

Existe um usuário root?

Sim, existe uma conta de usuário raiz, separada da sua 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 fazer login no terminal interativo como usuário root.

Eu sou raiz?

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

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

Você precisa inserir a senha do usuário apenas devido ao sudomecanismo de segurança interno. Pode ser facilmente desligado. Você ganha seus poderes de raiz por causa do bit setuid /usr/bin/sudo, não por causa de nenhuma senha digitada.

Piotr Jurkiewicz
fonte
6
A resposta realmente deve começar com a parte setuid, porque essa é a razão pela qual é realmente possível. / etc / sudoers é apenas o motivo da flexibilidade do comando sudo.
Daniel kullmann
Interessante. Eu não sabia que você poderia especificar que sudopoderia ser executado sem inserir minha senha. Ótima resposta!
jwir3
1
Note-se que sudo pode ser configurado para pedir a senha de root com a rootpwbandeira no sudoers.
Reintegrar Monica - M. Schröder
2
Na verdade, você pode fazer login como usuário root: sudo su - rootfará exatamente isso e fornecerá um terminal raiz. No entanto, você não pode acessar facilmente uma sessão da área de trabalho como raiz.
precisa saber é o seguinte
1
Basicamente, sudopossui privilégios de root por si só e decide se deve conceder isso a você com base em um arquivo de configuração.
Siyuan Ren
15
  • O objetivo principal sudoé conceder a você os privilégios de outra pessoa (geralmente root) sem solicitar a senha dessa outra conta (ao contrário su).

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

  • 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 rootainda seja uma conta no Linux, os rootlogins diretos são desativados por padrão para uma melhor segurança e rastreabilidade.

jlliagre
fonte
7
Embora o login root direto esteja realmente desativado por padrão, ainda existe uma conta root no Ubuntu. Já não é uma conta no Solaris, onde é, por padrão, uma função.
Jlliagre
Muito obrigado - sempre me perguntei como isso funcionaria, e agora faz muito mais sentido.
mikeserv
5

Piotr deu uma explicação muito boa de como sudofunciona. No entanto, ele realmente não motivou por que funciona dessa maneira, então tentarei adicionar isso aqui.

Antes do sudocomando ser criado, tínhamos o sucomando. Este comando permite que um usuário execute comandos como outro usuário, normalmente root(como em sudo, este é o usuário de destino padrão). Foi totalmente indiscriminado, você pode executar qualquer comando. Como poderia ser usado por qualquer usuário, era efetivamente equivalente a efetuar login como usuário, exigia que você soubesse a senha do usuário de destino.

Em algum momento, um pouco mais de controle de acesso foi adicionado: para usar su, você tinha que ser um membro do wheelgrupo. Mas como você ainda pode executar qualquer comando, ainda fazia sentido exigir que você soubesse a senha deles.

Porém, exigir que os usuários soubessem a senha um do outro ou do superusuário não era muito seguro. Freqüentemente, você apenas deseja conceder a certos usuários acesso limitado a alguma outra conta (isso faz parte de um conceito de segurança chamado princípio do menor privilégio ). Isso também dificulta a prestação de contas: se várias pessoas souberem a senha de uma conta e essa conta estiver envolvida em um erro ou abuso, não será possível dizer qual delas realmente fez isso.

Então sudofoi criado. Em vez de permitir que os usuários executem qualquer comando, ele possui um elaborado arquivo de configuração, abordado brevemente na resposta de Piotr, que especifica precisamente quem pode usá-lo, para quais usuários eles podem alternar e quais comandos eles podem executar. Com esse controle refinado sobre quem pode fazer o que com 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 efetuando login como esse usuário. Em vez disso, normalmente exigimos que eles provem que são quem fizeram o login, digitando sua própria senha - para impedir que alguém tire vantagem de uma conta se o terminal for deixado sem vigilância.

Esse requisito é dispensado para o superusuário - essa conta pode fazer quase qualquer coisa com o sistema sem usar sudo, portanto foi considerada supérflua. 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 do ambiente da estação de trabalho é suficiente para evitar abusos.

Barmar
fonte
Eu não explorei isso, mas entendo que um dos recursos do sudo que o su não possui é que ele (é capaz de) manter um registro de quais comandos foram executados por qual usuário para facilitar o rastreamento de problemas. suas fontes. Eu apenas olhei no meu sistema kubuntu e não vejo esse log, então talvez esse não seja um comportamento padrão.
Joe
Acabei de encontrar o sudo logon em /var/log/auth.log - junto com muitas outras coisas, incluindo alguns IPs da China tentando obter acesso root ssh ao meu sistema - então, se você quiser apenas ver o sudo, é necessário filtrar através do grep ou similar.
Joe
Corrigir. sutambém registra, mas, como apenas inicia um novo shell, registra o fato de que alguém o executou.
Barmar
Você não pode confiar nos logs, qualquer pessoa que possa obter root pode alterá-los (a menos que você faça logon em outra máquina e garanta que você não dê acesso até que a transação de log esteja concluída). No entanto sudo, permite que os privilégios sejam revogados, sem a necessidade de reemitir a senha root para todos que precisarem.
CTRL-ALT-DELOR
1
@richard Como sudopermite restringir quais comandos um usuário pode executar, tente garantir que você não conceda a eles acesso aos comandos que sobrescreveriam o log.
Barmar
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 root . Você só precisa digitar sua senha de usuário normal porque você (o usuário) foi adicionado ao arquivo sudoers, o que fornece privilégios de root .

alguma coisa alguma coisa
fonte
2
Exceto sudo, não implica privilégios elevados, apenas diferentes para o usuário atual. Por exemplo, você pode executar um programa como um usuário normal que não possui um shell. Além disso, estar no arquivo sudoers não gera raiz.
precisa saber é o seguinte
1
@aragilar yes sudonem sempre concede privilégios elevados, mas é executado com privilégios elevados, depois de fazer o seu trabalho (checando a autenticação, ele pode perder privilégios). Ele precisa desses privilégios elevados para poder mudar de usuário.
CTRL-ALT-DELOR
1
Claro, sudofaz uso de privilégios elevados (mas isso não é exclusivo para o sudo, por exemplo, montar faz também), mas o comando que você chama isto é, commandna sudo commandnão pode (dependendo do que está definido no /etc/sudoers).
James Tocknell
1

Primeiro, a desabilitação de uma conta geralmente é feita configurando a senha criptografada como *, que não é o valor criptografado de nenhuma sequência. Não posso verificar agora, mas acredito que é isso que o Ubuntu faz também como root. Portanto, tecnicamente, não há senha de root no Ubuntu.

Mas o sudo precede o Ubuntu; foi projetado para sistemas onde certamente havia senhas raiz. Então, por que não requer a senha root? Basicamente, o sudo é projetado para dar permissão para executar comandos específicos para determinados usuários - por exemplo, permitir que o desenvolvedor root inicie novamente o aplicativo Web, mas não inicie servidores arbitrários. Conhecer a senha root, por outro lado, fornece acesso ilimitado; você pode usar login ou su para abrir um shell raiz e executar comandos arbitrários. Como o sudo precisa trabalhar para pessoas sem esse nível de acesso, não pode ser necessário executar a senha root.

Jonathan Cast
fonte
Também permite revogar os privilégios de root de um usuário sem precisar alterar a senha de root.
Ian D. Scott