¿Por qué hacer hardening?
Un servidor recién creado conectado a internet empieza a recibir intentos de acceso automatizados en menos de 5 minutos. Los bots escanean rangos de IP continuamente buscando contraseñas débiles y configuraciones por defecto.
Este checklist cubre los pasos fundamentales que deberían hacerse en todo servidor Linux en producción.
Nota importante: Los comandos en esta guía son ejemplos. Los paquetes, gestores y rutas pueden variar según el sistema operativo que estés usando. Se muestran ejemplos para Ubuntu/Debian y Rocky Linux/AlmaLinux/RHEL. Adaptá los comandos a tu distribución.
1. Actualizar el sistema
Lo primero siempre es tener el sistema al día con los últimos parches de seguridad.
Ubuntu / Debian:
apt update && apt upgrade -y
apt autoremove -y
Rocky Linux / AlmaLinux / RHEL:
dnf update -y
dnf autoremove -y
2. Crear un usuario con sudo (no trabajar como root)
Trabajar siempre como root es peligroso — cualquier error o exploit tiene acceso total al sistema.
Ubuntu / Debian:
adduser tuusuario
usermod -aG sudo tuusuario
su - tuusuario
sudo whoami # Debería mostrar "root"
Rocky Linux / AlmaLinux / RHEL:
useradd tuusuario
passwd tuusuario
usermod -aG wheel tuusuario
su - tuusuario
sudo whoami # Debería mostrar "root"
En Rocky/RHEL el grupo de privilegios es
wheel, nosudo.
3. Configurar autenticación SSH con claves
Las contraseñas pueden romperse por fuerza bruta. Las claves SSH prácticamente no.
Generar la clave en tu computadora local
(Este comando es igual en todos los sistemas)
ssh-keygen -t ed25519 -C "servidor-produccion"
Copiar la clave al servidor
ssh-copy-id tuusuario@IP_DEL_SERVIDOR
Deshabilitar autenticación por contraseña
Editá /etc/ssh/sshd_config (ruta igual en todas las distros):
PasswordAuthentication no
PermitRootLogin no
Protocol 2
LoginGraceTime 30
MaxAuthTries 3
⚠️ Antes de recargar SSH, verificá en otra terminal que podés entrar con la clave.
Ubuntu / Debian:
sudo systemctl reload ssh
Rocky Linux / AlmaLinux / RHEL:
sudo systemctl reload sshd
4. Configurar el firewall
Ubuntu / Debian — UFW:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
Rocky Linux / AlmaLinux / RHEL — firewalld:
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
Para un servidor web:
Ubuntu:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Rocky Linux:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
5. Instalar Fail2Ban
Fail2Ban monitorea los logs y bloquea IPs que intentan demasiados accesos fallidos.
Ubuntu / Debian:
sudo apt install fail2ban -y
Rocky Linux / AlmaLinux / RHEL:
sudo dnf install epel-release -y
sudo dnf install fail2ban -y
Creá la configuración local:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
# Ver IPs baneadas
sudo fail2ban-client status sshd
6. Cambiar el puerto SSH (opcional pero recomendado)
El puerto 22 recibe miles de intentos automatizados por día. Cambiar a un puerto no estándar reduce el ruido enormemente.
En /etc/ssh/sshd_config:
Port 2222
Actualizá el firewall antes de recargar SSH:
Ubuntu:
sudo ufw allow 2222/tcp
sudo ufw delete allow OpenSSH
sudo systemctl reload ssh
Rocky Linux:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
# En SELinux también hay que habilitar el puerto:
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo systemctl reload sshd
Para conectarte: ssh -p 2222 tuusuario@IP
7. Configurar actualizaciones de seguridad automáticas
Ubuntu / Debian:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
Rocky Linux / AlmaLinux / RHEL:
sudo dnf install dnf-automatic -y
sudo nano /etc/dnf/automatic.conf
# Cambiar: apply_updates = yes
sudo systemctl enable --now dnf-automatic.timer
8. Deshabilitar servicios innecesarios
Menos servicios corriendo = menor superficie de ataque. El comando para ver y deshabilitar servicios es igual en todas las distros modernas:
# Ver qué servicios están activos
systemctl list-units --type=service --state=active
# Deshabilitar servicios no necesarios (ejemplos)
sudo systemctl disable bluetooth
sudo systemctl disable avahi-daemon
9. Monitorear accesos al servidor
Estos comandos son iguales en todas las distribuciones:
# Últimos logins exitosos
last -n 20
# Intentos fallidos
lastb -n 20
Los logs de autenticación varían según la distro:
Ubuntu / Debian:
sudo tail -f /var/log/auth.log
Rocky Linux / AlmaLinux / RHEL:
sudo tail -f /var/log/secure
# O con journald:
sudo journalctl -u sshd -f
Checklist final
- ✅ Sistema actualizado
- ✅ Usuario no-root con sudo/wheel creado
- ✅ Autenticación SSH con claves configurada
- ✅ Login por contraseña deshabilitado
- ✅ Login como root por SSH deshabilitado
- ✅ Firewall activo con política restrictiva
- ✅ Fail2Ban instalado y configurado
- ✅ Actualizaciones de seguridad automáticas activas
- ✅ Servicios innecesarios deshabilitados
Con estos pasos cubrís el 80% de los vectores de ataque más comunes en servidores VPS, independientemente de la distribución que uses.
Si necesitás soporte para configurar y mantener la seguridad de tu servidor, nuestro equipo está disponible 24/7. Consultanos →