Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Use um filtro Envoy para adicionar cabeçalhos de resposta HTTP no ASM

Última atualização: Jun 28, 2026

Adicione cabeçalhos de resposta HTTP em aplicações web para aumentar a segurança. Este tópico descreve como usar um filtro Envoy para adicionar cabeçalhos de resposta HTTP no Service Mesh (ASM).

Pré-requisitos

Informações de fundo

O Open Web Application Security Project (OWASP) fornece melhores práticas e um framework de codificação que descrevem como utilizar cabeçalhos de resposta HTTP para melhorar a segurança das aplicações. A tabela a seguir apresenta os cabeçalhos básicos de resposta HTTP.

Cabeçalho de resposta HTTP

Valor padrão

Descrição

Content-Security-Policy

frame-ancestors none;

Impede ataques de clickjacking originados de outros sites.

X-XSS-Protection

1;mode=block

Ativa o filtro de cross-site scripting (XSS) do navegador, quando disponível, permitindo interromper a renderização ao detectar ataques XSS.

X-Content-Type-Options

Nosniff

Desativa a detecção de tipo de conteúdo (sniffing) pelo navegador.

Referrer-Policy

no-referrer

Define que nenhuma informação de referência deve ser enviada junto às requisições.

X-Download-Options

noopen

Evita que versões antigas do Internet Explorer executem downloads automaticamente.

X-DNS-Prefetch-Control

off

Desativa o prefetch de DNS para hiperlinks externos nas páginas web.

Server

envoy

Identifica o servidor que gerou a resposta. O gateway de entrada do Istio define este cabeçalho automaticamente.

X-Powered-by

N/A

Contém informações sobre ambientes de hospedagem ou frameworks. Não defina este cabeçalho se desejar ocultar o nome e a versão de servidores de aplicação vulneráveis.

Feature-Policy

camera 'none';

microphone 'none';

geolocation 'none';

encrypted-media 'none';

payment 'none';

speaker 'none';

usb 'none';

Especifica quais recursos e operações de API ficam disponíveis para os navegadores.

Este exemplo utiliza a aplicação Bookinfo. Para mais detalhes, consulte Implantar uma aplicação em uma instância do ASM. Execute o comando curl abaixo para consultar os cabeçalhos de resposta HTTP da aplicação:

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

A saída do comando mostra que a aplicação não possui nenhum dos cabeçalhos de resposta HTTP listados na tabela anterior. Crie um filtro Envoy para adicionar esses cabeçalhos e fortalecer a segurança da aplicação.

Procedimento

  1. Implante um filtro Envoy conforme a versão da sua instância do ASM.

    Para instâncias do ASM com versão 1.12.4.0 ou posterior

    Implante o filtro Envoy pela página Market Place no console do ASM.

    1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha Plugin Extension Center > Market Place.

    3. Na página Market Place, clique em Add HTTP response headers. Na página Plugin Detail, clique em Create Plug-in Instance.

    4. Na seção Plugin Effective scope, selecione Gateway Scope e clique em Add ASM Gateway to effective scope.

    5. Na caixa de diálogo Add ASM Gateway to effective scope, selecione ingressgateway na seção Select ASM Gateway, clique em no ícone 添加 para mover ingressgateway para a seção selected e clique em OK.

      Nota

      ingressgateway é o nome do gateway padrão implantado pelo ASM. Selecione outros gateways do ASM caso queira aplicar esse recurso a eles.

    6. Na seção Plugin Config, apague todo o conteúdo do editor YAML, ative a opção Plugin Switch e aguarde a ativação do plug-in.

      Após a ativação, o ASM cria automaticamente um filtro Envoy.

    Para instâncias do ASM com versão anterior a 1.12.4.0

    Execute os comandos abaixo para implantar o filtro Envoy:

    Expandir para visualizar comandos

    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: Define a versão do Istio à qual o filtro Envoy se aplica. Configure este valor com a sua versão do Istio. Alguns campos do filtro podem ser incompatíveis com certas versões, exigindo ajustes conforme o seu ambiente:

    • Para Istio versão 1,8 ou anterior, defina o parâmetro proxyVersion com a sua versão e substitua envoy.filters.network.http_connection_manager por envoy.http_connection_manager, envoy.filters.http.router por envoy.router e type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua por type.googleapis.com/envoy.config.filter.http.lua.v2.Lua.

    • Para Istio versão 1,9 ou posterior, basta definir o parâmetro proxyVersion com a sua versão.

  2. Execute o comando abaixo para verificar se os cabeçalhos de resposta HTTP foram adicionados corretamente:

    Substitua {IP address of the ingress gateway} pelo endereço IP real do seu gateway de entrada. Para obter esse endereço, consulte a seção "Obter o endereço IP do gateway de entrada" no tópico Usar recursos do Istio para rotear tráfego para diferentes versões de um serviço.

    curl -I http://{IP address of the ingress gateway}/productpage

    Saída 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';

    A saída confirma que a aplicação agora inclui os cabeçalhos básicos de resposta HTTP listados anteriormente.

Perguntas frequentes

Por que não consigo acessar uma aplicação usando uma URL com caracteres especiais?

Os formatos de codificação de caracteres especiais podem não estar em conformidade com as regras de codificação de URL. Por exemplo, o caractere especial Á pode estar usando codificação Unicode em vez de ASCII. Para mais detalhes, consulte Envoy cannot parse non-alphanumeric characters if not urlencoded.