Como o sudo decide se solicita uma senha, quando recebe um comando que na verdade não precisa do `sudo`?

10

Ao aplicar sudoa um comando que realmente não precisa sudo,

  • às vezes, não me pede minha senha. Por exemplo sob a minha $HOME, sudo ls.

  • Mas eu lembro que isso serve para algum outro comando, embora eu esqueça qual.

Então, eu queria saber como sudodecide se deve pedir uma senha, quando recebe um comando que realmente não precisa sudo? Existe alguma regra para /etc/sudoersespecificar isso?

Meu problema real é que, quando eu uso du, algumas vezes mostra "permissão negada" para alguns diretórios e outras não, provavelmente porque não tenho permissão em alguns diretórios? Eu me inscrevo sudopara o duindependentemente, e pensei que seria solicitada uma senha independentemente, mas na verdade não nos meus próprios diretórios.

Tim
fonte
15
Decidir se um programa iria tentar fazer algo que somente o root pode fazer, ou acessar um arquivo que o usuário invocação é proibido o acesso, sem realmente executar o programa, é o problema da parada disfarçado. Então você pode ter certeza de que não é isso que o sudo está fazendo.
Zwol
2
+1 porque, embora a pergunta se baseie em um equívoco, os sintomas são claramente explicados e tem uma resposta inequívoca.
Dcorking

Respostas:

22

Em uma configuração típica, o comando é irrelevante. Você precisa digitar sua senha na primeira vez que usar o sudo, e não precisará da sua senha nesse shell específico pelos próximos 15 minutos.

Do ponto de vista do computador, não existe um "comando que precise de sudo". Qualquer usuário pode tentar executar qualquer comando. O resultado pode ser apenas uma mensagem de erro como "Permissão negada" ou "Nenhum arquivo ou diretório", mas sempre é possível executar o comando.

Por exemplo, se você executar duem uma árvore de diretórios com conteúdo que você não tem permissão para acessar, obterá erros de permissão. É isso que "permissão negada" significa. Se você executar sudo du, o sudo será executado ducomo root, para que você não obtenha erros de permissão (esse é o ponto da conta root: root¹ sempre tem permissão). Quando você executa sudo du, duexecuta como root e sudonão está envolvido após o duinício. Se o du encontra erros de permissão é completamente irrelevante para o funcionamento do sudo.

Existem comandos que precisam do sudo para fazer algo útil . Utilidade é um conceito humano. Você precisa usar o sudo (ou alguns outros métodos para executar o comando como root) se o comando fizer algo útil quando executado como root, mas não quando executado na sua conta.

Se o sudo pede sua senha depende de duas coisas.

  1. Com base na configuração, o sudo decide se você precisa ser autenticado. Por padrão, o sudo requer uma senha. Isso pode ser desativado de várias maneiras, incluindo definir a authenticateopção como false e ter uma regra aplicável com a NOPASSWDtag.
  2. Se o sudo exigir sua senha, pode ser um conteúdo para usar um valor em cache. Tudo bem, porque o motivo pelo qual o sudo precisa da sua senha não é autenticar quem está chamando (o sudo sabe qual usuário a chamou), mas confirmar que ainda é você quem comanda e não alguém que assumiu o controle do teclado. Por padrão, o sudo está disposto a acreditar que você ainda está no comando se tiver digitado sua senha há menos de 15 minutos (isso pode ser alterado com a timeoutopção). Você precisa ter digitado a senha no mesmo terminal (para que, se você permanecer logado em um terminal, deixe o terminal sem vigilância e use outro terminal, alguém possa 'tty_tickets

¹ quase, mas isso está além do escopo deste segmento.

Gilles 'SO- parar de ser mau'
fonte
Pode haver arquivos com o bit executável definido apenas para raiz, não para outros. Isso pode ocorrer após "precisar de root para executar". (Apenas nitpicking.)
Paŭlo Ebermann
@ PaŭloEbermann Eu escrevi “qualquer usuário pode tentar executar qualquer comando” para evitar detalhes sobre esse caso (raro). Sempre há um nitpicker :(
Gilles 'SO- stop be evil'
45

sudonão sabe se o comando solicitado a executar precisa ser executado como outro usuário (normalmente root), tudo que sabe é sua configuração. Isso determina quais usuários têm permissão para executar sudo, com quais usuários como "destinos" e para quais comandos; Ele também determina se é necessária uma senha, qual e se deve manter um token de autenticação.

Se você estiver usando a configuração padrão da Debian, é provável que esta esteja envolvida aqui: sudosolicitará sua senha na primeira vez em que você a usar em qualquer terminal, e manterá um token de autenticação por um certo período de tempo. Se você reutilizar sudono mesmo terminal dentro desse prazo, não solicitará uma senha.

Stephen Kitt
fonte
Obrigado. Você quer dizer sudo du /path/to/some/dirsempre deve precisar da minha senha ou nunca, independentemente /path/to/some/dir?
Tim
12
Sim. Ele sempre precisará da sua senha (ou não). Claramente, se ele precisar da sua senha, mas já a tiver armazenado no cache, não solicitará que você a digite.
8238 dr_
5
A rigor, pode depender do caminho, pois /etc/sudoerspode especificar comandos e seus argumentos. No entanto, se você não adicionou algo assim a sudoers(e, se tiver, espero que esteja ciente disso), os argumentos não importam (nem o comando se você tiver acesso geral ao root via sudo ).
Stephen Kitt
19
sudonão armazena sua senha no cache, apenas as informações de que sua identidade já foi verificada uma vez com uma verificação de senha. Como sudoé um programa raiz setuid, ele já tem todas as permissões necessárias para executar qualquer coisa como qualquer um - mas é confiável permitir apenas que os usuários o usem exatamente como especificado no sudoersarquivo e rejeitar todas as outras tentativas de usá-lo . Por isso é importante que sudoseja um programa tão pequeno e muito bem estudado.
telcoM
6

para um comando que realmente não precisa do sudo

Não é que um comando precise ou não precise de sudo. Quando você corre

sudo -u user command

o sistema executa commandcomo o user.

Se a chamada é bem-sucedida ou não, e se uma senha é solicitada ou não, depende da política de segurança sudoers(geralmente configurada em /etc/sudoers).

dr_
fonte