# 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](/media/whitedec/blog_img/vaBoSfdn.webp) ## ¿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`. ```bash 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/`. ```bash 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. ```bash 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í: ```bash 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`. ```bash ~$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: ```bash 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: ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` Y escribe lo siguiente: ```ini 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: ```bash 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. ```bash 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. ```bash 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í: ```bash %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: ```bash 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í: ```bash 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`. ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` 2. Simplemente añade la regla `NOPASSWD`. ```ini 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.