Archivo Sudoers, habilitar NOPASSWD para el usuario, todos los comandos

Prólogo

Esta es una pregunta bastante compleja relacionada con el archivo sudoers y el comando sudo en general.

NOTA: He realizado estos cambios en una máquina dedicada que ejecuta Ubuntu Desktop 13.04, que utilizo únicamente con fines de aprendizaje. Entiendo que es un gran riesgo de seguridad habilitar NOPASSWD sudo.

Pregunta

Inicialmente, mi único cambio en el archivo sudoers (/etc/sudoers) era una línea, una especificación de usuario que debería haber permitido a nicholsonjf ejecutar todos los comandos con sudo sin tener que ingresar una contraseña (vea la línea que comienza con nicholsonjf):

# This file MUST be edited with the 'visudo' command as root.## Please consider adding local content in /etc/sudoers.d/ instead of# directly modifying this file.## See the man page for details on how to write a sudoers file.#Defaults        env_resetDefaults        mail_badpassDefaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Host alias specification# User alias specification# Cmnd alias specification# User privilege specificationroot    ALL=(ALL:ALL) ALLnicholsonjf    ALL=NOPASSWD: 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# See sudoers(5) for more information on "#include" directives:#includedir /etc/sudoers.d

Sin embargo, esto no funcionó, y todavía se me pedía mi contraseña cada vez que ejecutaba un comando como nicholsonjf. Solo pude comenzar a ejecutar comandos sudo como nicholsonjf una vez que eliminé a nicholsonjf de los grupos sudo y admin.

¿Alguien puede explicar por qué esto funcionó?

Es porque el usuario nicholsonjf estaba heredando derechos sudo de las dos especificaciones de grupo de admin y sudo (visto a continuación en el archivo sudoers), que anulaban la especificación de usuario nicholsonjf porque estaban más abajo en el archivo de configuración?

La línea que agregaste se anuló. De man sudoers:

Cuando varias entradas coinciden para un usuario, se aplican en orden. Cuando hay varias coincidencias, se utiliza la última coincidencia (que no es necesariamente la más específica).

En su caso nicholsonjf era miembro del grupo sudo así que para él esta línea se aplica:

%sudo   ALL=(ALL:ALL) ALL

Si desea anular entradas en /etc/sudoers simplemente coloque las nuevas entradas después de ellas.

La nueva entrada debería verse así

myuser ALL=(ALL) NOPASSWD: ALL para un solo usuario, o

%sudo ALL=(ALL) NOPASSWD: ALL para un grupo.

Para un solo usuario, agregue esta línea al final de su sudoers archivo usando el sudo visudo comando:

superuser ALL=(ALL) NOPASSWD:ALL

Para un grupo

%supergroup  ALL=(ALL) NOPASSWD:ALL

Para nunca solicitar una contraseña al usuario actual cuando ese usuario usa sudo ejecute este comando:

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-sudo-password

Crea un archivo llamado /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password con los siguientes contenidos:

<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL

Las ventajas de hacerlo de esta manera manualmente añadiendo la línea /etc/sudoers utilizar sudo visudo (como lo sugieren las otras respuestas) son

  1. /etc/sudoers a veces se modifica mediante actualizaciones del sistema, mientras que los archivos de /etc/sudoers.d no
  2. el sudo visudo el método es propenso a errores (como lo demuestra esta misma pregunta), mientras que copiar y pegar un comando es más difícil de estropear

Tenga en cuenta que es posible que aún se le solicite la contraseña en otros contextos, como instalar cosas de la Software de Ubuntu aplicación gráfica.

De acuerdo con sudo cat /etc/sudoers.d/README esta característica (de poner archivos sudoer adicionales en /etc/sudoers.d) se ha habilitado de forma predeterminada desde Debian 1.7. 2p1-1, que salió a finales de la década de 1990 (Ubuntu es basado en Debian).

Mientras investigaba esto, me di cuenta de que hay una línea en el /etc/sudoers archivo que no es un comentario, sino un directriz eso hace que cualquier archivo o carpeta en el directorio /etc/sudoers/* sobrescribir el contenido de /etc/sudoers.

Esta es una pequeña directiva astuta, ya que parece ser una línea comentada a primera vista. Se parece a esto:

#includedir /etc/sudoers.d

Así es como implementé el usuario sin contraseña y sin root en una imagen efímera de Docker para usar en una canalización CICD con la imagen base de ubuntu: 18.04:

RUN \  useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \  sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \  sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \  sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \  echo "Customized the sudoers file for passwordless access!" && \  echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \  echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \  echo "foo user:";  su foo -c 'whoami && id' && \  echo "root user:"; su root -c 'whoami && id'

Qué sucede con el código anterior:

  • El usuario y el grupo foo se crea.
  • Usuario foo se añade a los dos la foo y sudo grupo.
  • El directorio de inicio está configurado en /home/foo.
  • El shell está configurado en /bin/bash.
  • El sed el comando realiza actualizaciones en línea del /etc/sudoers archivo para permitir foo y root acceso sin contraseña de los usuarios al sudo grupo.
  • El sed comando desactiva el #includedir directiva que permitiría que cualquier archivo en subdirectorios anule estas actualizaciones en línea.

Como Vince tener mencionado en un comentario, puedes usar esta línea:

%sudo ALL=NOPASSWD: ALL

(Esto es diferente de las líneas que se muestran en aquellos respuesta y me resolvió el problema.)

Se puede insertar una cadena en una línea sin formato EOF al final del archivo sudoers o eliminar con sed -i:

cat >> /etc/sudoers <<<'PaSe ALL=(ALL:ALL) NOPASSWD:ALL'

Referencia:https://stackoverflow.com/questions/41298208/how-to-append-a-line-at-the-end-of-etc-sudoers-file-using-shell-script-without/70039824#70039824

nota: ALL=NOPASSWD: ALL tiene que ser ALL=(ALL) NOPASSWD: ALL o de lo contrario no funciona…

Posible duplicado de ¿Por qué la opción sudoers NOPASSWD no funciona?

vea también esta respuesta : sudo does not ask for password - Ask Ubuntu