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: Aug 25, 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

Contexto

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 descreve 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 que ele interrompa 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 com as requisições.

X-Download-Options

noopen

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

X-DNS-Prefetch-Control

off

Desativa o pré-carregamento de DNS para hiperlinks externos nas páginas web.

Server

envoy

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

X-Powered-by

N/A

Contém informações sobre ambientes de hospedagem ou outros frameworks. Não defina este cabeçalho de resposta HTTP 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 informações, consulte Deploy an application in an ASM instance. Execute o seguinte comando curl 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 indica que a aplicação não contém nenhum dos cabeçalhos de resposta HTTP descritos na tabela anterior. Crie um filtro Envoy para adicionar esses cabeçalhos à aplicação e melhorar sua segurança.

Procedimento

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

    Para uma instância 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 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 ícone 添加 para adicionar ingressgateway à seção selected e clique em OK.

      Nota

      ingressgateway é o nome do gateway padrão implantado pelo ASM. Selecione outros gateways do ASM aos quais deseja aplicar esse recurso, se necessário.

    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 do plug-in, o ASM cria automaticamente um filtro Envoy.

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

    Execute os comandos abaixo para implantar um 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: Especifica a versão do Istio à qual o filtro Envoy se aplica. Defina o valor conforme a sua versão do Istio. Alguns campos do filtro Envoy podem ser incompatíveis com determinadas versões. Modifique os campos do filtro Envoy conforme necessário para a sua versão do Istio:

    • Se a sua versão do Istio for 1,8 ou anterior, defina o parâmetro proxyVersion com a sua versão do Istio 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.

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

  2. Execute o comando a seguir para verificar se os cabeçalhos de resposta HTTP foram adicionados com sucesso:

    Substitua {IP address of the ingress gateway} pelo endereço IP real do seu gateway de entrada. Para obter mais informações sobre como conseguir o endereço IP de um gateway de entrada, consulte "Obter o endereço IP do gateway de entrada" no tópico Use Istio resources to route traffic to different versions of a service.

    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 do comando confirma que a aplicação agora contém os basic HTTP response headers descritos na tabela anterior.

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 a regra 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.