¿Cómo ejecutar el comando sudo sin contraseña?

235

¿Cómo el ubuntuusuario en las imágenes de AWS para Ubuntu Server 12.04 tiene sin contraseña sudopara todos los comandos cuando no hay configuración para ello /etc/sudoers?

Estoy usando el servidor Ubuntu 12.04 en Amazon. Quiero agregar un nuevo usuario que tenga el mismo comportamiento que el usuario predeterminado de Ubuntu. Específicamente quiero sin contraseña sudopara este nuevo usuario.

Así que agregué un nuevo usuario y fui a editar /etc/sudoers(usando visudo, por supuesto). Al leer ese archivo, parecía que el ubuntuusuario predeterminado estaba sin contraseña sudopor ser miembro del admingrupo. Así que agregué mi nuevo usuario a eso. Lo que no funcionó. Luego intenté agregar la NOPASSWDdirectiva a sudoers. Lo que tampoco funcionó.

De todos modos, ahora solo tengo curiosidad. ¿Cómo ubuntuobtiene el usuario privilegios sin contraseña si no están definidos /etc/sudoers? ¿Cuál es el mecanismo que permite esto?

aychedee
fuente
Relacionado: ¿ Ejecutar sudo sin contraseña?
Eliah Kagan

Respuestas:

332

Bien, he descubierto la respuesta, así que también podría ponerla aquí para completarla. Al final /etc/sudoershay lo que pensé que era solo un comentario:

#includedir /etc/sudoers.d

Sin embargo, esto realmente incluye el contenido de ese directorio. En cuyo interior está el archivo /etc/sudoers.d/90-cloudimg-ubuntu. Que tiene los contenidos esperados

# ubuntu user is default user in cloud-images.
# It needs passwordless sudo functionality.
ubuntu ALL=(ALL) NOPASSWD:ALL

Así que ahí es donde vive la configuración de sudo para el usuario predeterminado de ubuntu.

Debería editar este archivo usando visudo. El siguiente comando le permitirá editar el archivo correcto con visudo.

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu

Y agregue una línea como:

aychedee ALL=(ALL) NOPASSWD:ALL

Al final.

aychedee
fuente
44
Estoy bastante seguro de que tuve que hacer un reinicio completo.
aychedee
2
se usarán nuevas reglas de sudo para cada nuevo usuario registrado, por lo que debe volver a iniciar sesión al menos
bluszcz
32
'sudo service sudo restart' funciona :)
Laice
44
En versiones posteriores (14.04, por ejemplo), el archivo incluido es /etc/sudoers.d/90-cloud-init-users(para editar .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users). Aunque sería más limpio crear archivos adicionales que editar el generado. Tenga en cuenta que los archivos que contiene una .o termine en ~lo no ser incluidos.
Molomby
2
@ Phil_1984_ Lo más probable es que se haya agregado como un comentario para permitir la compatibilidad con otras versiones (¿estándar?) De sudo, que no permiten incluir, pero no se tropezarían con un comentario extraño. (¡Los estándares son difíciles! ;-)
jpaugh
94

Descubrí que lo más sencillo, para replicar fácilmente este comportamiento en varios servidores, era lo siguiente:

sudo visudo

Cambia esta línea:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) ALL

a esta línea:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

Y muévelo debajo de esta línea:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

ahora deberías tener esto:

# 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_reset
Defaults        mail_badpass
Defaults        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 specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

entonces para cada usuario que necesita acceso sudo CON una contraseña :

sudo adduser <user> sudo

y para cada usuario que necesita acceso a sudo SIN contraseña :

sudo adduser <user> admin

y finalmente, ejecuta esto:

sudo service sudo restart

¡Y eso es!

Editar: es posible que deba agregar el grupo de administración, ya que no creo que exista de manera predeterminada.

sudo groupadd admin

También puede agregar el ubuntuusuario de AWS predeterminado al admingrupo mediante este comando:

sudo usermod ubuntu -g admin

Nota: Como mencionó @hata , es posible que deba usarlo admcomo nombre de su grupo de administración, dependiendo de la versión de Ubuntu que se esté usando.

jiminikiz
fuente
3
Nota personal: es una convención mover los permisos menos restrictivos más abajo en la pila. Pero no hacerlo no afectará la funcionalidad.
poweratom
2
Como explicó jiminikiz, tuve que colocar el % admin después del % sudo en mi Ubuntu GNOME 16.04 LTS. Además, la identificación del grupo de administradores no es exactamente admin, sino admi en mi Ubuntu. No fue necesario reiniciar.
Hata
5

Crearía mi propio archivo en el directorio /etc/sudoers.d/; el archivo creado por Amazon Cloud podría sobrescribirse en caso de cualquier actualización. Después de crear su archivo en /etc/sudoers.d, agregue esta entrada,

<your user name> ALL=(ALL) NOPASSWD:ALL

Reinicie el sistema y esto funcionará.

WaughWaugh
fuente
2

Respuesta corta sin usar ningún editor (probado en bash, muy arriesgado de ejecutar en hosts remotos).

Configure sudo para que funcione sin una contraseña para el usuario actual:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

Verifique la edición con:

sudo visudo -c

Verifique si puede usar sudo sin una contraseña:

sudo cat /etc/sudoers | grep "$USER"

... o simplemente pruébalo con:

sudo <anything>
usuario315445
fuente
21
Este es un consejo bastante peligroso ... copie y pegue esto incorrectamente y se bloqueará de su propio servidor. De ahí el consejo de usar visudo. Comprueba que la sintaxis es correcta antes de guardar en el disco. Entonces, para cualquiera que quiera usar esto. No lo haga en un servidor remoto que le interese. Es posible que desee incluir una advertencia al respecto en su respuesta.
aychedee
8
No usar visudo es una idea horrible . Creeme lo se.
trognanders
1
En mi humilde opinión, copiar y pegar es más seguro que una edición manual. Una simplificación menor:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain
44
@theartofrain: normalmente, estoy de acuerdo, pero visudoes particularmente agradable al no permitirle romper el archivo sudoers, por lo tanto, no bloquearlo de su máquina (o al menos sudo).
Jon V
3
@JonV También puede perder los derechos de administrador visudo, pero generalmente no por accidente, ya que visudosolo guarda los cambios que están bien formados de acuerdo con la gramática de los archivos sudoers . La mayoría de los errores son sintácticamente incorrectos, por lo que no causan daño visudo. Si /etc/sudoersun archivo /etc/sudoers.d está mal formado, se sudoniega a elevar los privilegios para cualquier persona como medida de seguridad, por lo que no usarlo visudoes peligroso. (Aunque a veces pkexecpuede solucionarlo sin reiniciar).
Eliah Kagan
0

Así es como he implementado el usuario no root, sin contraseña en una imagen efímera de Docker para usar en una tubería CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    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 "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Seth Bergman
fuente