Práctica 7 — Seguridad y Cortafuegos
Paso 0 — Estado inicial (servidor inseguro)
Sección titulada “Paso 0 — Estado inicial (servidor inseguro)"El servidor empieza así (el profesor lo establece):
# (Para el profesor)sudo apt install -y nginx ufw fail2bansudo ufw disablesudo systemctl stop fail2bansudo sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_configsudo sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_configsudo systemctl reload sshdVerifica en qué estado está el servidor ahora mismo:
# ¿El firewall está activo?sudo ufw status# Esperado: Status: inactive
# ¿fail2ban está corriendo?systemctl is-active fail2ban# Esperado: inactive
# ¿Se permite el login de root por SSH?grep "PermitRootLogin" /etc/ssh/sshd_config# Esperado: PermitRootLogin yes (inseguro)
# ¿Se acepta autenticación por contraseña?grep "PasswordAuthentication" /etc/ssh/sshd_config# Esperado: PasswordAuthentication yes (inseguro)Tu objetivo: pasar de este estado inseguro a un servidor correctamente protegido.
Ejercicio 7.1 — Configurar el firewall con UFW
Sección titulada “Ejercicio 7.1 — Configurar el firewall con UFW"Contexto
Sección titulada “Contexto"UFW (Uncomplicated Firewall) es la interfaz simplificada de iptables en Ubuntu. Por defecto, un servidor nuevo no tiene firewall activo — cualquier puerto expuesto es accesible desde internet.
Tarea 1 — Política por defecto: denegar todo
Sección titulada “Tarea 1 — Política por defecto: denegar todo"# Deniega todo el tráfico entrante por defectosudo ufw default deny incoming
# Permite todo el tráfico saliente (para que el servidor pueda hacer peticiones)sudo ufw default allow outgoingTarea 2 — Permitir los puertos necesarios ANTES de activar
Sección titulada “Tarea 2 — Permitir los puertos necesarios ANTES de activar"# PRIMERO: permite SSH (si lo pierdes, queda sin conexión)sudo ufw allow ssh# O de forma equivalente:sudo ufw allow 22/tcp
# Permite HTTP (para que el servidor web funcione)sudo ufw allow 80/tcp
# Permite HTTPSsudo ufw allow 443/tcpTarea 3 — Activar UFW
Sección titulada “Tarea 3 — Activar UFW"sudo ufw enable# Escribe 'y' cuando pregunte si continuar# Verifica el estado completo del firewallsudo ufw status verboseDebes ver:
Status: activeDefault: deny (incoming), allow (outgoing), disabled (routed)To Action From-- ------ ----22/tcp ALLOW IN Anywhere80/tcp ALLOW IN Anywhere443/tcp ALLOW IN AnywhereTarea 4 — Probar que UFW bloquea puertos no permitidos
Sección titulada “Tarea 4 — Probar que UFW bloquea puertos no permitidos"# Lista los puertos en escucha en el servidorsudo ss -tlnp
# Intenta conectar a un puerto no permitido (por ejemplo, el 8080)# Desde tu ordenador (fuera de la VM):nc -zv 192.168.56.X 8080# Debe dar timeout o "Connection refused"Ejercicio 7.2 — Proteger SSH con fail2ban
Sección titulada “Ejercicio 7.2 — Proteger SSH con fail2ban"Contexto
Sección titulada “Contexto"fail2ban monitoriza los logs del sistema y bloquea automáticamente las IPs que realizan demasiados intentos fallidos de autenticación. Es la defensa estándar contra ataques de fuerza bruta.
Tarea 1 — Instalar y activar fail2ban
Sección titulada “Tarea 1 — Instalar y activar fail2ban"sudo apt install -y fail2ban
# Inicia el serviciosudo systemctl start fail2bansudo systemctl enable fail2ban
# Verifica que está corriendosystemctl status fail2banTarea 2 — Configurar la jail de SSH
Sección titulada “Tarea 2 — Configurar la jail de SSH"fail2ban usa “jails” (celdas) para definir qué monitorizan y qué IP bloquear. La configuración principal está en /etc/fail2ban/jail.conf pero no debes editarla directamente — se sobreescribe al actualizar. Usa un archivo local:
sudo nano /etc/fail2ban/jail.localEscribe:
[DEFAULT]# tiempo de baneo en segundos (1 hora = 3600)bantime = 3600# ventana de tiempo para contar intentos (10 minutos)findtime = 600# número de intentos fallidos antes de banearmaxretry = 3
[sshd]enabled = trueport = sshlogpath = /var/log/auth.logAplica la configuración:
sudo systemctl restart fail2ban
# Verifica el estado de la jail SSHsudo fail2ban-client status sshdDebe mostrar que la jail sshd está activa con 0 IPs baneadas (a menos que alguien ya haya intentado entrar).
Tarea 3 — Simular un ataque para ver fail2ban en acción
Sección titulada “Tarea 3 — Simular un ataque para ver fail2ban en acción"Desde un terminal diferente en tu ordenador (no en la VM):
# Intenta conectarte con una contraseña incorrecta 4 veces seguidas# (cambia la IP a la de tu VM)ssh -o ConnectTimeout=5 usuario_falso@192.168.56.X# Escribe cualquier contraseña incorrecta y repite hasta que deje de responderDespués comprueba en la VM:
# ¿Hay IPs baneadas?sudo fail2ban-client status sshd
# ¿Aparece el baneo en el log?sudo tail -20 /var/log/auth.log | grep "Ban\|Failed"Desbanea tu IP si te baneaste accidentalmente:
sudo fail2ban-client set sshd unbanip TU_IPEjercicio 7.3 — Hardening de SSH
Sección titulada “Ejercicio 7.3 — Hardening de SSH"Tarea 1 — Desactivar el login de root por SSH
Sección titulada “Tarea 1 — Desactivar el login de root por SSH"sudo nano /etc/ssh/sshd_configBusca estas líneas y asegúrate de que tienen estos valores:
PermitRootLogin noPasswordAuthentication noPubkeyAuthentication yes# Aplica los cambiossudo systemctl reload sshd
# Prueba que root no puede conectarse:# (desde tu terminal fuera de la VM)ssh root@192.168.56.X# Debe decir: Permission denied, please try againEjercicio 7.4 — Auditoría con Lynis
Sección titulada “Ejercicio 7.4 — Auditoría con Lynis"Tarea 1 — Instalar y ejecutar Lynis
Sección titulada “Tarea 1 — Instalar y ejecutar Lynis"sudo apt install -y lynis
# La auditoría completa tarda unos minutossudo lynis audit systemLynis puntúa la seguridad del servidor. Busca la línea:
Hardening index : XX [############ ]Tarea 2 — Revisar las sugerencias
Sección titulada “Tarea 2 — Revisar las sugerencias"# Las advertencias de lynis (las más importantes)sudo grep "warning\|suggestion" /var/log/lynis.log | head -20Lynis clasifica los hallazgos en:
- WARNING (amarillo) → problema de seguridad importante, corrígelo
- SUGGESTION (azul) → mejora recomendable pero no crítica
Implementa al menos 2 correcciones de las que sugiera lynis. Dos sugerencias habituales:
# 1. Restringir permisos de /etc/crontab (suele sugerirlo)sudo chmod 600 /etc/crontab
# 2. Configurar umask más restrictivo# Lynis suele pedir umask 027 en lugar del 022 por defecto# Añade al final de /etc/profile:echo "umask 027" | sudo tee -a /etc/profile📤 Bloque de entrega
Sección titulada “📤 Bloque de entrega"echo "=== ENTREGA PRÁCTICA 7 ===" && \echo "" && \echo "--- Firewall UFW ---" && \sudo ufw status verbose && \echo "" && \echo "--- fail2ban SSH ---" && \sudo fail2ban-client status sshd && \echo "" && \echo "--- Config SSH ---" && \grep "PermitRootLogin\|PasswordAuthentication\|PubkeyAuthentication" /etc/ssh/sshd_config && \echo "" && \echo "--- Lynis (hardening index) ---" && \sudo lynis show version && \sudo grep "Hardening index" /var/log/lynis.log | tail -1