En entornos de producción o sistemas expuestos a redes públicas, una de las principales medidas de endurecimiento de la seguridad (hardening) consiste en deshabilitar el acceso directo del usuario root
por SSH, así como la autenticación mediante claves públicas para todos los usuarios. Esto reduce significativamente el riesgo de ataques automatizados o accesos no autorizados a cuentas privilegiadas.
Objetivo
Este artículo describe cómo aplicar estas configuraciones de forma automatizada en sistemas basados en Debian, Ubuntu, CentOS, RHEL y Rocky Linux, mediante un script Bash que detecta la distribución y modifica correctamente el archivo de configuración del servicio SSH (sshd_config
).
Script Bash
A continuación, se presenta el script completo:
#!/bin/bash
# Detectar distribución
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO=$ID
else
echo "No se puede detectar la distribución."
exit 1
fi
SSHD_CONFIG="/etc/ssh/sshd_config"
# Copia de seguridad
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%F_%T)"
# Deshabilitar login root (por contraseña y clave pública)
sed -i '/^#*PermitRootLogin/s/.*/PermitRootLogin no/' "$SSHD_CONFIG"
# Deshabilitar autenticación por clave pública para todos
if grep -q "^#*PublicKeyAuthentication" "$SSHD_CONFIG"; then
sed -i '/^#*PublicKeyAuthentication/s/.*/PublicKeyAuthentication no/' "$SSHD_CONFIG"
else
echo "PublicKeyAuthentication no" >> "$SSHD_CONFIG"
fi
# Reiniciar servicio SSH
if [[ "$DISTRO" =~ ^(debian|ubuntu)$ ]]; then
systemctl restart ssh
elif [[ "$DISTRO" =~ ^(centos|rhel|rocky)$ ]]; then
systemctl restart sshd
else
echo "Distribución no soportada: $DISTRO"
exit 1
fi
echo "Login de root y autenticación por clave pública deshabilitados en SSH."
Explicación del Funcionamiento
Sección | Descripción |
---|---|
Detección de la distribución | Se lee el archivo /etc/os-release para identificar si el sistema es Debian/Ubuntu o CentOS/RHEL/Rocky. |
Copia de seguridad | Se guarda una copia del archivo sshd_config antes de realizar modificaciones. |
Modificación del archivo SSH | Se aplican las siguientes reglas de seguridad: - PermitRootLogin no - PublicKeyAuthentication no |
Reinicio del servicio SSH | Se reinicia el servicio adecuado según la distribución. |
Consideraciones de Seguridad
- No aplicar este script en servidores sin usuarios con privilegios sudo previamente configurados, ya que podría bloquear el acceso remoto totalmente.
- Este script no revoca claves ya desplegadas, sólo desactiva su uso desde el servidor.
- Se recomienda automatizar esta tarea mediante Ansible, Puppet o scripts NinjaOne en entornos gestionados.
Resultado Esperado
Al ejecutar el script:
- El acceso SSH con el usuario
root
queda completamente deshabilitado. - Ningún usuario puede autenticarse mediante claves públicas (a menos que se vuelva a habilitar la opción).
- El servicio SSH se reinicia para aplicar los cambios.
Compartir: