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.

user184982
fonte
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.

agitar
fonte
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.

meuh
fonte
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.

coteyr
fonte
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.

Stig Hemmer
fonte
1

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

user1700494
fonte
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