Es posible agregar encabezados de respuesta HTTP a las aplicaciones web para mejorar su seguridad. Este tema describe cómo utilizar un filtro Envoy para agregar encabezados de respuesta HTTP en Service Mesh (ASM).
Requisitos previos
Se creó una instancia de Service Mesh (ASM) y se agregó el clúster ACK a dicha instancia. Para obtener más información, consulte Create an ASM instance y Add a cluster to an ASM instance.
Se estableció conexión con la instancia de ASM mediante kubectl. Para obtener más información, consulte Use kubectl on the control plane to access Istio resources.
Se desplegó una aplicación en la instancia de ASM. Para obtener más información, consulte Deploy an application in an ASM instance.
Se definieron los recursos de Istio obligatorios. Para obtener más información, consulte Use Istio resources to route traffic to different versions of a service.
Contexto
El Open Web Application Security Project (OWASP) proporciona mejores prácticas y un framework de codificación que describen cómo usar encabezados de respuesta HTTP para mejorar la seguridad de las aplicaciones. La siguiente tabla describe los encabezados de respuesta HTTP básicos.
Encabezado de respuesta HTTP | Valor predeterminado | Descripción |
Content-Security-Policy | frame-ancestors none; | Previene ataques de clickjacking provenientes de otros sitios web. |
X-XSS-Protection | 1;mode=block | Activa el filtro de secuencias de comandos entre sitios (XSS) del navegador, si está disponible, para detener la renderización al detectar ataques XSS. |
X-Content-Type-Options | Nosniff | Deshabilita el rastreo de contenido (sniffing) en el navegador. |
Referrer-Policy | no-referrer | Especifica que no se envíe información de referencia junto con las solicitudes. |
X-Download-Options | noopen | Evita que versiones antiguas de Internet Explorer permitan la ejecución automática de descargas. |
X-DNS-Prefetch-Control | off | Deshabilita la resolución previa de DNS para hipervínculos externos en páginas web. |
Server | envoy | Identifica el servidor que genera la respuesta. La puerta de enlace de entrada de Istio establece automáticamente este encabezado de respuesta HTTP. |
X-Powered-by | N/A | Contiene información sobre los entornos de hosting u otros frameworks. No configure este encabezado de respuesta HTTP si desea ocultar el nombre y la versión de servidores de aplicaciones vulnerables. |
Feature-Policy | camera 'none'; microphone 'none'; geolocation 'none'; encrypted-media 'none'; payment 'none'; speaker 'none'; usb 'none'; | Especifica las funciones y operaciones de API disponibles para los navegadores. |
En este ejemplo se utiliza una aplicación Bookinfo. Para obtener más información, consulte Deploy an application in an ASM instance. Ejecute el siguiente comando curl para consultar los encabezados de respuesta HTTP de la aplicación:
curl -I http://{IP address of the ingress gateway}/productpage
# Output example
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 5183
server: istio-envoy
date: Tue, 28 Jan 2020 08:15:21 GMT
x-envoy-upstream-service-time: 28
La salida del comando indica que la aplicación no contiene ninguno de los encabezados de respuesta HTTP descritos en la tabla anterior. Cree un filtro Envoy para agregar encabezados de respuesta HTTP a la aplicación y así mejorar su seguridad.
Procedimiento
-
Despliegue un filtro Envoy según la versión de su instancia de ASM.
Para una instancia de ASM con versión 1.12.4.0 o posterior
Despliegue un filtro Envoy desde la página Market Place en la consola de ASM.
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione .
En la página Market Place, haga clic en Add HTTP response headers. En la página Plugin Detail, haga clic en Create Plug-in Instance.
En la sección Plugin Effective scope, seleccione Gateway Scope y luego haga clic en Add ASM Gateway to effective scope.
-
En el cuadro de diálogo Add ASM Gateway to effective scope, seleccione ingressgateway en la sección Select ASM Gateway, haga clic en el icono
para agregar ingressgateway a la sección selected y, a continuación, haga clic en OK.Notaingressgateway es el nombre de la puerta de enlace predeterminada desplegada por ASM. También puede seleccionar otras puertas de enlace de ASM a las que desee aplicar esta función.
-
En la sección Plugin Config, elimine todo el contenido del editor YAML, active Plugin Switch y espere a que se habilite el plugin.
Una vez habilitado el plugin, ASM crea automáticamente un filtro Envoy.
Para una instancia de ASM con versión anterior a 1.12.4.0
Ejecute los siguientes comandos para desplegar un filtro Envoy:
proxyVersion: Especifica la versión de Istio a la que aplica el filtro Envoy. Establezca el valor correspondiente a su versión de Istio. Algunos campos del filtro Envoy podrían ser incompatibles con ciertas versiones de Istio, por lo que tal vez deba modificar dichos campos según su versión específica:Si su versión de Istio es 1.8 o anterior, establezca el parámetro
proxyVersioncon su versión de Istio y reemplaceenvoy.filters.network.http_connection_managerporenvoy.http_connection_manager,envoy.filters.http.routerporenvoy.routerytype.googleapis.com/envoy.extensions.filters.http.lua.v3.Luaportype.googleapis.com/envoy.config.filter.http.lua.v2.Lua.Si su versión de Istio es 1.9 o posterior, establezca el parámetro
proxyVersioncon su versión de Istio.
-
Ejecute el siguiente comando para comprobar si los encabezados de respuesta HTTP se agregaron correctamente:
Reemplace
{IP address of the ingress gateway}con la dirección IP real de su puerta de enlace de entrada. Para obtener más información sobre cómo conseguir la dirección IP de una puerta de enlace de entrada, consulte "Obtain the IP address of the ingress gateway" en el tema Use Istio resources to route traffic to different versions of a service.curl -I http://{IP address of the ingress gateway}/productpageSalida esperada:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4183 server: istio-envoy date: Tue, 28 Jan 2020 09:07:01 GMT x-envoy-upstream-service-time: 17 content-security-policy: frame-ancestors none; x-frame-options: deny x-xss-protection: 1; mode=block x-content-type-options: nosniff referrer-policy: no-referrer x-download-options: noopen x-dns-prefetch-control: off feature-policy: camera 'none';microphone 'none';geolocation 'none';encrypted-media 'none';payment 'none';speaker 'none';usb 'none';La salida del comando indica que la aplicación contiene los basic HTTP response headers descritos en la tabla anterior.
Preguntas frecuentes
¿Por qué no puedo acceder a una aplicación mediante una URL con caracteres especiales?
Es posible que los formatos de codificación de caracteres especiales no cumplan con la regla de codificación de URL. Por ejemplo, podría estarse utilizando codificación Unicode en lugar de ASCII para el carácter especial Á. Para obtener más información, consulte Envoy cannot parse non-alphanumeric characters if not urlencoded.