Impedir que o sudo solicite a senha ao executar o comando não permitido


15

Eu concedi uma permissão de grupo para executar determinados comandos sem senha via sudo. Quando um dos usuários digita um erro de digitação ou executa o comando errado, o sistema solicita sua senha e eles recebem um erro. Isso é confuso para o usuário, portanto, gostaria de exibir apenas um erro em vez de solicitar uma senha. Isso é possível?

Aqui está um exemplo do meu arquivo sudoers:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Exemplo quando eles executam o script errado:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Saída desejada:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Observe a falta de solicitação de senha.

Meu google-fu falhou comigo e só retorna resultados ao não solicitar uma senha quando o usuário tem permissão para executar o comando.


8
Se isso fosse possível, poderia abrir uma (pequena) brecha de segurança. Se você se logou e eu "empresto" seu teclado, não consigo ver quais comandos sudopermitirão que você execute sem digitar sua senha. Com o recurso que você deseja, eu poderia obter essas informações para comandos específicos.
— 21816 Keith Thompson

4
Este é um problema de segurança bastante grande. Você não deve usar o sudo com scripts como o comando. As pessoas podem editar o script e executar o que quiserem mascarando-o totalmente de uma auditoria. Em vez disso, adicione a chamada para sudo dentro do script.
— coteyr

1
O @coteyr que executa arquivos binários com o problema sudoé o mesmo, se os usuários tiverem acesso de gravação a esses arquivos.
— Dmitry Grigoryev

1
@CarlWitthoft é por isso que você usa caminhos absolutos para especificar programas permitidos em sudoers.
— Dmitry Grigoryev

1
@DmitryGrigoryev, sim, mas se você usar o sed ou algo parecido em apenas um arquivo, não haverá benefício para o sudo. Permitir que um usuário modifique um arquivo é o motivo pelo qual os arquivos têm permissões. Você não precisa reinventar a roda. Se você deseja que um usuário possa modificar um arquivo, deixe-o. Não há necessidade ou benefício de avançar com sudo para permitir que um usuário modifique um arquivo, sem uma senha. Você sempre pode permitir. Ferramenta certa para o trabalho certo.
— coteyr

Respostas:


25

De uma rápida leitura de sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

E para os que duvidam:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

Testado assim:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Portanto, uma aliasação sudopara essas pessoas provavelmente faria o truque, para impedir o prompt da senha. Agora, por que isso requer compilação personalizada sudo, não sei, acabei de ler o manual.


De fato. Eu colocaria algo como alias sudo="$(which sudo) -n"em / etc / bashrc e usaria sudo(comportamento ajustado) ou command sudo(comportamento padrão) conforme desejado.
— um CVn

7

Uma coisa que funcionou para mim (Sudo versão 1.8.17p1), mas satisfaz apenas parte do seu problema, é definir o número de tentativas de senha como 0.

Defaults:%mygroup passwd_tries = 0

Isso faz com que o sudo saia com o código 1 quando qualquer comando que requer uma senha é tentado. No entanto, ele não produz nenhum tipo de mensagem de erro.


Essa também é uma resposta válida, mas a falta de mensagem de erro pode ser confusa. O erro correto, porém inesperado, da resposta acima também é confuso. É uma brincadeira, eu acho. Obrigado por fornecer uma resposta alternativa, as opções são sempre apreciadas!
— user184982

2

Você não pode.

Não há como dizer quem você é até que você tenha se autenticado e, por padrão, não pode se autenticar sem uma senha.

Você pode alterar a autenticação para usar chaves USB, scanners de impressões digitais, autenticação por voz, reconhecimento de rosto ou várias outras coisas, mas o ponto é o mesmo.

Você não pode autenticar, sem autenticar E antes de autenticar o sudo, não é necessário dizer o que você pode ou não executar.


2
Digitar sua senha ao executar o sudo não é identificação ("diga quem você é"). Sudo sabe quem você é. Digitar sua senha é uma confirmação de presença.
— Gilles 'SO- stop be evil' (

Considero a confirmação de presença como "autenticação". Como em Autenticação e Autorização.
— Coteyr 17/08/19

2
A resposta diz "autenticação" e não "identificação". Embora o sudo saiba quem você afirma ser, com base no usuário conectado nesse terminal, ele não sabe quem você é até que você tenha autenticado essa identidade.
— Dave Sherohman

2

O @StrongBad fez um comentário que merece ser uma resposta:

Eu acho que a melhor solução seria escrever um script de wrapper que sempre chama sudocom os parâmetros corretos. (Incluindo -n)

O script do wrapper pode fazer a análise de argumentos, etc., para que o script sudo chamado fique o menor possível e, portanto, menos propenso a ter erros.


1

Isso não é possível. A única maneira é alterar o código-fonte e compilar seu próprio forksudo


Você está certo, mas acho que não vou conseguir permissão para carregar uma versão personalizada do sudo em todos os nossos servidores de produção. hah
— user184982
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.