En entornos de producción, deshabilitar el acceso remoto del usuario root
es una práctica recomendada para reforzar la seguridad del sistema. Limitar este acceso previene intentos de fuerza bruta sobre la cuenta más privilegiada del sistema, obligando a los administradores a autenticarse con usuarios con menos privilegios y escalar posteriormente si es necesario mediante sudo
.
En este artículo veremos un script Bash que automatiza este proceso para distintas distribuciones Linux, haciendo una copia de seguridad del archivo de configuración y aplicando los cambios necesarios según el sistema.
El Script
#!/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
# Archivo de configuración SSH
SSHD_CONFIG="/etc/ssh/sshd_config"
# Crear copia de seguridad
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%F_%T)"
# Deshabilitar root login por cualquier método
sed -i '/^#*PermitRootLogin/s/.*/PermitRootLogin no/' "$SSHD_CONFIG"
# Reiniciar SSH según la distribución
if [[ "$DISTRO" == "debian" || "$DISTRO" == "ubuntu" ]]; then
systemctl restart ssh
elif [[ "$DISTRO" == "centos" || "$DISTRO" == "rhel" || "$DISTRO" == "rocky" ]]; then
systemctl restart sshd
else
echo "Distribución no soportada: $DISTRO"
exit 1
fi
echo "Acceso root deshabilitado en SSH (por contraseña y clave pública)."
Explicación del Script
1. Detección de la distribución
El script utiliza /etc/os-release
para obtener el identificador del sistema operativo. Esto permite determinar si el sistema es Debian, Ubuntu, CentOS, RHEL o Rocky Linux, y aplicar el reinicio adecuado del servicio SSH.
. /etc/os-release
DISTRO=$ID
2. Copia de seguridad del archivo de configuración
Antes de modificar /etc/ssh/sshd_config
, el script realiza una copia de seguridad con fecha y hora en el mismo directorio. Esto permite restaurar la configuración original si ocurre algún error.
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%F_%T)"
3. Modificación segura del archivo
Se usa sed
para buscar la línea PermitRootLogin
(comentada o no) y reemplazarla por PermitRootLogin no
, lo cual bloquea el acceso del usuario root
tanto por contraseña como por clave pública.
sed -i '/^#*PermitRootLogin/s/.*/PermitRootLogin no/' "$SSHD_CONFIG"
4. Reinicio del servicio SSH
El script determina el nombre del servicio SSH dependiendo de la distribución:
- En Debian/Ubuntu se usa
systemctl restart ssh
. - En CentOS/RHEL/Rocky se usa
systemctl restart sshd
.
Esto aplica los cambios de configuración sin necesidad de reiniciar el sistema.
Resultado
Una vez ejecutado el script, cualquier intento de conexión SSH con el usuario root
fallará, tanto si se intenta usar contraseña como clave pública:
ssh root@servidor
# Access denied
Recomendaciones adicionales
- Asegúrate de tener otro usuario con acceso SSH y permisos
sudo
antes de ejecutar este script. - Si el servidor está en producción, realiza una prueba en entorno de desarrollo o máquina virtual primero.
- Verifica el acceso remoto con el nuevo usuario antes de cerrar sesión.
Compartir: