Saltar al contenido

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):

ventana terminal
# (Para el profesor)
sudo apt install -y nginx ufw fail2ban
sudo ufw disable
sudo systemctl stop fail2ban
sudo sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo systemctl reload sshd

Verifica en qué estado está el servidor ahora mismo:

ventana terminal
# ¿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"

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"
ventana terminal
# Deniega todo el tráfico entrante por defecto
sudo ufw default deny incoming
# Permite todo el tráfico saliente (para que el servidor pueda hacer peticiones)
sudo ufw default allow outgoing

Tarea 2 — Permitir los puertos necesarios ANTES de activar

Sección titulada “Tarea 2 — Permitir los puertos necesarios ANTES de activar"
ventana terminal
# 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 HTTPS
sudo ufw allow 443/tcp
ventana terminal
sudo ufw enable
# Escribe 'y' cuando pregunte si continuar
ventana terminal
# Verifica el estado completo del firewall
sudo ufw status verbose

Debes ver:

Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere

Tarea 4 — Probar que UFW bloquea puertos no permitidos

Sección titulada “Tarea 4 — Probar que UFW bloquea puertos no permitidos"
ventana terminal
# Lista los puertos en escucha en el servidor
sudo 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"

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.

ventana terminal
sudo apt install -y fail2ban
# Inicia el servicio
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
# Verifica que está corriendo
systemctl status fail2ban

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:

ventana terminal
sudo nano /etc/fail2ban/jail.local

Escribe:

[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 banear
maxretry = 3
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log

Aplica la configuración:

ventana terminal
sudo systemctl restart fail2ban
# Verifica el estado de la jail SSH
sudo fail2ban-client status sshd

Debe 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):

ventana terminal
# 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 responder

Después comprueba en la VM:

ventana terminal
# ¿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:

ventana terminal
sudo fail2ban-client set sshd unbanip TU_IP

Tarea 1 — Desactivar el login de root por SSH

Sección titulada “Tarea 1 — Desactivar el login de root por SSH"
ventana terminal
sudo nano /etc/ssh/sshd_config

Busca estas líneas y asegúrate de que tienen estos valores:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ventana terminal
# Aplica los cambios
sudo 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 again

ventana terminal
sudo apt install -y lynis
# La auditoría completa tarda unos minutos
sudo lynis audit system

Lynis puntúa la seguridad del servidor. Busca la línea:

Hardening index : XX [############ ]
ventana terminal
# Las advertencias de lynis (las más importantes)
sudo grep "warning\|suggestion" /var/log/lynis.log | head -20

Lynis 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:

ventana terminal
# 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

ventana terminal
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