Configuraciones de Ciberseguridad Esenciales para Servidores Apache
Apache HTTP Server es, desde hace más de dos décadas, una de las piezas fundamentales en la infraestructura de Internet. Su código abierto, flexibilidad y amplia comunidad de soporte lo han convertido en una opción preferida para administradores de sistemas y desarrolladores en entornos empresariales, educativos y personales. Sin embargo, precisamente por su popularidad, Apache también se ha transformado en un blanco frecuente para atacantes que buscan explotar configuraciones débiles, intrusión en sistemas ajenos o errores comunes de implementación.
Aunque la instalación por defecto de Apache es funcional, no necesariamente está pensada para entornos de producción seguros. En muchos casos, los ajustes iniciales priorizan la compatibilidad o la facilidad de uso sobre la seguridad. Por ello, resulta fundamental realizar una serie de configuraciones adicionales que fortalezcan el servidor y reduzcan la superficie de ataque.
Los riesgos asociados a una mala configuración pueden ir desde la exposición involuntaria de información sensible (como versiones del software o rutas internas) hasta ataques más complejos, como inyecciones SQL, secuestro de sesiones, fuerza bruta o denegación de servicio. Estos incidentes no solo afectan la disponibilidad del servicio, sino también la reputación y la confianza de los usuarios.
Este artículo presenta una serie de prácticas recomendadas y ajustes clave que permiten mejorar la seguridad de Apache sin comprometer su rendimiento. Se incluyen ejemplos de configuración concretos, explicaciones técnicas y las ventajas que cada medida aporta. El objetivo es ofrecer una guía práctica que ayude a los administradores a reforzar la protección de sus servidores y a adoptar un enfoque preventivo ante posibles amenazas.

Antes de comenzar todas estas configuraciones adicionales, una buena práctica es realizar una copia de seguridad de vuestro entorno con el siguiente comando:
sudo cp -a /etc/apache2 /etc/apache2.bak-$(date +%F)

Ocultar la versión de Apache y del Sistema Operativo
Revelar la versión del servidor o del sistema operativo es uno de los errores más comunes. Esta información puede ser aprovechada por atacantes para buscar vulnerabilidades específicas.
Editamos el fichero de seguridad (Debian/Ubuntu):
sudo nano /etc/apache2/conf-available/security.conf
Añadimos o modificamos:
ServerTokens ProdServerSignature Off

Aplicamos y probamos:
sudo a2enconf security # Debian/Ubuntu (si no está habilitado)
sudo systemctl reload apache2

Comprobamos. Lo podéis hacer con el comando "curl" de la siguiente forma:
curl -I https://midominio.com
- ORIGINAL:

- MODIFICADO:

Por aclararlo, ServerTokens Prod hace que el header Server muestre sólo Apache (sin versión). No elimina completamente headers agregados por proxies/CDN.
Si usas módulos que añaden información (ej. PHP-FPM), revisa su configuración.
HTTPS con TLS (Let's Encrypt + Configuración TLS segura)
En este punto, buscamos instalar certificado válido, forzar HTTPS y usar parámetros TLS seguros (deshabilitar SSLv3/TLS1.0/TLS1.1, ciphers fuertes, HSTS, OCSP stapling).
Instalación de Certificado (Let’s Encrypt / Certbot)
sudo apt updatesudo apt install certbot python3-certbot-apache
sudo certbot --apache -d ejemplo.com -d www.ejemplo.com
Forzar redirección HTTP a HTTPS
En tu "VirtualHost :80":
nano /etc/apache2/sites-available/000-default.conf
Cambiamos la sección con estos parámetros:
ServerName ejemplo.com
ServerAlias www.ejemplo.com
Redirect permanent / https://ejemplo.com/

Configuración TLS recomendada
Editar el SSL conf del virtual host (ej. /etc/apache2/sites-available/default-ssl.conf o /etc/apache2/mods-available/ssl.conf):
# Deshabilitar protocolos débiles
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
# Ciphers (ejemplo intermedio compatible)
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:\
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:\
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder onSSLCompression offSSLSessionTickets off
# HSTS (forzar HTTPS en navegadores)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS
# OCSP staplingSSLUseStapling on
SSLStaplingCache shmcb:/var/run/ocsp(128000)
Con todas estas modificaciones, aplicamos y probamos:
sudo a2enmod ssl headerssudo systemctl reload apache2
Comprobamos puerto 443 con "openssl":
openssl s_client -connect ejemplo.com:443 -servername ejemplo.com
Probar forzar TLS1.2/1.3:
openssl s_client -connect ejemplo.com:443 -tls1_2
Deshabilitar listado de directorios
Evitaremos que Apache muestre el contenido de carpetas cuando no existe index.html o index.php.
En la configuración del sitio o en apache2.conf, modificamos la sección de la siguiente forma:
sudo nano /etc/apache2/apache2.conf
Busca la sección "Directory /var/www/" y modifica estos parámetros:
Options -Indexes
AllowOverride None
Require all granted

Si necesitas .htaccess para algo, usa AllowOverride Limit en lugar de None y evita Indexes.
Aplicamos y probamos:
sudo systemctl reload apache2
# Intenta abrir http://ejemplo.com/carpeta-sin-index/
# Debe devolver 403 Forbidden o la página de error, no listado
Adicionalmente podemos también:
Restringir acceso a directorios sensibles
Proteger rutas administrativas y de configuración (paneles, /admin, /config) por IP o autenticación.
Podemos modificar la sección "Directory /var/www/html/admin":
Require ip 192.168.1.0/24 203.0.113.4
Autenticación básica
- Podemos crear un archivo de contraseñas para los accesos:
sudo apt install apache2-utilssudo htpasswd -c /etc/apache2/.htpasswd usuario - Lo configuraríamos también desde la sección "Directory":
AuthType Basic AuthName "Área Administrativa" AuthUserFile /etc/apache2/.htpasswd Require valid-user - Aplicar y probar:
sudo systemctl reload apache2 # Acceder a /admin y verificar que solicita credenciales o restringe por IP
- Para producción, es preferible una autenticación basada en TLS client certs o integración con SSO/LDAP cuando sea posible (más seguro que Basic si no hay MFA).
- No uses Basic sin TLS (podrías exponer las credenciales).
Mitigación de Fuerza Bruta y DoS (mod_evasive y fail2ban)
Opción A: mod_evasive (Apache module)
Instalación
sudo apt install libapache2-mod-evasive
Configuramos (ej. /etc/apache2/mods-available/evasive.conf o /etc/apache2/mods-available/mod-evasive.conf):
Sección "IfModule mod_evasive20.c":
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify admin@ejemplo.com
DOSLogDir /var/log/mod_evasive
Creamos directorio de logs y reiniciamos:
sudo mkdir /var/log/mod_evasivesudo systemctl restart apache2
- DOSPageCount es un contador de peticiones por página, deberéis ajustar según la carga.
- mod_evasive es simple y útil para ataques básicos. Para DoS a gran escala conviene WAF/IPS o soluciones a nivel de red/CDN.
Opción B: fail2ban (protección basada en logs)
Instalación
sudo apt install fail2ban
Crear filtro y jail para Apache (ejemplo /etc/fail2ban/jail.d/apache.local):
[apache-auth]enabled = trueport = http,https
filter = apache-authlogpath = /var/log/apache2/*error.logmaxretry = 3
bantime = 3600
Fail2ban incluye filtros para apache-auth y apache-badbots, o crea filtros personalizados en /etc/fail2ban/filter.d/.
- Fail2ban es efectivo para intentos de fuerza bruta en autenticación HTTP/SSH.
- Ajustar logpath según sistema y volumen de logs.
Configuraciones esenciales de Apache para blindar tu servidor web
Como podéis observar, la seguridad en Apache no depende únicamente del software, sino de una configuración responsable y del mantenimiento continuo. Ajustes como la ocultación de versiones, el uso de TLS, la restricción de accesos o la implementación de un WAF marcan una diferencia importante en la resiliencia del entorno.
Complementar estas medidas con actualizaciones regulares, revisiones de logs, entornos de alta disponibilidad con HAProxy con ModSecurity y políticas de seguridad claras permite mantener un servidor Apache estable, confiable y preparado frente a las amenazas más comunes.
Fin del Artículo. ¡Cuéntanos algo en los Comentarios!



