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
Crie uma instância do Service Mesh (ASM) e adicione o cluster ACK a ela. Para mais informações, consulte Create an ASM instance e Add a cluster to an ASM instance.
Conecte-se à instância do ASM usando kubectl. Para mais informações, consulte Use kubectl on the control plane to access Istio resources.
Implante uma aplicação na instância do ASM. Para mais informações, consulte Deploy an application in an ASM instance.
Defina os recursos necessários do Istio. Para mais informações, consulte Use Istio resources to route traffic to different versions of a service.
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
-
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.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página Market Place, clique em Add HTTP response headers. Na página Plugin Detail, clique em Create Plug-in Instance.
Na seção Plugin Effective scope, selecione Gateway Scope e clique em Add ASM Gateway to effective scope.
-
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.Notaingressgateway é o nome do gateway padrão implantado pelo ASM. Selecione outros gateways do ASM aos quais deseja aplicar esse recurso, se necessário.
-
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:
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
proxyVersioncom a sua versão do Istio e substituaenvoy.filters.network.http_connection_managerporenvoy.http_connection_manager,envoy.filters.http.routerporenvoy.routeretype.googleapis.com/envoy.extensions.filters.http.lua.v3.Luaportype.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
proxyVersioncom a sua versão do Istio.
-
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}/productpageSaí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.