Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Uso de un filtro Envoy para agregar encabezados de respuesta HTTP en ASM

Última actualización: Sep 05, 2026

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

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

  1. 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.

    1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, seleccione Service Mesh > Mesh Management.

    2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, seleccione Plugin Extension Center > Market Place.

    3. 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.

    4. En la sección Plugin Effective scope, seleccione Gateway Scope y luego haga clic en Add ASM Gateway to effective scope.

    5. 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.

      Nota

      ingressgateway 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.

    6. 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:

    Expand to view commands

    kubectl apply -f - <<EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: addheader-into-ingressgateway
      namespace: istio-system
      labels:
        asm-system: 'true'
        provider: asm
    spec:
      workloadSelector:
        # You can use the workloadSelector field to select workloads in a specific namespace for the Envoy filter. 
        labels:
          istio: ingressgateway
      configPatches:
        # The Envoy configuration that you need to modify. 
      - applyTo: HTTP_FILTER
        match:
          context: GATEWAY
          proxy:
            proxyVersion: '^1\.9.*'
          listener:
            filterChain:
              filter:
                name: "envoy.filters.network.http_connection_manager"
                subFilter:
                  name: "envoy.filters.http.router"
        patch:
          operation: INSERT_BEFORE
          value: # Lua script configuration 
            name: envoy.lua
            typed_config:
              "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
              inlineCode: |-
                function envoy_on_response(response_handle)
                    function hasFrameAncestors(rh)
                    s = rh:headers():get("Content-Security-Policy");
                    delimiter = ";";
                    defined = false;
                    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
                        match = match:gsub("%s+", "");
                        if match:sub(1, 15)=="frame-ancestors" then
                        return true;
                        end
                    end
                    return false;
                    end
                    if not response_handle:headers():get("Content-Security-Policy") then
                    csp = "frame-ancestors none;";
                    response_handle:headers():add("Content-Security-Policy", csp);
                    elseif response_handle:headers():get("Content-Security-Policy") then
                    if not hasFrameAncestors(response_handle) then
                        csp = response_handle:headers():get("Content-Security-Policy");
                        csp = csp .. ";frame-ancestors none;";
                        response_handle:headers():replace("Content-Security-Policy", csp);
                    end
                    end
                    if not response_handle:headers():get("X-Frame-Options") then
                    response_handle:headers():add("X-Frame-Options", "deny");
                    end
                    if not response_handle:headers():get("X-XSS-Protection") then
                    response_handle:headers():add("X-XSS-Protection", "1; mode=block");
                    end
                    if not response_handle:headers():get("X-Content-Type-Options") then
                    response_handle:headers():add("X-Content-Type-Options", "nosniff");
                    end
                    if not response_handle:headers():get("Referrer-Policy") then
                    response_handle:headers():add("Referrer-Policy", "no-referrer");
                    end
                    if not response_handle:headers():get("X-Download-Options") then
                    response_handle:headers():add("X-Download-Options", "noopen");
                    end
                    if not response_handle:headers():get("X-DNS-Prefetch-Control") then
                    response_handle:headers():add("X-DNS-Prefetch-Control", "off");
                    end
                    if not response_handle:headers():get("Feature-Policy") then
                    response_handle:headers():add("Feature-Policy",
                                                    "camera 'none';"..
                                                    "microphone 'none';"..
                                                    "geolocation 'none';"..
                                                    "encrypted-media 'none';"..
                                                    "payment 'none';"..
                                                    "speaker 'none';"..
                                                    "usb 'none';");
                    end
                    if response_handle:headers():get("X-Powered-By") then
                    response_handle:headers():remove("X-Powered-By");
                    end
                end
    EOF

    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 proxyVersion con su versión de Istio y reemplace envoy.filters.network.http_connection_manager por envoy.http_connection_manager, envoy.filters.http.router por envoy.router y type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua por type.googleapis.com/envoy.config.filter.http.lua.v2.Lua.

    • Si su versión de Istio es 1.9 o posterior, establezca el parámetro proxyVersion con su versión de Istio.

  2. 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}/productpage

    Salida 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.