Cómo usar sudo sin contraseña en Linux

sudo apt update sudo systemctl restart nginx sudo reboot

Al usar Linux, es muy común recurrir a sudo constantemente. Sin embargo, tener que introducir la contraseña una y otra vez puede volverse tedioso.

Cuando ese fastidio alcanza su punto máximo, uno se decide a configurar sudo para que no pida la contraseña. Es muy probable que quienes hayan llegado a este artículo compartan un sentimiento similar al mío.

En este artículo, explicaremos cómo eliminar la necesidad de introducir la contraseña de sudo.

Seguridad de Linux con Tux y una llave

¿Dónde se encuentra la configuración de sudo y cómo modificarla?

El archivo principal de configuración de sudo se encuentra aquí:

/etc/sudoers

La configuración de sudo puede ser bastante delicada si la sintaxis es incorrecta. Si se introduce una configuración errónea y sudo deja de funcionar, la recuperación puede ser complicada. Por ello, se utiliza el comando especializado visudo.

sudo visudo

visudo realiza una verificación de sintaxis al guardar y te notifica inmediatamente si hay algún error tipográfico. De hecho, el manual oficial recomienda encarecidamente usar visudo.

No modifiques /etc/sudoers directamente

Si introduces sudo visudo, el archivo /etc/sudoers se abrirá y podrás modificarlo directamente. Sin embargo, editar este archivo directamente no es una buena práctica.

Personalmente, prefiero no tocar el archivo de configuración principal y, en su lugar, crear nuevos archivos en el directorio /etc/sudoers.d/. Esto facilita la identificación de los cambios realizados y su reversión en el futuro.

sudo está diseñado para incluir configuraciones de archivos almacenados en el directorio mencionado. De hecho, al final del archivo /etc/sudoers, verás la línea include /etc/sudoers.d/.

sudo visudo -f /etc/sudoers.d/no-password-common-commands

Puedes nombrar el archivo como quieras, de forma que sea fácil de identificar más tarde. Sin embargo, no lo nombres de forma descuidada; te arrepentirás cuando lo busques en el futuro.

¡Ah! Como dato, los nombres de archivo que contienen ~ y . son ignorados por sudoers. Esta información se encuentra en un comentario dentro del archivo README del directorio.

Conozcamos el formato de configuración.

La configuración de sudoers sigue este formato general:

Es una sintaxis realmente... imposible de memorizar. Simplemente anótala en algún lugar o guarda esta página del blog en tus favoritos. No la usarás a menudo, pero cuando la necesites, te costará recordarla.

NOMBRE_DE_USUARIO HOST=(USUARIO_A_EJECUTAR) OPCIONES: COMANDO

Por ejemplo, si tu nombre de usuario es potter y quieres ejecutar apt update sin contraseña, podrías escribirlo así:

potter ALL=(ALL) NOPASSWD: /usr/bin/apt

Desglosando cada parte, tenemos:

  • potter: El nombre de usuario al que se aplicará la configuración.
  • ALL: Indica que se aplicará en todos los hosts.
  • (ALL): Especifica bajo qué privilegios de usuario se puede ejecutar el comando. A veces, he visto a gente usar (root). Yo prefiero ALL.
  • NOPASSWD: No solicitará la contraseña.
  • /usr/bin/apt: La "ruta absoluta" del comando permitido.

Si no estás seguro de la ruta de un comando, puedes verificarla con which.

~$which apt
/usr/bin/apt

~$which apt-get
/usr/bin/apt-get

~$which reboot
/usr/sbin/reboot

~$which systemctl
/usr/bin/systemctl

La tentación de abrirlo todo con ALL

Aquí surge una tentación muy fuerte:

potter ALL=(ALL) NOPASSWD: ALL

Es muy limpio. Permite ejecutar todos los comandos sudo sin contraseña. Es cómodo, ¡demasiado cómodo!

Es una elección personal, pero creo que es mejor resistir esta tentación. No quiero ni imaginar una situación en la que un comando mal escrito se ejecute inmediatamente con privilegios de root.

Si un script se ejecuta de forma inesperada, no hay un último freno en forma de solicitud de contraseña. Si alguien manipula el terminal mientras lo tienes abierto, todo puede irse al traste. Hay mucha gente extraña en el mundo...

La decisión final es tuya.

Permitir solo los comandos de uso frecuente sin contraseña

Yo opto por el compromiso de 'desbloquear solo lo que uso con frecuencia'. Este enfoque es bastante bueno.

Por ejemplo, digamos que solo quiero usar apt, apt-get, reboot y systemctl sin contraseña.

Primero, abre el archivo de configuración:

sudo visudo -f /etc/sudoers.d/no-password-common-commands

Y escribe lo siguiente:

potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl

Ahora, el usuario potter podrá ejecutar los siguientes comandos sin contraseña:

sudo apt update
sudo apt -y upgrade
sudo apt-get update
sudo reboot
sudo systemctl reload nginx

Si te resulta demasiado abrir systemctl por completo, también puedes permitir solo comandos específicos.

potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx

Dividir en varias líneas para una mejor legibilidad

Cuando hay muchos comandos, una sola línea puede volverse desordenada. En estos casos, puedes dividir la línea usando \.

Aunque es una forma familiar y obvia de dividir líneas para los usuarios de Linux, curiosamente, en la práctica, no se usa tanto el \. Sin embargo, su uso mejora la legibilidad.

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot, \
    /usr/bin/systemctl

Se ve mejor y más limpio.

Aplicar a un grupo específico

Esta configuración también es bastante útil. En servidores gestionados por varias personas, la gestión por grupos puede ser más cómoda.

Si deseas aplicarlo solo a un grupo específico, puedes usar el formato %NOMBRE_DEL_GRUPO.

Por ejemplo, para el grupo admin, sería así:

%admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get

Aumentar el tiempo de persistencia de la contraseña

Si no te sientes cómodo eliminando la contraseña por completo, hay otra opción: ajustar el tiempo de espera antes de que se solicite de nuevo.

Por defecto, una vez que introduces la contraseña, no se te vuelve a pedir durante unos 10 o 15 minutos, pero este tiempo se puede modificar.

Esto se hace utilizando la configuración timestamp_timeout.

Por ejemplo, al hacer esto, sudo no te pedirá la contraseña durante 60 minutos:

Defaults timestamp_timeout=60

La unidad es "minutos", pero si pones '0', será una pesadilla, ya que siempre te pedirá la contraseña.

Si lo configuras a '-1', sudo no te volverá a pedir la contraseña hasta que cierres el terminal. Esto ofrece una comodidad casi tan grande como ALL, pero puede generar cierta incomodidad en términos de seguridad.

Por supuesto, estas configuraciones pueden coexistir: permitir comandos sin contraseña y aumentar el tiempo de persistencia.

Por ejemplo, puedes combinarlas así:

Defaults timestamp_timeout=30

potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot

Los comandos frecuentes sin contraseña, y para el resto de comandos sudo, una vez autenticado, la sesión dura 30 minutos. ¿No crees que este es un buen equilibrio entre comodidad y seguridad?

Es bueno reducir las molestias, pero no a costa de aumentar la inseguridad.

Conclusión

Eliminar la necesidad de introducir la contraseña de sudo no es complicado. Aunque la explicación anterior fue extensa, en resumen:

  1. Crea un archivo de configuración separado en /etc/sudoers.d/ usando visudo.
sudo visudo -f /etc/sudoers.d/no-password-common-commands
  1. Simplemente añade la regla NOPASSWD.
Defaults timestamp_timeout=30

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot

La medida en que decidas relajar la seguridad de la contraseña es tu decisión, pero me gustaría que recordaras esto:

La verdadera comodidad se logra cuando la facilidad de tus dedos y la tranquilidad de tu mente se satisfacen al mismo tiempo.