Tutorial

Pasos recomendados para reforzar un servidor HTTP de Apache en FreeBSD 12.0

ApacheSecurityFreeBSD

El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.

Introducción

Aunque la instalación predeterminada de un servidor HTTP Apache ya es segura, la configuración puede mejorar en gran medida con algunas modificaciones. Puede complementar los mecanismos de seguridad ya existentes, por ejemplo, estableciendo protecciones en torno a las cookies y los encabezados, de modo que las conexiones no se puedan manipular al nivel de cliente del usuario. Realizando esto puede reducir notablemente las posibilidades de exponerse a varios métodos de ataque, como los de secuencias de comandos entre sitios (también conocidos como XSS). También puede evitar otros tipos de ataques, como la falsificación de solicitudes entre sitios, los secuestros de sesiones o la denegación de servicios.

A lo largo de este tutorial, implementará algunos pasos recomendados para reducir la cantidad de información expuesta en su servidor. Verificará los listados de directorios y desactivará la indexación para chequear el acceso a recursos. También cambiará el valor predeterminado de la directiva timeout para poder mitigar el tipo de ataque de denegación de servicio. Además, desactivará el método TRACE para que las sesiones no se puedan revocar ni secuestrar. Por último, protegerá los encabezados y las cookies.

La mayoría de los ajustes de configuración se aplicarán al archivo de configuración principal del servidor HTTP Apache ubicado en /usr/local/etc/apache24/httpd.conf.

Requisitos previos

Para completar esta guía, necesitará lo siguiente:

Una vez completados los requisitos previos tendrá un sistema de FreeBSD con una pila adicional capaz de proporcionar contenido web usando cualquier cosa escrita en PHP, como un software importante de CMS. Además, cifró conexiones seguras a través de Let´s Encrypt.

Reducir la información del servidor

El banner del sistema operativo es un método utilizado por computadoras, servidores y dispositivos de todo tipo para presentarse en las redes. Individuos malintencionados pueden usar esta información para obtener beneficios de explotación en los sistemas en cuestión. En esta sección, reducirá la cantidad de información publicada por este banner.

En los conjuntos de directivas se controla la manera en la que se muestra esta información. Para esto, es importante la directiva ServerTokens; por defecto, muestra toda la información sobre el sistema operativo y los módulos compilados al cliente que establece conexión.

Antes de aplicar cualquier cambio, usará una herramienta para escanear la red y verificar la información que se muestra actualmente. Para instalar nmap ejecute el siguiente comando:

  • sudo pkg install nmap

Para obtener la dirección IP de su servidor, puede ejecutar el siguiente comando:

  • ifconfig vtnet0 | awk '/inet / {print $2}'

Puede verificar la respuesta del servidor web usando el siguiente comando:

  • nmap -sV -p 80 your-server-ip

Invoca nmap para hacer un escaneo (por ello se usa el indicador -s), a fin de mostrar la versión (el indicador -V) en el puerto 80 (el indicador -p) en el IP o dominio determinado.

Recibirá información sobre su servidor web similar a la siguiente:

Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET Nmap scan report for 206.189.123.232 Host is up (0.054s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

En el resultado se muestra que la información como la del sistema operativo, la versión del servidor HTTP Apache y OpenSSL es visible. Esto puede ser útil para que los atacantes obtengan información sobre el servidor y elijan las herramientas adecuadas para explotar, por ejemplo, una vulnerabilidad en el software que se ejecuta en el servidor.

Disponga la directiva ServerTokens en el archivo de configuración principal, ya que no viene configurada por defecto. La falta de esta configuración hace que el servidor HTTP Apache muestre su información completa como se indica en la documentación. Para limitar la información que se muestra acerca de su servidor y configuración, dispondrá la directiva ServerTokens dentro del archivo de configuración principal.

Dispondrá esta directiva después de la entrada de ServerName en el archivo de configuración. Ejecute el siguiente comando para encontrar la directiva:

  • grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf

Encontrará el número de línea que luego podrá buscar con vi:

Output
226 #ServerName www.example.com:80

Ejecute el siguiente comando:

  • sudo vi +226 /usr/local/etc/apache24/httpd.conf

Añada la siguiente línea resaltada:

/usr/local/etc/apache24/httpd.conf
. . .
#ServerName www.example.com:80
ServerTokens Prod

Guarde y cierre el archivo con :wq e INTRO.

Fijar la directiva ServerTokens en Prod hará que solo se muestre que este es un servidor web de Apache.

Para que esto se implemente, reinicie el servidor HTTP Apache:

  • sudo apachectl restart

Para probar los cambios, ejecute el siguiente comando:

  • nmap -sV -p 80 your-server-ip

Verá un resultado similar al siguiente con la información mínima adicional acerca de su servidor web de Apache:

Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET Nmap scan report for WPressBSD (206.189.123.232) Host is up (0.056s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

Vio la información que se anunciaba en el servidor antes del cambio y ahora la redujo al mínimo. Con esto, proporcionará a un agente externo menos pistas acerca de su servidor. En el siguiente paso, administrará los listados de directorios para su servidor web.

Administrar los listados de directorios

En este paso, se asegurará de que el listado de directorios esté configurado correctamente para que las partes adecuadas del sistema estén disponibles públicamente como se espera, mientras el resto quede protegido.

Nota: Cuando se declara un argumento, este está activo, pero el signo + puede reforzar por medios visuales la sugerencia de que efectivamente se encuentra habilitado. Cuando se dispone un signo menos - el argumento se niega; por ejemplo, Options -Indexes.

Los argumentos con + o con - no se pueden mezclar, se consideran como elementos de mala sintaxis en el servidor HTTP Apache y se pueden rechazar al inicio.

Añadir la instrucción Options -Indexes establecerá el contenido dentro de la ruta de datos /usr/local/www/apache24/data para no realizar la indexación (leer listado) de forma automática si no existe un archivo .html y no mostrar si una URL asigna este directorio. Esto también se aplicará al utilizar configuraciones de host virtuales como la que se emplea para el tutorial de requisitos previos para el certificado de Let´s Encrypt.

Establecerá la directiva Options con el argumento -Indexes y con la directiva +FollowSymLinks, que permitirá el seguimiento de los enlaces simbólicos. Usará el símbolo + para cumplir con las convenciones HTTP de Apache.

Ejecute el siguiente comando para encontrar la línea que editará en el archivo de configuración:

  • grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf

Visualizará un resultado similar al siguiente:

Output
263 : Options Indexes FollowSymLinks

Ejecute este comando para acceder de manera directa a la línea para editar:

  • sudo vi +263 /usr/local/etc/apache24/httpd.conf

Ahora, edite la línea conforme a la configuración:

/usr/local/etc/apache24/httpd.conf
. . .
#
Options -Indexes +FollowSymLinks

#
. . .

Guarde y cierre el archivo con :wq e INTRO.

Reinicie el servidor HTTP Apache para implementar estos cambios:

  • sudo apachectl restart

En su dominio en el navegador, verá un mensaje de acceso prohibido, también conocido como el error 403. Esto se debe a los cambios que implementó. Con la disposición de -Indexes en la directiva Options se desactivó la capacidad de aplicar indexación de forma automática en el servidor HTTP Apache y, por lo tanto, no existe un archivo index.html dentro de la ruta de datos.

Puede solucionar esto disponiendo un archivo index.html dentro del VirtualHost habilitado en el tutorial de requisitos previos para el certificado de Let´s Encrypt. Usará el bloque predeterminado dentro de HTTP Apache y lo dispondrá en la misma carpeta que el DocumentRoot que declaró en el host virtual.

/usr/local/etc/apache24/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin your_email@your_domain.com
    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    ErrorLog "/var/log/your_domain.com-error_log"
    CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>

Para hacerlo utilice el siguiente comando:

  • sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html

Ahora, cuando visite su dominio verá un mensaje It works!

En esta sección, estableció restricciones a la directiva Indexes para no escribir y mostrar de forma automática contenido diferente del que pretende. Si no existe un archivo index.html dentro de la ruta de datos, en el servidor HTTP Apache no se creará de manera automática un índice de contenidos. En el siguiente paso, irá más allá del ocultamiento de información y personalizará diferentes directivas.

Reducir el valor de la directiva Timeout

La directiva Timeout establece el límite de tiempo que el servidor HTTP Apache otorgará para nuevas entradas o salidas antes de que falle la solicitud de conexión. Esta falla puede producirse debido a diferentes circunstancias, como los casos en que los paquetes no llegan al servidor o el cliente no confirma como recibidos los datos.

Por defecto, el tiempo de espera se fija en 60 segundos. En los entornos en los cuales el servicio de Internet es lento, este valor predeterminado puede ser razonable, pero un minuto es bastante tiempo; en particular, si el servidor abarca un grupo de usuarios con un servicio de Internet más rápido. Además, el tiempo durante el cual no se cierra la conexión en el servidor puede aprovecharse para ataques de denegación de servicio (DoS). Si se produce una sobrecarga de estas conexiones malintencionadas, el servidor se bloqueará, y posiblemente se saturará y no responderá.

Para cambiar el valor encontrará las entradas de Timeout en el archivo httpd-default.conf:

  • grep -n 'Timeout' /usr/local/etc/apache24/extra/httpd-default.conf

Verá un resultado similar al siguiente:

Output
8 # Timeout: The number of seconds before receives and sends time out. 10 Timeout 60 26 # KeepAliveTimeout: Number of seconds to wait for the next request from the 29 KeepAliveTimeout 5 89 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

En la línea de salida, se fija el valor de la directiva Timeout en 10. Para acceder directamente a esta línea, ejecute el siguiente comando:

  • sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf

La cambiará a 30 segundos, por ejemplo, como en el siguiente ejemplo:

/usr/local/etc/apache24/extra/httpd-default.conf
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 30

Guarde y cierre el archivo con :wq e INTRO.

En el valor de la directiva Timeout se debe equilibrar un rango de tiempo suficientemente extenso como para que estos eventos permitan que se establezca una conexión legítima y exitosa, pero suficientemente breve como para evitar los intentos de conexiones no deseadas.

Nota: Los ataques de denegación de servicio pueden drenar los recursos del servidor de forma eficaz. Una medida complementaria y muy eficaz para contrarrestar esto consiste en usar un MPM anidado para obtener el mejor rendimiento en cuanto a la forma en que se manejan las conexiones y los procesos en el servidor HTTP Apache. En el tutorial Cómo configurar HTTP Apache con MPM Event y PHP-FPM en FreeBSD 12.0 se ofrecen pasos para habilitar esta capacidad.

Para que este cambio tenga efecto, reinicie el servidor HTTP Apache:

  • sudo apachectl restart

Cambió el valor predeterminado de la directiva Timeout para mitigar parcialmente los ataques de DoS.

Deshabilitar el método TRACE

El Protocolo de transferencia de hipertexto se desarrolló siguiendo un modelo de servidor y cliente y, como tal, en el protocolo existen métodos de solicitud para recuperar o disponer información desde el servidor o en él. El servidor debe interpretar estos conjuntos de métodos y la interacción entre ellos. En este paso, configurará los métodos básicos necesarios.

El método TRACE, que se consideraba inofensivo, se aprovechó para realizar ataques de rastreo entre sitios. Este tipo de ataques permite a individuos malintencionados robar sesiones de los usuarios a través del método. El método se diseñó para la depuración a través del servidor devolviendo la misma solicitud originalmente enviada por el cliente. Debido a que la cookie de la sesión del navegador se envía al servidor, se enviará de regreso nuevamente. Sin embargo, un individuo malintencionado podría interceptar esto y luego redirigir la conexión de un navegador a un sitio bajo su control y no al servidor original.

Debido a la posibilidad del mal uso que se puede dar al método TRACE, se recomienda usarlo únicamente para la depuración y no en la producción. En esta sección, desactivará este método.

Edite el archivo httpd.conf con el siguiente comando y presione G para llegar al final del archivo:

  • sudo vi /usr/local/etc/apache24/httpd.conf

Añada la siguiente ruta de entrada al final del archivo:

/usr/local/etc/apache24/httpd.conf
. . .
TraceEnable off

Se recomienda especificar únicamente los métodos que usará en su servidor web HTTP Apache. Esto ayudará a limitar los puntos de entrada potenciales para los individuos malintencionados.

LimitExcept puede ser útil para este propósito, ya que no se permitirán otros métodos aparte de los declarados en este. Por ejemplo, puede establecer una configuración como la siguiente:

/usr/local/etc/apache24/httpd.conf
DocumentRoot "/usr/local/www/apache24/data"
<Directory "/usr/local/www/apache24/data">
    Options -Indexes +FollowSymLinks -Includes
    AllowOverride none
     <LimitExcept GET POST HEAD>
       deny from all
    </LimitExcept>
    Require all granted
</Directory>

Como se declara en la directiva LimitExcept solo se permiten los métodos GET, POST y Head en la configuración.

  • El método GET es parte del protocolo HTTP y se utiliza para recuperar datos.
  • El método POST también es parte del protocolo HTTP y se utiliza para enviar datos al servidor.
  • El método HEAD es similar a GET. Sin embargo, no tiene cuerpo de respuesta.

Usará el siguiente comando y dispondrá el bloque de LimitExcept dentro del archivo:

  • sudo vi +272 /usr/local/etc/apache24/httpd.conf

Para establecer esta configuración, dispondrá el siguiente bloque en la entrada de la directiva DocumentRoot de donde se leerá el contenido, más específicamente dentro de la entrada Directory.

/usr/local/etc/apache24/httpd.conf
. . .
<LimitExcept GET POST HEAD>
   deny from all
</LimitExcept>
. . .

Para implementar los cambios, reinicie el servidor HTTP Apache:

  • sudo apachectl restart

En la directiva más reciente AllowedMethods se proporciona una funcionalidad similar, aunque su estado es aún experimental.

Vio los métodos HTTP, su uso y la protección que ofrecen contra la actividad malintencionada que se aprovecha del método TRACE, así como la forma de declarar los métodos que se usarán. A continuación, trabajará con más protecciones dedicadas a los encabezados y las cookies HTTP.

Proteger los encabezados y las cookies

En este paso, establecerá directivas específicas para proteger las sesiones que se abrirán en las máquinas cliente cuando visite su servidor web HTTP Apache. De esta manera, en su servidor no se cargará contenido no deseado, el cifrado no se degradará y evitará el espionaje de contenido.

Los encabezados son componentes de los métodos de solicitudes. Existen encabezados para ajustar la autenticación, la comunicación entre el servidor y el cliente, el almacenamiento en caché y la negociación de contenido, entre otros aspectos.

Las cookies son pequeños fragmentos de información que el servidor envía al navegador. Estos pequeños fragmentos permiten que en el servidor se reconozca el navegador del cliente de una computadora a otra. También permiten que en los servidores se reconozcan sesiones de usuarios. Por ejemplo, se puede hacer un seguimiento del carrito de compras de un usuario que inició sesión, la información de pago y el historial, entre otros datos. Las cookies se utilizan y se conservan en el navegador web del cliente, ya que HTTP es un protocolo sin estado; esto significa que cuando la conexión se cierra en el servidor no se registra la solicitud enviada por uno u otro cliente.

Es importante proteger los encabezados y las cookies porque permiten la comunicación entre el cliente del navegador web y el servidor web.

El módulo headers viene activado por defecto. Para verificar si está cargado, usará el siguiente comando:

  • sudo apachectl -M | grep 'headers'

Verá el siguiente resultado:

Output
headers_module (shared)

Si no ve un resultado, verifique si el módulo está activo dentro del archivo httpd.conf de Apache:

  • grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf

Como resultado, verá una línea sin comentarios con referencia al módulo específico para encabezados:

/usr/local/etc/apache24/httpd.conf
. . .
122  LoadModule headers_module libexec/apache24/mod_headers.so
. . .

Si está presente, elimine el hashtag al inicio de la línea mod_headers.so para activar la directiva.

Usando las siguientes directivas HTTP de Apache, protegerá los encabezados y las cookies contra actividades malintencionadas para reducir el riesgo al que se exponen los clientes y los servidores.

Ahora, configurará la protección del encabezado. Dispondrá todos estos valores de encabezado en un bloque. Puede optar por aplicar estos valores como lo desee, pero todos se recomiendan.

Edite el archivo httpd.conf con el siguiente comando y presione G para llegar al final del archivo:

  • sudo vi /usr/local/etc/apache24/httpd.conf

Disponga el siguiente bloque al final del archivo:

/usr/local/etc/apache24/httpd.conf
. . .
<IfModule mod_headers.c>
  # Add security and privacy related headers
  Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
  Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
  Header set X-Content-Type-Options "nosniff"
  Header set X-XSS-Protection "1; mode=block"
  Header set Referrer-Policy "strict-origin"
  Header set X-Frame-Options: "deny"
  SetEnv modHeadersAvailable true
</IfModule>
  • Header set Strict-Transport-Security "max-age=31536000; includeSubDomains": la seguridad estricta de transporte de HTTP (HTSTS) es un mecanismo para que los servidores y clientes web (principalmente navegadores) establezcan comunicaciones utilizando solo HTTPS. Al implementar esto evitará la presencia de atacantes desconocidos, en cuyo caso un tercero en medio de la comunicación podría acceder a los fragmentos de información y manipularlos.

  • Header always edit Set-Cookie (. *) "$1; HttpOnly; Secure": los indicadores HttpOnly y Secure en los encabezados ayudan a prevenir las secuencias de comandos entre sitios, también conocidas como XSS. Los atacantes pueden utilizar las cookies de forma indebida para simular ser visitantes legítimos al presentarse como otras personas (robo de identidad), o para ser manipuladas.

  • Header set Referrer-Policy "strict-origin": en el encabezado Referrer-Policy se establece la información que se incluye como información de referencia en el campo de encabezado.

  • Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;": en el encabezado de Content-Security-Policy (CSP) se evitará por completo la carga de contenido que no esté especificada en los parámetros, lo cual es útil para evitar las secuencias de comandos en sitios cruzados (XSS). Existen muchos parámetros posibles para configurar la política de este encabezado. El objetivo final es configurarlo para cargar contenido del mismo sitio y actualizar cualquier contenido con un origen HTTP.

  • Header set X-XSS-Protection "1; mode=block": esto es compatible con navegadores antiguos en los que no se procesan encabezados Content-Security-Policy. En el encabezado ‘X-XSS-Protection’ se ofrece protección contra secuencias de comandos entre sitios. No necesita configurar este encabezado a menos que se necesite compatibilidad con versiones anteriores de navegadores, lo cual es poco común.

  • Header set X-Frame-Options: "deny": con esto se evitan ataques de clickjacking (secuestro de clics). En el encabezado 'X-Frame-Options’ se indica a un navegador si una página se puede presentar en <frame>, <iframe>, <embed> o <object>. De esta manera, los contenidos de sitios diferentes no pueden integrarse a otros, lo cual previene los ataques de clickjacking. Aquí, niega toda la presentación de marco para que la página web no se pueda integrar en otro lugar, ni siquiera dentro del mismo sitio web. Puede adecuar esto a sus necesidades si, por ejemplo, debe autorizar la presentación de algunas páginas debido a que son anuncios o colaboraciones con sitios web específicos.

  • Header set X-Content-Type-Options "nosniff": en el encabezado 'X-Content-Type-Options’ se controlan los tipos MIME para que no se sometan a cambios ni a seguimiento. Los tipos MIME son estándares de formatos de archivo; funcionan para texto, audio, video e imagen, entre otros. Con este encabezado se bloquean los intentos de espiar dichos archivos y modificar sus tipos por parte de individuos malintencionados.

Ahora, reinicie Apache para implementar los cambios:

  • sudo apachectl restart

Para evaluar los niveles de seguridad de sus configuraciones, consulte el sitio web de Security Headers. Después de seguir los pasos de este tutorial, la calificación de su dominio será A.

Nota: Si evalúa sus encabezados visitando https://securityheaders.com/ y obtiene una calificación F, podría deberse a que index.html no se encuentra dentro del DocumentRoot de su sitio, como se indica al final del paso 2. Si cuando evalúa sus encabezados obtiene una calificación que no sea a A o sea F, revise cada línea Header set en busca de cualquier error ortográfico que pueda haber causado una calificación menor.

En este paso, trabajó con hasta siete configuraciones para mejorar la seguridad de sus encabezados y cookies. Esto permitirá evitar las secuencias de comandos entre sitios, el clickjacking y otros tipos de ataques.

Conclusión

En este tutorial, se abordaron varios aspectos relacionados con la seguridad, desde la divulgación de información hasta la protección de las sesiones y el ajuste de parámetros de configuración alternativos para funciones importantes.

Si desea obtener más información sobre el reforzamiento de Apache, a continuación se ofrecen algunas otras referencias:

Si desea acceder a más herramientas para la protección del servidor HTTP Apache:

  • mod_evasive es una herramienta útil para ayudar a mitigar los ataques de DoS. Puede encontrar más información en el tutorial Cómo protegerse contra DoS y DDoS con mod_evasive para Apache.

  • freail2ban es un software de prevención de intrusiones que es útil para bloquear intentos de inicio de sesión repetidos por parte de usuarios no autorizados. Puede obtener más información acerca de esto en el tutorial Cómo proteger un servidor Apache con Fail2Ban.

  • ModSecurity es un Firewall de aplicación web (o WAF) y, como tal, ofrece una amplia variedad de posibilidades basada en reglas predefinidas escritas por SpyderLabs y miembros de la comunidad. Puede leer más acerca de esto en el tutorial Cómo configurar ModSecurity con Apache.

0 Comments

Creative Commons License