Exponer un servidor Linux a Internet sin configuración de seguridad activa no es una cuestión de si será atacado, sino de cuándo. Los bots de escaneo masivo encuentran puertos abiertos en menos de 10 minutos tras el aprovisionamiento. Este artículo entrega controles concretos, aplicables en menos de una hora, que eliminan la mayoría de los vectores de ataque comunes.
SSH: el primer vector a endurecer
# /etc/ssh/sshd_config
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers tu_usuario
# Validar y recargar sin cortar sesión
sshd -t
systemctl reload sshd
Trade-off importante: cambiar el puerto no es seguridad real, es reducción de ruido en logs. El valor real está en deshabilitar contraseñas y root.
Firewall: principio de mínimo privilegio
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw enable
ufw status verbose
¿Qué no abrir? Nunca expongas directamente: MySQL/MariaDB (3306), Redis (6379), PostgreSQL (5432). Si necesitas acceso externo, usa un túnel SSH o VPN.
Fail2ban: bloqueo automático de fuerza bruta
apt install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
En /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
Actualizaciones: automatiza lo que no requiere criterio
apt install unattended-upgrades -y
dpkg-reconfigure --priority=low unattended-upgrades
Automatiza security updates solamente, no upgrades completos. Los upgrades de versión mayor pueden romper dependencias y requieren revisión manual.
Checklist de verificación final
- SSH no acepta contraseñas:
grep PasswordAuthentication /etc/ssh/sshd_config - Root no puede conectarse por SSH
- ufw activo con política deny por defecto:
ufw status - Solo puertos necesarios abiertos:
ss -tlnp - fail2ban activo y monitoreando SSH:
fail2ban-client status - Actualizaciones de seguridad automatizadas
- Usuario no-root funcional con acceso por llave
- Sin servicios innecesarios corriendo