Hardening del servidor
Un sshd por defecto "funciona", pero en Internet recibe fuerza bruta constante. El hardening reduce superficie: menos autenticacion debil, menos usuarios, menos protocolos viejos y mejor observabilidad.
Trabaja siempre con dos sesiones abiertas al cambiar sshd_config: si te bloqueas, la sesion vieja sigue viva.
Archivo principal
sudo nano /etc/ssh/sshd_config
# o drop-ins en /etc/ssh/sshd_config.d/*.conf
sudo sshd -t && sudo systemctl reload sshdsshd -t valida sintaxis antes de recargar.
Ajustes minimos recomendados
Port 22
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
AllowTcpForwarding yes
PermitTunnel no
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deployNotas:
- Desactiva root por SSH: entra como usuario normal y usa
sudo. - Desactiva passwords solo cuando las claves ya funcionan.
AllowUsers/AllowGroupslimitan quien puede entrar.- Cambiar el puerto (p. ej. 2222) reduce ruido, no es seguridad real por si solo.
authorized_keys con restricciones
En ~/.ssh/authorized_keys puedes restringir una clave:
from="203.0.113.0/24",no-agent-forwarding,no-port-forwarding ssh-ed25519 AAAA... deploy-ciOpciones utiles:
| Opcion | Efecto |
|---|---|
from="IP/CIDR" | Solo desde esas redes |
command="..." | Fuerza un comando (deploy keys) |
no-port-forwarding | Bloquea tunnels |
no-agent-forwarding | Bloquea -A |
restrict | Paquete restrictivo moderno |
Ejemplo deploy solo rsync:
command="rrsync -wo /var/www/app",restrict ssh-ed25519 AAAA... rsync-deployfail2ban (opcional pero util)
Banear IPs tras intentos fallidos:
sudo apt install fail2ban
sudo systemctl enable --now fail2banJail basico SSH en /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = ssh
maxretry = 5
bantime = 1hFirewall
Solo el puerto SSH (y 80/443 si aplica) desde Internet:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableEn cloud, replica reglas en el Security Group / NSG.
Actualizaciones y banner
sudo apt update && sudo apt upgradeBanner legal opcional (Banner /etc/issue.net) no anade seguridad tecnica; sirve de aviso.
Checklist rapido
- Root login desactivado.
- Solo pubkey.
- Usuarios limitados (
AllowUsers). sshd -t+ reload sin cortar tu sesion de backup.- Firewall activo.
- Claves con passphrase en clientes admin.
- Logs revisables (
/var/log/auth.logojournalctl -u ssh).
Errores habituales
- Desactivar
PasswordAuthenticationantes de probar la clave -> lockout. - Editar
sshd_configy reiniciar en vez dereloadcon sintaxis rota. - Dejar
PermitRootLogin prohibit-passwordpensando que root queda bloqueado del todo (sigue con clave). - Abrir SSH a
0.0.0.0/0en cloud y confiar solo en "puerto raro".
Buenas practicas
- Bastion unico expuesto; privados solo en red interna / VPN.
- Cuentas personales nominativas, no
ubuntucompartido en prod. - Rotacion de claves de CI y revocacion inmediata al offboarding.
- Alertas ante picos de
Failed password/Invalid user.
Ejercicio
- En una VM de laboratorio, desactiva login root y passwords.
- Restringe
AllowUsersa tu usuario. - Anade una clave de CI con
restrictycommand=.... - Verifica con una segunda sesion antes de cerrar la primera.
Siguiente paso
Continua con Troubleshooting.
