El servidor web Apache es uno de los servidores web más populares y ampliamente utilizados para alojar archivos y sitios web . Es fácil de instalar y configurar para satisfacer sus necesidades de alojamiento. Sin embargo, las configuraciones predeterminadas no son seguras para proporcionar la protección necesaria que su sitio necesita.
En esta guía, revisaremos algunas de las recomendaciones y trucos para hardening del servidor Apache que puede implementar para fortalecer la seguridad de su servidor web.
1. Cómo ocultar la versión de Apache y la información del sistema operativo
Por defecto, el servidor web Apache muestra su versión en caso de que navegue en la URL incorrecta de un sitio web. A continuación, hay un ejemplo de una página de error que indica que la página no se encuentra en el sitio. La última línea indica la versión de Apache, el sistema operativo del host, la dirección IP y el puerto en el que está escuchando.

No es nunca una buena idea mostrar información de su servidor web, ya que puede ser un buen regalo para los hackers en su misión de reconocimiento. Para agregar una capa de seguridad y hacer más difícil para los hackers, se recomienda ocultar la información del servidor web.
Para hacer esto, abra el archivo de configuración predeterminado de Apache en distribuciones basadas en Debian.
$ sudo vim /etc/apache2/apache2.conf
Para sistemas basados en RHEL como RHEL, Fedora, CentOS, Rocky y AlmaLinux.
$ sudo vim /etc/httpd/conf/httpd.conf
Agregue las siguientes líneas al final del archivo.
ServerTokens Prod ServerSignature Off
Guarde los cambios y reinicie el servidor web Apache.
$ sudo systemctl restart apache2 [On Debian, Ubuntu and Mint] $ sudo systemctl restart httpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
Ahora recargue el sitio y, esta vez, la información del servidor web no se mostrará.

2. Deshabilitar la Lista de Directorios en Apache
Por defecto, Apache permite la lista de directorios, y los visitantes podrían ver los archivos o directorios que tenga en su Document Root directorio.
Para demostrar esto, crearemos un directorio llamado test.
$ sudo mkdir -p /var/www/html/test
A continuación, nos dirigiremos al directorio y crearemos algunos archivos.
$ cd /var/www/html/test $ sudo touch app.py main.py
Ahora, si accedemos a la URL, http://localhost/test
podremos ver la lista de directorios.

Para deshabilitar la lista de directorios, diríjase al archivo de configuración principal de Apache y busque el atributo ‘ Directory ‘. Establezca el parámetro ‘ Options ‘ en '-Indexes'
como se muestra.
<Directory /opt/apache/htdocs> Options -Indexes </Directory>
Recargue Apache, y esta vez, al visitar la URL, los directorios ya no se mostrarán.

3. Actualizar regularmente Apache
Siempre se recomienda mantener todas tus aplicaciones actualizadas, ya que las últimas aplicaciones vienen con correcciones de errores y parches de seguridad que abordan vulnerabilidades subyacentes presentes en versiones antiguas de software.
Como tal, se recomienda actualizar regularmente tus aplicaciones a sus últimas versiones.
$ sudo apt update && sudo apt upgrade [On Debian, Ubuntu and Mint] $ sudo dnf upgrade [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]

4. Utilizar el cifrado HTTPS en Apache
Apache, por defecto, utiliza el protocolo HTTP que es débil e inseguro y propenso a escuchas. Para mejorar la seguridad de tu sitio y, más aún, mejorar tus clasificaciones de SEO en Google, considera cifrar tu sitio utilizando un certificado SSL.
Al hacerlo, cambia el protocolo HTTP por HTTPS, lo que hace más difícil que alguien intercepte y descifre la comunicación que se envía de ida y vuelta desde el servidor.
Consulta cómo asegurar el servidor web Apache utilizando Let’s Encrypt SSL en Linux.
- Cómo asegurar Apache con el certificado SSL de Let’s Encrypt en RHEL
- Cómo asegurar Apache con el certificado SSL gratuito de Let’s Encrypt en Ubuntu y Debian
5. Habilitar la Seguridad de Transporte Estricto de HTTP (HSTS) para Apache
Además de cifrar tu sitio web con un certificado TLS/SSL, considera implementar el mecanismo de seguridad web HSTS encima de HTTPS.
HTTP Strict Transport Security (HSTS) es un mecanismo de política que protege a los sitios web de ataques de intermediarios y secuestro de cookies. Esto sucede cuando los atacantes degradan el protocolo HTTPS al inseguro protocolo HTTP.
HSTS permite que el servidor web declare estrictamente que los navegadores web solo deben interactuar con él a través de HTTPS, y nunca mediante el protocolo HTTP.
Para habilitar HSTS, asegúrate de que tu sitio web esté ejecutando HTTPS y tenga un certificado TLS/SSL válido.
Luego, habilita el módulo de encabezados para Apache:
$ sudo a2enmod headers
Luego recarga Apache para aplicar los cambios.
$ sudo systemctl restart apache2
A continuación, accede al archivo de configuración del host virtual de tu dominio.
$ sudo vim /etc/apache2/sites-available/mydomain.conf
Luego, agrega esta línea dentro del bloque <VirtualHost *:443>
:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Esto se ve así.
<VirtualHost *:443> # ..... # .... Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
El parámetro max-age instruye a los navegadores web a acceder solo a tu sitio utilizando HTTPS durante el próximo año (31536000 = 1 año).
Finalmente, reinicia Apache para que la política HSTS surta efecto.
$ sudo systemctl restart apache2
6. Habilita HTTP/2 en Apache
En 2015, se lanzó HTTP/2, que es una nueva versión del protocolo HTTP que busca abordar o resolver múltiples problemas que los creadores de HTTP/1.1 no previeron.
Mientras que HTTP/1.1 todavía se utiliza ampliamente, está asociado con problemas de rendimiento relacionados con el uso de múltiples conexiones TCP para procesar múltiples solicitudes desde el navegador, lo que conduce a una sobrecarga de recursos en el lado del cliente, lo que resulta en un rendimiento de red degradado.
A medida que las aplicaciones crecieron en complejidad y funcionalidad, se creó HTTP/2 para resolver las deficiencias de HTTP/1.1, que incluyen encabezados HTTP largos, lentitud en la carga de páginas web y degradación general del rendimiento.
HTTP/2 proporciona más protección y privacidad que su predecesor. Igualmente importante es el rendimiento mejorado a través del uso de flujos de datos multiplexados. Con HTTP/2, una única conexión TCP garantiza una utilización efectiva del ancho de banda, incluso al transmitir múltiples flujos de datos.
Consulta cómo habilitar HTTP/2 en el servidor web Apache usando:
7. Restringir el Acceso a Directorios Sensibles en Apache
Otra medida de seguridad que puedes tomar es limitar el acceso a directorios que puedan contener información sensible, como datos de usuario, registros y archivos de configuración.
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html # Other virtual host settings <Directory /var/www/html/sensitive_directory> Require all denied </Directory> </VirtualHost>
En la configuración anterior, el Require all denied
deniega el acceso a cualquiera que intente acceder a archivos en /directorio_sensible.
Guarda los cambios y sale del archivo. Luego reinicia Apache para que los cambios surtan efecto.
8. Desactiva la Directiva ServerSignature en Apache
La directiva ServerSignature en el archivo de configuración de Apache agrega un pie de página a los documentos generados por el servidor que contienen información sobre la configuración de tu servidor web, como la versión y el sistema operativo en el que se está ejecutando. Exponer detalles cruciales sobre tu servidor web a actores malintencionados aumentará significativamente las posibilidades de un ataque.
Para evitar la exposición de esta información, necesitas desactivar esta directiva en el archivo de configuración de Apache:
ServerSignature Off
Guarda los cambios y vuelve a reiniciar Apache para que los cambios surtan efecto.
$ sudo systemctl restart apache2
9. Configura la Directiva ‘ServerTokens’ a ‘Prod’
La directiva ‘ServerTokens‘ controla qué información envía el servidor, incluida la versión de Apache (versión principal y secundaria), el sistema operativo y el tipo de servidor web que se está ejecutando.
La cantidad mínima de información que desearías exponer al público es que el servidor web es Apache. Cualquier otra cosa solo expondría tu servidor a posibles ataques. Por lo tanto, se recomienda configurar la directiva ‘ServerTokens‘ en el archivo de configuración de Apache a ‘prod‘.
ServerTokens Off
Como siempre, guarda los cambios y asegúrate de reiniciar Apache.
10. Asegura Apache con Fail2ban
Fail2ban es una aplicación de prevención de intrusiones de código abierto que protege los sistemas Linux de amenazas externas, incluidos ataques de denegación de servicio (DoS) y de fuerza bruta. Funciona monitoreando constantemente los registros del sistema en busca de actividades maliciosas y prohibiendo hosts que coincidan con patrones que imitan comportamientos de ataque.
Fail2ban se puede configurar para proteger Apache de ataques de denegación de servicio (DoS) monitoreando constantemente los registros de Apache en busca de intentos de inicio de sesión fallidos y prohibiendo temporalmente las direcciones IP ofensivas.
Consulta cómo instalar Fail2ban en Linux usando:
11. Desactiva los módulos innecesarios
Los módulos de Apache son simplemente programas que se cargan para ampliar la funcionalidad del servidor web. Las funciones ampliadas por los módulos incluyen autenticación básica, almacenamiento en caché de contenido, encriptación, seguridad, etc.
Siempre se recomienda desactivar todos aquellos módulos que actualmente no se estén utilizando para minimizar las posibilidades de convertirse en víctima de un ataque.
Para ver todos los módulos habilitados, ejecuta el comando
$ apache2ctl -M

Para verificar si un módulo específico está habilitado, por ejemplo, el módulo de reescritura, ejecuta el comando.
$ apache2ctl -M | grep rewrite

Para desactivar el módulo, ejecuta el comando:
$ sudo a2dismod rewrite

12. Usa los módulos mod_security y mod_evasive para asegurar Apache
Puedes habilitar los módulos mod_security y mod_evasive para proteger Apache contra ataques de fuerza bruta o ataques de denegación de servicio (DDoS).
- El módulo mod_security actúa como un firewall de aplicaciones web (WAF) y bloquea el tráfico sospechoso y no deseado hacia tu sitio.
- El módulo mod_evasive protege tu servidor contra ataques de fuerza bruta y de denegación de servicio (DoS).
Lee más sobre cómo proteger Apache utilizando los módulos mod_security y mod_evasive.
13. Servicios no deseados restringidos en Apache
Para asegurar aún más Apache, considera desactivar ciertos servicios como enlaces simbólicos y la ejecución de CGI si no son necesarios en este momento. Por defecto, Apache sigue los enlaces simbólicos, podemos desactivar esta función así como la característica -Includes
y CGI en una sola línea.
Para hacer esto, agrega la línea '-ExecCGI -FollowSymLinks -Includes'
para la directiva ‘Options’ en la sección ‘Directorio‘.
<Directory /your/website/directory> Options -ExecCGI -FollowSymLinks -Includes </Directory>
Esto también se puede lograr a nivel de directorio. Por ejemplo, aquí, estamos desactivando Includes y la ejecución de archivos Cgi para el directorio “/var/www/html/mydomain1”.
<Directory "/var/www/html/mydomain1"> Options -Includes -ExecCGI </Directory>
Guarda los cambios y reinicia Apache.
14. Limita el tamaño de carga de archivos en Apache
Otra forma de asegurar tu servidor web es limitar el tamaño total del cuerpo de la solicitud HTTP enviada al servidor web desde un cliente. Puedes establecerlo en el contexto del servidor, por directorio, por archivo o por ubicación.
Por ejemplo, si deseas permitir la carga de archivos a un directorio específico, digamos el directorio /var/www/domain.com/wp-uploads, y restringir el tamaño del archivo cargado a 4M = 4194304Bytes, agrega la siguiente directiva a tu archivo de configuración de Apache o .htaccess.
<Directory "/var/www/domain.com/wp-uploads"> LimitRequestBody 4194304 </Directory>
Guarda los cambios y recuerda reiniciar Apache.
Puedes configurarlo en el contexto del servidor, por directorio, por archivo o por ubicación. La directiva evita el comportamiento anormal de las solicitudes de clientes, que a veces puede ser una forma de ataque de denegación de servicio (DoS).
15. Habilitar el registro en Apache
El registro proporciona todos los detalles sobre las solicitudes de clientes y cualquier otra información relacionada con el rendimiento de su servidor web. Esto proporciona información útil en caso de que algo salga mal. Habilitar los registros de Apache, especialmente en archivos de hosts virtuales, le permite señalar un problema en caso de que algo salga mal con el servidor web.
Para habilitar el registro, debes incluir el módulo mod_log_config, que proporciona dos directivas principales de registro.
- ErrorLog: Especifica la ruta del archivo de registro de errores.
- CustomLog: Crea y formatea un archivo de registro.
Puedes utilizar estos atributos en un archivo de host virtual en la sección de host virtual para habilitar el registro.
<VirtualHost 172.16.25.125:443> ServerName example.com DocumentRoot /var/www/html/example/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
La directiva {APACHE_LOG_DIR}
en sistemas Debian se define como la ruta /var/log/apache2.
16. Ejecutar Apache como un usuario y grupo separados
Ejecutar Apache como un usuario y grupo separados es una práctica de seguridad común. Al hacerlo, puedes aislar el proceso del servidor web de otros procesos del sistema y minimizar el daño potencial si el servidor web se ve comprometido.
Primero, querrás crear un nuevo usuario y grupo específicamente para Apache.
$ sudo groupadd apachegroup $ sudo useradd -g apachegroup apacheuser
A continuación, deberás editar el archivo de configuración de Apache para especificar el nuevo usuario y grupo.
User apacheuser Group apachegroup
Dado que estás cambiando el usuario y grupo con el que se ejecuta Apache, es posible que necesites actualizar la propiedad de los directorios y archivos web para garantizar que Apache aún pueda leerlos.
$ sudo chown -R apacheuser:apachegroup /var/www/html
Después de realizar estos cambios, reinicia Apache para aplicarlos:
$ sudo systemctl restart httpd # For RHEL/CentOS $ sudo systemctl restart apache2 # For Debian/Ubuntu
17. Protección contra ataques DDOS y endurecimiento
Bueno, es cierto que no puedes proteger completamente tu sitio web de los ataques DDoS. Sin embargo, aquí hay algunas pautas que pueden ayudarte a mitigarlos y gestionarlos.
- TimeOut – Esta directiva te permite especificar la duración que el servidor esperará para que ciertos eventos se completen antes de devolver un error. El valor predeterminado es de 300 segundos. Para sitios susceptibles a ataques DDoS, es recomendable mantener este valor bajo. Sin embargo, el ajuste apropiado depende en gran medida de la naturaleza de las solicitudes que recibe tu sitio web. Nota: Un tiempo de espera bajo podría causar problemas con algunos scripts CGI.
- MaxClients – Esta directiva establece el límite en el número de conexiones que pueden ser servidas simultáneamente. Cualquier conexión nueva más allá de este límite será encolada. Está disponible tanto en los MPMs Prefork como Worker. El valor predeterminado es 256.
- KeepAliveTimeout – Esta directiva especifica la duración que el servidor esperará para una solicitud subsecuente antes de cerrar la conexión. El valor predeterminado es de 5 segundos.
- LimitRequestFields – Esta directiva establece un límite en el número de campos de encabezado de solicitud HTTP aceptados por los clientes. El valor predeterminado es 100. Si están ocurriendo ataques DDoS debido a un número excesivo de encabezados de solicitud HTTP, se recomienda reducir este valor.
- LimitRequestFieldSize – Esta directiva establece un límite de tamaño para el encabezado de solicitud HTTP.
18. Realizar Escaneos de Vulnerabilidades Regulares
Otra forma de proteger su servidor web es realizando pruebas regulares de escaneo de vulnerabilidades. Esto ayuda a identificar posibles brechas de seguridad que podrían ser explotadas por hackers para acceder a archivos sensibles o inyectar malware.
Las herramientas de escaneo de vulnerabilidades también ayudan a señalar configuraciones inseguras y facilitan la auditoría de cumplimiento. Algunas herramientas populares de escaneo de vulnerabilidades incluyen Acutenix, Nessus, Nexpose, Sucuri, y muchas más.
Conclusión
Estos son algunos de los consejos de endurecimiento de Apache que puede implementar en su servidor web para proporcionar una capa adicional de protección y mantener alejadas las intrusiones.