Introducción a la Seguridad en Servidores Web
Cuando se trata de configurar un servidor web, la seguridad es uno de los aspectos más importantes a considerar. Un servidor web expuesto a internet puede ser vulnerable a diversos tipos de ataques, como intrusiones, denegación de servicio, robo de información, entre otros. Por lo tanto, es crucial implementar medidas de seguridad sólidas desde el inicio para proteger nuestra infraestructura y los datos que aloja.
- Actualización del sistema operativo y software: Fundamental para corregir vulnerabilidades conocidas y evitar que sean explotadas por atacantes.
- Confguración segura del servidor web: Ajustar permisos de archivos, puertos abiertos y módulos habilitados puede ayudar a reducir la superficie de ataque.
- Gestión de cuentas y permisos: Establecer políticas de contraseñas seguras, limitar el acceso a cuentas privilegiadas y otorgar permisos mínimos a los usuarios para prevenir accesos no autorizados.
- Monitorización y registro de actividad: Configurar un sistema de registro eficaz y monitorizar regularmente los registros puede ayudarnos a detectar y responder a posibles incidentes de seguridad.
- Uso de herramientas de seguridad: Firewalls, IDS y herramientas de escaneo de vulnerabilidades pueden complementar nuestra seguridad.
En este capítulo, nos enfocaremos en la instalación y configuración de UFW(Uncomplicated Firewall) que nos ayudará a establecer reglas de seguridad básica para el servidor web.
UFW

Instalación de UFW
Actualizamos el sistema e instalamos ufw.

Habilitamos UFW
Tal como nos advierte la salilda del comando, corremos el riesgo de que el firewall deniegue nuestra actual conexión ssh, lo que nos dejaría sin posibilidad de acceder remotamene al equipo.
Antes de habilitar UFW debemos asegurarnos de que el puerto 22 esté abierto.
Y ahora si, lo habilitamos.
Y podemos comprobar que el puerto 22 está escuchando mi conexión.

Reglas mínimas
Es el momento de configura unas reglas mínimas. Permitiré el acceso remoto ssh, que ya configuramos para que solo permita conectarse con mi clave privada, permitiremos el 80 para HTTP y 443 para HTTPS.
También necesito el sevicio SFTP para transmitir archivos pero usa el mismo puerto de SSH.
Con netstat podemos ver los puertos abiertos actualmente.

Verificación del estado
Estado general de firewall
Reglas específicas

Fail2ban
Introducción a Fail2ban
Fail2ban es una herramienta que actúa como sistema de detección y prevención de intrusiones protegiendo nuestro servidor contra:
- Ataques de fuerza bruta contra SSH.
- Scans maliciosos.
- Intentos de explotación de vulnerabilidades.
Instalación básica

Configuración personalizada
Este paso es importante hacerlo para que cuando se actualice Fail2ban no se sobreescriba nuestra configuración. Creando el fichero jail.local, fail2ban tendrá preferencia por esta configuración en lugar de jail.conf
- Tuve problemas porque no tuve en cuenta que Debian 12 no guarda los log de ssh como espera fail2ban que sería en /var/log/auth.log sino que Debian usa systemd-journald como sistema de logs por defecto. Esto provocaba errores y hay que configurarlo especialmente tal como mostraré en las siguientes secciones.
Aquí lo personalizamos para SSH, podemos crear nuevas Jails para otros servicios como apache2.
Habilitar y arrancar el servicio

Verificar que la jail sshd está activa


Protección para Apache
Si nuestro servidor web tiene un sitio público, Apache está constantemente recibiendo tráfico como:
- Bots maliciosos.
- Scanners automáticos.
- Fuerza bruta contra formularios de login.
- Exploits conocidos contra rutas como /phpmyadmin, /wp-login.php, etc.
Aunque de momento estamos en una red local, voy a ir preparándome para estar listo en el momento de migrar a internet.
Crearé tres jails para apache en mi archivo jail.local.
- 🔹 apache-auth
- Detecta múltiples errores de autenticación HTTP.
- Protege paneles admin protegidos por .htaccess, por ejemplo.
- 🔹 apache-noscript
- Detecta intentos de acceder a scripts no permitidos (común en ataques automáticos).
- 🔹 apache-badbots
- Detecta bots que usan User-Agents sospechosos conocidos por comportamiento malicioso.

Monitorización y gestión
- Monitoreo básico de UFW

- Monitoreo básico de Fail2ban

Pruebas de funcionamiento
Tengo una maquina virtual Kali que usaré para intentar loguearme repetidas veces hasta que Fail2ban la bloquee. Con esto comprobaremos que no pueden hacer intentos indefinidos de logeo a mi servidor.


Sobre la protección a Apache2, de momento no voy a hacer más pruebas porque siendo una web estática sin formularios y logins, no tiene sentido probar protecciones a esas características. Sin embargo habría que añadir alguna configuración más a la seguridad básica.
- Eliminar o sustituir página por defecto de Apache

- Configurar Apache para que no muestre info de su versión

- Habilitar esta configuración
sudo a2enconf security.conf
Notas para producción
Cuando migre el servidor web a la nube debería cambiar el puerto 22 por defecto para ssh por otro. Debo recordar que GCP tiene su propio firewal(finalmente acabé contratando con OVHCloud un Servidor Privado Virtual), deberé informarme a fondo de esto pues podría bloquearme sin querer. En entornos Cloud añadir mi IP pública a ignoreip y configurar optimizaciones. De momento no he configurado Apache para generar tráfico cifrado HTTPS
Cierre del capítulo
Resumen rápido
- Implementamos UFW como cortafuegos básico para el servidor.
- Configuramos reglas mínimas de seguridad (SSH, HTTP, HTTPS).
- Verificamos el estado del firewall y puertos abiertos.
- Aprendimos sobre consideraciones clave para entornos de producción.
- Instalamos y configuramos Fail2ban y comprobamos su funcionamiento.
Estado actual del entorno El servidor ahora tiene:
- Firewall básico activado (UFW) con puertos esenciales abiertos.
- Fail2ban instalado y configurado.
- SSH configurado solo con autenticación por clave pública.
- Servicios web (HTTP/HTTPS) accesibles pero protegidos.
¿Y ahora qué? En el próximo capítulo nos enfocaremos en la configuración de apache2.