15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
10.11.2023

Cómo deshabilitar la solicitud de contraseña para el comando Sudo en Linux

El comando sudo — abreviatura de superuser do — otorga a los usuarios Linux autorizados privilegios temporales de nivel root para ejecutar tareas administrativas. De forma predeterminada, cada invocación de sudo requiere autenticación mediante contraseña para verificar la identidad del solicitante. Puede deshabilitar esta solicitud de contraseña de forma global para un usuario, de forma selectiva para comandos específicos, o temporalmente para una sesión modificando el archivo /etc/sudoers a través de visudo o ajustando la directiva timestamp_timeout.

Antes de continuar: deshabilitar la autenticación por contraseña de sudo reduce la postura de defensa en profundidad de su sistema. Aplique estos cambios solo a cuentas de confianza, preferiblemente limitados a comandos específicos en lugar de privilegios ALL generales. En cualquier entorno de VPS Hosting en producción, trate el sudo sin contraseña como una compensación calculada, no como una conveniencia predeterminada.

Cómo Funciona la Autenticación de Sudo

Cuando un usuario ejecuta sudo, la pila Linux PAM (Pluggable Authentication Modules) autentica la solicitud contra las reglas definidas en /etc/sudoers. Tras una autenticación exitosa, el kernel registra una marca de tiempo de credencial en /run/sudo/ts/ (o /var/db/sudo/ en distribuciones más antiguas). Las llamadas posteriores a sudo dentro de la ventana timestamp_timeout — 15 minutos por defecto — omiten la reautenticación por completo.

Esta arquitectura significa que hay dos palancas fundamentalmente diferentes que puede utilizar:

  • Caché de credenciales — ampliar o eliminar la ventana de tiempo de espera para que el usuario se autentique una vez y la credencial persista más tiempo.
  • Directiva NOPASSWD — instruir a sudo para que omita la autenticación por completo para comandos o usuarios específicos, independientemente del tiempo.

Comprender esta distinción es fundamental. Ampliar timestamp_timeout a un valor grande aún requiere una autenticación inicial. La directiva NOPASSWD requiere cero autenticaciones, en ningún momento. Estos no son equivalentes desde el punto de vista de la seguridad.

El Archivo sudoers: Arquitectura y Edición Segura

El archivo de configuración principal es /etc/sudoers. Nunca debe editarse directamente con un editor de texto estándar. Utilice siempre visudo, que:

  • Bloquea el archivo contra ediciones concurrentes
  • Valida la sintaxis antes de guardar
  • Evita que un archivo sudoers malformado bloquee a todos los usuarios de sudo
sudo visudo

En sistemas modernos Debian/Ubuntu, /etc/sudoers incluye un directorio de archivos adicionales:

/etc/sudoers.d/

Puede colocar archivos de reglas individuales aquí en lugar de modificar directamente el archivo principal. Este es el enfoque recomendado para sistemas en producción — mantiene sus reglas personalizadas aisladas y facilita la auditoría.

sudo visudo -f /etc/sudoers.d/custom_nopasswd

Los archivos en /etc/sudoers.d/ no deben contener un . en su nombre (por ejemplo, evite custom.conf) y deben tener permisos establecidos en 0440:

sudo chmod 0440 /etc/sudoers.d/custom_nopasswd

Método 1: Omitir Temporalmente la Solicitud de Contraseña para una Sola Sesión

El indicador -S instruye a sudo para que lea la contraseña desde la entrada estándar (stdin) en lugar del terminal. Esto es principalmente útil en scripts no interactivos donde se canaliza la contraseña de forma programática:

echo "your_password" | sudo -S apt update

Advertencia crítica: Incrustar contraseñas en texto plano en scripts o en el historial del shell es un riesgo de seguridad significativo. Este método es apropiado para pipelines de automatización aislados donde la contraseña se inyecta a través de un gestor de secretos o variable de entorno — no codificada en un archivo de script. Para la automatización desatendida en un servidor, la directiva NOPASSWD descrita a continuación es la solución arquitectónicamente más limpia.

Método 2: Deshabilitar la Solicitud de Contraseña para Todos los Comandos de un Usuario Específico

Este método otorga a un usuario nombrado la capacidad de ejecutar cualquier comando sudo sin contraseña. Úselo con moderación — típicamente para cuentas de servicio dedicadas o usuarios de automatización, no para cuentas de operadores humanos.

Paso 1: Abra el archivo sudoers:

sudo visudo

Paso 2: Agregue la siguiente línea, reemplazando username con el nombre real de la cuenta Linux:

username ALL=(ALL) NOPASSWD: ALL

Paso 3: Guarde y salga. En nano basado en visudo, presione Ctrl+X, luego Y, luego Enter. En vi basado en visudo, escriba :wq.

Lo que significa esta regla, analizada:

CampoValorSignificado
usernameEl usuario objetivoA quién se aplica la regla
ALL (primero)Cualquier hostLa regla se aplica en todas las máquinas (útil para configuraciones de sudoers compartidas)
(ALL)Cualquier usuario objetivoPuede ejecutar comandos como cualquier usuario, incluido root
NOPASSWD: ALLTodos los comandos, sin contraseñaNo se requiere autenticación para ningún comando

Método 3: Deshabilitar la Solicitud de Contraseña Solo para Comandos Específicos

Este es el enfoque más consciente de la seguridad cuando la ejecución sin contraseña es genuinamente necesaria. En lugar de otorgar NOPASSWD: ALL de forma general, se limita la exención a una ruta binaria precisa.

Paso 1: Abra el archivo sudoers:

sudo visudo

Paso 2: Localice la sección Defaults y agregue una regla específica debajo de ella:

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

Reemplace username con la cuenta real y especifique la ruta completa y absoluta a cada comando. Puede separar múltiples comandos con comas en una sola línea.

Paso 3: Guarde y salga.

Por qué importan las rutas absolutas: sudo resuelve los comandos contra las reglas de sudoers usando la ruta binaria completa. Si especifica apt-get sin una ruta, la regla puede no coincidir, o peor aún, un binario malicioso colocado antes en $PATH podría ser invocado en su lugar. Siempre verifique las rutas con which:

which systemctl
# /usr/bin/systemctl

Caso de uso real: Un pipeline de despliegue que se ejecuta como usuario deploy necesita reiniciar los servicios de aplicación después de cada lanzamiento. Otorgar NOPASSWD solo para systemctl restart myapp significa que el pipeline puede funcionar de forma autónoma sin exponer acceso root completo.

Método 4: Extender el Tiempo de Espera de la Marca de Tiempo de Credencial

En lugar de eliminar la autenticación por completo, puede extender el tiempo que sudo recuerda una autenticación exitosa. Esta es la opción menos invasiva para usuarios interactivos que ejecutan múltiples comandos administrativos en una sola sesión de trabajo.

Paso 1: Abra el archivo sudoers:

sudo visudo

Paso 2: Modifique o agregue la directiva timestamp_timeout bajo el bloque Defaults:

Defaults    timestamp_timeout=60

Esto establece la caché de credenciales en 60 minutos. El usuario se autentica una vez, y los comandos sudo posteriores dentro de esa ventana no requieren contraseña.

Valores especiales:

ValorComportamiento
0Contraseña requerida en cada invocación individual de sudo
-1La credencial nunca expira (efectivamente sin contraseña después de la primera autenticación)
15Predeterminado en la mayoría de las distribuciones
60Razonable para sesiones de administración activas

Paso 3: Guarde y salga.

Para aplicar una anulación de tiempo de espera solo para un usuario específico en lugar de a nivel del sistema:

Defaults:username    timestamp_timeout=60

Método 5: Usar un Archivo Drop-in de sudoers (Mejor Práctica en Producción)

En lugar de editar /etc/sudoers directamente, cree un archivo drop-in con alcance limitado. Este enfoque es idempotente, auditable y seguro para gestionar mediante herramientas de gestión de configuración como Ansible, Puppet o Chef.

sudo visudo -f /etc/sudoers.d/deploy_nopasswd

Dentro del archivo:

# Allow the deploy user to restart services without a password
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

Establezca los permisos correctos:

sudo chmod 0440 /etc/sudoers.d/deploy_nopasswd

Verifique que la configuración de sudoers sea válida en todos los archivos:

sudo visudo -c
# sudoers file: /etc/sudoers, parsed OK
# sudoers file: /etc/sudoers.d/deploy_nopasswd, parsed OK

Comparación de Todos los Métodos

MétodoAlcanceRequiere Autenticación InicialRiesgo de SeguridadMejor Caso de Uso
sudo -S con stdinComando únicoSí (canalizado)Alto si está codificadoCI/CD con gestor de secretos
NOPASSWD: ALLTodos los comandos, un usuarioNoMuy AltoCuentas de automatización aisladas
NOPASSWD: /path/cmdSolo comandos específicosNoBajo-MedioPipelines de despliegue, scripts
Extensión de timestamp_timeoutTodos los comandos, limitado en tiempoSí (una vez)BajoSesiones de administración interactivas
Archivo /etc/sudoers.d/ drop-inConfigurableConfigurableDepende de la reglaProducción, servidores gestionados con IaC

Consideraciones de Refuerzo de Seguridad

Deshabilitar las solicitudes de contraseña de sudo introduce una superficie de ataque real. Aplique estas mitigaciones:

  • Audite el uso de sudo: Habilite el registro de sudo agregando Defaults logfile="/var/log/sudo.log" a su configuración de sudoers. Revise este registro regularmente.
  • Restrinja por comando y argumento: NOPASSWD: /usr/bin/systemctl restart nginx es mucho más seguro que NOPASSWD: /usr/bin/systemctl — este último permite al usuario detener, deshabilitar o enmascarar cualquier servicio.
  • Use cuentas de servicio dedicadas: Nunca aplique NOPASSWD: ALL a la cuenta principal de un operador humano. Cree una cuenta de propósito específico (por ejemplo, deploy, monitor) con una lista blanca de comandos mínima.
  • Combine con autenticación solo por clave SSH: Si se configura sudo sin contraseña en un servidor, asegúrese de que el acceso SSH en sí requiera autenticación basada en clave. Deshabilitar simultáneamente las contraseñas SSH y las contraseñas de sudo en un servidor de acceso público es una configuración incorrecta crítica.
  • Rote y revise: Audite periódicamente /etc/sudoers.d/ en busca de reglas obsoletas vinculadas a cuentas desactivadas o scripts obsoletos.

En Servidores Dedicados donde tiene control total del hardware, estas configuraciones tienen aún más peso — una cuenta comprometida con sudo sin contraseña en una máquina dedicada significa acceso root completo e incontestado sin ningún tipo de contención a nivel de hipervisor.

Verificación de su Configuración

Después de realizar cambios, siempre pruebe la regla como el usuario objetivo sin cambiar a root:

# Switch to the target user
su - username

# Test a specific command
sudo /usr/bin/systemctl restart nginx

# Verify sudo privileges without executing a command
sudo -l

sudo -l lista todos los comandos que el usuario actual tiene permitido ejecutar, incluyendo cuáles son NOPASSWD. Esta es su principal herramienta de depuración cuando una regla no se comporta como se esperaba.

Para verificar las reglas efectivas de sudoers para un usuario específico desde una sesión root:

sudo -l -U username

Configuración Práctica para un Pipeline de Despliegue de Servidor Web

A continuación se presenta una configuración completa y lista para producción para un usuario de despliegue en un servidor web — el tipo de configuración que usaría en un VPS con cPanel o una pila LEMP/LAMP personalizada:

1. Cree el usuario de despliegue:

sudo useradd -m -s /bin/bash deploy
sudo passwd deploy

2. Cree la regla drop-in de sudoers:

sudo visudo -f /etc/sudoers.d/deploy
# Deployment pipeline: passwordless service management only
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php8.2-fpm
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/chown -R www-data /var/www/html

3. Establezca permisos y valide:

sudo chmod 0440 /etc/sudoers.d/deploy
sudo visudo -c

4. Pruebe como el usuario deploy:

su - deploy
sudo systemctl restart nginx
# Should execute without a password prompt

Este patrón es directamente aplicable a cualquier flujo de trabajo de despliegue automatizado, ya sea que esté usando GitHub Actions, GitLab CI, Jenkins o un script de shell personalizado activado a través de SSH.

Si su infraestructura incluye Paneles de Control VPS gestionados, verifique que el usuario del sistema propio del panel (por ejemplo, cpanel, plesk) no se vea afectado inadvertidamente por las reglas amplias de NOPASSWD: ALL que agregue a sudoers.

Lista de Verificación de Puntos Clave

Antes de aplicar cualquier configuración de sudo sin contraseña, revise esta matriz de decisión:

  • ¿Es esta una cuenta humana o una cuenta de servicio? Las cuentas de servicio pueden tolerar NOPASSWD; las cuentas humanas deberían usar la extensión de timestamp_timeout en su lugar.
  • ¿Puede limitar la exención a comandos específicos? Siempre prefiera NOPASSWD: /path/to/command sobre NOPASSWD: ALL.
  • ¿Está el acceso SSH asegurado con autenticación basada en clave? Si no es así, corrija eso primero antes de relajar los requisitos de sudo.
  • ¿Se está registrando la actividad de sudo? Agregue Defaults logfile="/var/log/sudo.log" si aún no está presente.
  • ¿Está usando archivos drop-in en /etc/sudoers.d/? Prefiera esto sobre editar /etc/sudoers directamente para facilitar el mantenimiento.
  • ¿Ha ejecutado sudo visudo -c para validar la sintaxis? Nunca omita este paso — un error de sintaxis en sudoers puede bloquearle completamente el acceso administrativo.
  • ¿Tiene un método de recuperación fuera de banda? En instancias VPS en la nube, asegúrese de tener acceso a la consola o una instantánea de recuperación antes de realizar cambios en sudoers.

Preguntas Frecuentes

¿Cuál es la forma más segura de permitir sudo sin contraseña para un script específico?

Cree un script envolvente con una ruta absoluta fija, colóquelo en un directorio del sistema (por ejemplo, /usr/local/bin/deploy-restart.sh), y otorgue NOPASSWD solo para esa ruta específica en /etc/sudoers.d/. Esto evita la inyección de argumentos y limita el radio de impacto si la cuenta se ve comprometida.

¿Deshabilitar la solicitud de contraseña de sudo afectará todas las sesiones de terminal inmediatamente?

Sí. Los cambios en /etc/sudoers o en los archivos de /etc/sudoers.d/ surten efecto inmediatamente para todas las nuevas invocaciones de sudo. No es necesario reiniciar ningún servicio ni cerrar sesión. Las credenciales en caché existentes no se ven afectadas hasta que expiren.

¿Qué sucede si cometo un error de sintaxis en el archivo sudoers?

Si usó visudo, detectará el error antes de guardar y le pedirá que lo corrija. Si de alguna manera omitió visudo e introdujo un error de sintaxis, sudo se negará a ejecutarse por completo. La recuperación requiere arrancar en modo de usuario único o usar acceso a consola fuera de banda para corregir el archivo.

¿Puedo aplicar NOPASSWD a un grupo en lugar de a un usuario individual?

Sí. Use la sintaxis %groupname: %developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx. Esto aplica la regla a todos los miembros del grupo developers, facilitando la gestión del acceso a escala sin editar sudoers para cada nuevo miembro del equipo.

¿Se comporta timestamp_timeout=-1 igual que NOPASSWD: ALL?

No. timestamp_timeout=-1 significa que la credencial nunca expira después de la primera autenticación exitosa — pero esa primera autenticación aún requiere una contraseña. NOPASSWD: ALL omite la autenticación por completo, incluyendo la primera invocación. El primero es significativamente más seguro para usuarios interactivos.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar