Evite que sudo solicite una contraseña cuando ejecute un comando no permitido

15

He otorgado un permiso grupal para ejecutar ciertos comandos sin contraseña a través de sudo. Cuando uno de los usuarios comete un error tipográfico o ejecuta un comando incorrecto, el sistema le solicita su contraseña y luego recibe un error. Esto es confuso para el usuario, por lo que me gustaría mostrar un error en lugar de pedirle una contraseña. es posible?

Aquí hay un ejemplo de mi archivo sudoers:

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

Ejemplo cuando ejecutan el script incorrecto:

# 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>.

Salida deseada:

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

Tenga en cuenta la falta de solicitud de contraseña.

Mi google-fu me ha fallado y sólo devuelve los resultados en no pedir una contraseña cuando el usuario está autorizado a ejecutar el comando.

usuario184982
fuente
8
Si eso fuera posible, podría abrir un agujero de seguridad (pequeño). Si se ha dejado conectado y "tomé prestado" su teclado, no puedo ver qué comandos sudole permitirán ejecutar sin ingresar su contraseña. Con la función que desea, podría obtener esa información para comandos específicos.
Keith Thompson
44
Este es un problema de seguridad bastante grande. No debe usar sudo con scripts como comando. Las personas pueden editar el script y ejecutar lo que quieran enmascarándolo por completo desde una auditoría. En su lugar, agregue la llamada a sudo dentro del script.
coteyr
1
@coteyr ejecutar archivos binarios con sudoes un problema tan grande, si los usuarios tienen acceso de escritura a estos archivos.
Dmitry Grigoryev
1
@CarlWitthoft es por eso que utiliza rutas absolutas para especificar programas permitidos en sudoers.
Dmitry Grigoryev
1
@DmitryGrigoryev, sí, pero si vas a usar sed o algo así para un solo archivo, entonces no hay beneficio para sudo. Permitir que un usuario modifique un archivo es la razón por la cual los archivos tienen permisos. No tienes que reinventar la rueda. Si desea que un usuario pueda modificar un archivo, déjelo. No hay necesidad ni beneficio de saltar a través de aros con sudo para permitir que un usuario modifique un archivo, sin una contraseña. Siempre puedes permitir que lo hagan. Herramienta adecuada para el trabajo correcto.
coteyr

Respuestas:

25

De una lectura rápida 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.

Y para los que dudan:

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

Probado así:

% 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:

Por lo tanto, una aliaspara sudoestas personas probablemente haría el truco, para evitar que se solicite la contraseña. Ahora, por qué esto requiere una compilación personalizada sudo, no sé, acabo de leer el manual.

thrig
fuente
En efecto. Pondría algo como alias sudo="$(which sudo) -n"en / etc / bashrc, luego usaría sudo(comportamiento ajustado) o command sudo(comportamiento predeterminado) según lo deseado.
un CVn
7

Una cosa que funcionó para mí (Sudo versión 1.8.17p1), pero que satisface solo una parte de su problema, es establecer el número de intentos de contraseña en 0.

Defaults:%mygroup passwd_tries = 0

Esto hace que sudo salga con el código 1 cuando se intenta cualquier comando que requiera una contraseña. Sin embargo, no produce ningún tipo de mensaje de error.

meuh
fuente
Esta también es una respuesta válida, pero la falta de mensaje de error puede ser confusa. Sin embargo, el error correcto pero inesperado de la respuesta anterior también es confuso. Es una sacudida, supongo. ¡Gracias por proporcionar una respuesta alternativa, las opciones siempre son apreciadas!
user184982
2

No puedes.

No hay forma de saber quién es hasta que se haya autenticado y, de forma predeterminada, no puede autenticarse sin una contraseña.

Puede cambiar la autenticación para usar llaves USB, escáneres de huellas digitales, autenticación de voz, reconocimiento de rostros o un montón de otras cosas, pero el punto es el mismo.

No puede autenticarse, sin autenticar Y antes de autenticar sudo no tiene por qué decirle lo que puede o no puede ejecutar.

coteyr
fuente
2
Escribir su contraseña cuando ejecuta sudo no es identificación (“diga quién es”). Sudo sabe quién eres. Escribir su contraseña es la confirmación de presencia.
Gilles 'SO- deja de ser malvado'
Considero la confirmación de presencia como "autenticación". Como en Autenticación, luego Autorización.
coteyr
2
La respuesta dice "autenticación", no "identificación". Mientras que sudo sabe quién eres dice ser, basado en el usuario que ha iniciado la sesión en ese terminal, no se sabe quién es hasta que haya autenticado esa identidad.
Dave Sherohman
2

@StrongBad hizo un comentario que merece ser una respuesta:

Creo que la mejor solución sería escribir un script de envoltura que siempre llame sudocon los parámetros correctos. (Incluyendo -n)

El script de envoltura puede hacer análisis de argumentos, etc. para que el script sudo llamado sea lo más pequeño posible y, por lo tanto, sea menos probable que tenga errores.

Stig Hemmer
fuente
1

Esto no es posible. La única forma es cambiar el código fuente y compilar su propia bifurcación desudo

usuario1700494
fuente
Tienes razón, pero no creo que vaya a obtener permiso para cargar una versión personalizada de sudo en todos nuestros servidores de producción. hah
user184982