El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.
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
.
Para completar esta guía, necesitará lo siguiente:
Un servidor de FreeBSD 12 configurado conforme a este tutorial Primeros pasos con FreeBSD.
Un firewall configurado conforme a la sección de configuración de un firewall, dentro del artículo de Pasos recomendados para servidores nuevos de FreeBSD 12.0.
Una pila FAMP completa instalada siguiendo el tutorial Cómo instalar una pila de Apache, MySQL y PHP (FAMP) en FreeBSD 12.0.
Un certificado de Let´s Encrypt instalado conforme al tutorial Cómo proteger Apache con Let´s Encrypt en FreeBSD.
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.
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:
OutputStarting 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
:
Output226 #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:
. . .
#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:
OutputStarting 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.
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:
Output263 : 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:
. . .
#
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.
<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.
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:
#
# 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.
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:
. . .
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:
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.
GET
es parte del protocolo HTTP y se utiliza para recuperar datos.POST
también es parte del protocolo HTTP y se utiliza para enviar datos al servidor.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.
. . .
<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.
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:
Outputheaders_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:
. . .
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:
. . .
<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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!