Você sabe que a maioria das vulnerabilidades de segurança pode ser corrigida implementando os cabeçalhos necessários no cabeçalho de resposta?
A segurança é tão essencial quanto o conteúdo e o SEO do seu site e de milhares de sites ser hackeado devido a configuração incorreta ou falta de proteção. Se você é proprietário de um site ou engenheiro de segurança e deseja proteger seu site contra Clickjacking, injeção de código, tipos MIME, XSS etc. ataques, então este guia irá ajudá-lo.
Neste artigo, falarei sobre vários cabeçalhos HTTP ( recomendado pela OWASP ) para implementar em vários servidores web, borda de rede e provedores de CDN para melhor proteção do site .
Notas:
- Você é aconselhado a fazer um backup do arquivo de configuração antes de fazer alterações
- Alguns dos cabeçalhos podem não ser suportados em todos os navegadores, então confira a compatibilidade antes da implementação.
- Mod_headers deve ser ativado no Apache para implementar esses cabeçalhos. Certifique-se de que a seguinte linha não seja comentada em
httpd.conf
arquivo.
LoadModule headers_module modules/mod_headers.so
- Após a implementação, você pode usar o ferramenta online de cabeçalhos seguros para verificar os resultados.
Vamos começar…
Segurança de Transporte Estrito HTTP
Cabeçalho HSTS (HTTP Strict Transport Security) para garantir que toda a comunicação de um navegador seja enviada por HTTPS (HTTP Secure). Isso evita solicitações de click-through HTTPS e redireciona solicitações HTTP para HTTPS.
Antes de implementar esse cabeçalho, você deve garantir que todas as páginas do seu site sejam acessíveis por HTTPS, caso contrário, elas serão bloqueadas.
O cabeçalho HSTS é suportado em todas as principais versões mais recentes de um navegador como IE, Firefox, Opera, Safari e Chrome. Existem três configurações de parâmetros.
Valor do parâmetro | Significado |
idade máxima | Duração (em segundos) para informar a um navegador que as solicitações estão disponíveis apenas por HTTPS. |
includeSubDomains | A configuração também é válida para o subdomínio. |
pré-carga | Use se desejar que seu domínio seja incluído no Lista de pré-carregamento HSTS |
Então, vamos dar um exemplo de configuração do HSTS por um ano, incluindo pré-carregamento para domínio e subdomínio .
Servidor HTTP Apache
Você pode implementar o HSTS no Apache adicionando a seguinte entrada no arquivo httpd.conf
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Reinicie o apache para ver os resultados
NginxGenericName
Para configurar o HSTS no Nginx, adicione a próxima entrada em nginx.conf
sob a diretiva do servidor (SSL)
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
Como de costume, você precisará reiniciar o Nginx para verificar
Cloudflare
Se você estiver usando o Cloudflare, poderá ativar o HSTS com apenas alguns cliques.
- Logar em Cloudflare e selecione o site
- Vá para a guia “Cripto” e clique em “Ativar HSTS”.
Selecione as configurações que você precisa e as alterações serão aplicadas instantaneamente.
Microsoft IIS
Inicie o Gerenciador do IIS e adicione o cabeçalho acessando “Cabeçalhos de resposta HTTP” para o respectivo site.
Reinicie o site
X-Frame-Options
Use o cabeçalho X-Frame-Options para evitar roubo de cliques vulnerabilidade em seu site. Ao implementar esse cabeçalho, você instrui o navegador a não incorporar sua página da Web em um frame/iframe. Isso tem algumas limitações no suporte do navegador, então você deve verificar antes de implementá-lo.
Você pode configurar os três parâmetros a seguir.
Valor do parâmetro | Significado |
MESMA ORIGEM | Frame/iframe de conteúdo só é permitido da mesma origem do site. |
NEGAR | Evite que qualquer domínio incorpore seu conteúdo usando frame/iframe. |
PERMITIR-DE | Permitir enquadrar o conteúdo apenas em um determinado URI. |
Vamos dar uma olhada em como implementar “NEGAR ” para que nenhum domínio incorpore a página da web.
Apache
Adicione a seguinte linha em httpd.conf
e reinicie o servidor web para verificar os resultados.
Header always append X-Frame-Options DENY
NginxGenericName
Adicione o seguinte em nginx.conf
sob a diretiva/bloco do servidor.
add_header X-Frame-Options “DENY”;
Reinicie para verificar os resultados
F5 LTM
Crie uma iRule com o seguinte e associada ao respectivo servidor virtual.
when HTTP_RESPONSE { HTTP::header insert "X-FRAME-OPTIONS" "DENY" }
Você não precisa reiniciar nada, as mudanças são refletidas no ar.
WordPress
Você também pode obter esse cabeçalho implementado através do WordPress. Adicione o seguinte em um arquivo wp-config.php
header('X-Frame-Options: DENY);
Se você não se sentir confortável editando o arquivo, então você pode usar um plugin como explicado aqui ou mencionado acima.
Microsoft IIS
Adicione o cabeçalho acessando “Cabeçalhos de resposta HTTP” para o respectivo site.
Reinicie o site para ver os resultados.
X-Content-Type-Options
Evitar MIME tipos de risco de segurança adicionando este cabeçalho à resposta HTTP da sua página da web. Ter esse cabeçalho instrui o navegador a considerar os tipos de arquivo como definidos e não permitir a detecção de conteúdo. Há apenas um parâmetro que você precisa adicionar “nosniff”.
Vamos ver como anunciar este cabeçalho.
Apache
Você pode fazer isso adicionando a linha abaixo no arquivo httpd.conf
Header set X-Content-Type-Options nosniff
Não se esqueça de reiniciar o servidor Apache para ativar a configuração.
NginxGenericName
Adicione a seguinte linha em nginx.conf
arquivo no bloco do servidor.
add_header X-Content-Type-Options nosniff;
Como de costume, você deve reiniciar o Nginx para verificar os resultados.
Microsoft IIS
Abra o IIS e vá para cabeçalhos de resposta HTTP
Clique em Adicionar e insira o Nome e o Valor
Clique em OK e reinicie o IIS para verificar os resultados.
Política de segurança de conteúdo
Evite XSS, clickjacking, injeção de código ataques implementando o cabeçalho Content Security Policy (CSP) na resposta HTTP da sua página da web. CSP instruir o navegador a carregar o conteúdo permitido para carregar no site.
Todos navegadores não suportam CSP , então você precisa verificar antes de implementá-lo. Existem três maneiras de obter cabeçalhos CSP.
- Política de Segurança de Conteúdo – Nível 2/1.0
- X-Content-Security-Policy – Obsoleto
- X-Webkit-CSP – Obsoleto
Se você ainda estiver usando o obsoleto, considere atualizar para o mais recente.
Existem vários parâmetros possíveis para implementar o CSP, e você pode consultar OWASP para uma ideia. No entanto, vamos passar pelos dois parâmetros mais usados.
Valor do parâmetro | Significado |
default-src | Carregue tudo de uma fonte definida |
script-src | Carregar apenas scripts de uma fonte definida |
O exemplo a seguir de carregamento de tudo da mesma origem em vários servidores da web.
Apache
Obtenha o seguinte adicionado em httpd.conf
arquivo e reinicie o servidor da web para entrar em vigor.
Header set Content-Security-Policy "default-src 'self';"
NginxGenericName
Adicione o seguinte no bloco do servidor em nginx.conf
arquivo
add_header Content-Security-Policy "default-src 'self';";
Microsoft IIS
Vá para Cabeçalhos de resposta HTTP para seu respectivo site no Gerenciador do IIS e adicione o seguinte
Confira isso para implementar frame-ancestral usando CSP. Esta é uma versão avançada do X-Frame-Options.
X-Permitido-Cross-Domain-Policies
Usando produtos Adobe como PDF, Flash, etc.?
Você pode implementar esse cabeçalho para instruir o navegador sobre como lidar com as solicitações em um domínio cruzado. Ao implementar esse cabeçalho, você restringe o carregamento dos recursos de seu site de outros domínios para evitar o abuso de recursos.
Existem algumas opções disponíveis.
Valor | Descrição |
nenhum | nenhuma política é permitida |
somente mestre | permitir apenas a política mestre |
todos | tudo é permitido |
apenas por conteúdo | Permitir apenas um determinado tipo de conteúdo. Exemplo – XML |
somente por ftp | aplicável apenas para um servidor FTP |
Apache
Se você não quiser permitir nenhuma política.
Header set X-Permitted-Cross-Domain-Policies "none"
Você deve ver o cabeçalho como o seguinte.
NginxGenericName
E, digamos que você precise implementar master-only e adicionar o seguinte em nginx.conf
sob server
bloquear.
add_header X-Permitted-Cross-Domain-Policies master-only;
E o resultado.
Política de referência
Procurando controlar a política de referência do seu site? Existem certos benefícios de privacidade e segurança. No entanto, nem todas as opções são suportadas por todos os navegadores, portanto, revise seus requisitos antes da implementação.
Referrer-Policy suporta a seguinte sintaxe.
Valor | Descrição |
não referenciador | As informações do referenciador não serão enviadas com a solicitação. |
não-referrer-quando-downgrade | A configuração padrão em que o referenciador é enviado para o mesmo protocolo como HTTP para HTTP, HTTPS para HTTPS. |
url inseguro | URL completo será enviado com a solicitação. |
mesma origem | O referenciador será enviado apenas para o mesmo site de origem. |
origem estrita | enviar somente quando um protocolo for HTTPS |
origem estrita quando origem cruzada | o URL completo será enviado por meio de um protocolo estrito como HTTPS |
origem | envie a URL de origem em todas as requisições |
origem-quando-origem cruzada | enviar URL COMPLETO na mesma origem. No entanto, envie apenas URL de origem em outros casos. |
Apache
Você pode adicionar o seguinte se quiser definir no-referrer.
Header set Referrer-Policy "no-referrer"
E após a reinicialização, você deve ter nos cabeçalhos de resposta.
NginxGenericName
Digamos que você precise implementar a mesma origem, então você deve adicionar o seguinte.
add_header Referrer-Policy same-origin;
Depois de configurado, você deve ter os resultados abaixo.
Expect-CT
Um novo cabeçalho ainda em estado experimental é para instruir o navegador a validar a conexão com servidores web para transparência de certificado (CT). Este projeto do Google visa corrigir alguns dos falhas no certificado SSL/TLS sistema.
As três variáveis a seguir estão disponíveis para o cabeçalho Expect-CT.
Valor | Descrição |
idade máxima | Em segundos, por quanto tempo o navegador deve armazenar em cache a política. |
impor | Uma diretiva opcional para impor a política. |
relatório-uri | Navegador para enviar um relatório para o URL especificado quando a transparência do certificado válido não for recebida. |
Apache
Vamos supor que você deseja aplicar esta política, relatório e cache por 12 horas, então você deve adicionar o seguinte.
Header set Expect-CT 'enforce, max-age=43200, report-uri="https://somedomain.com/report"'
E aqui está o resultado.
NginxGenericName
E se você quiser relatar e armazenar em cache por 1 hora?
add_header Expect-CT 'max-age=60, report-uri="https://mydomain.com/report"';
A saída seria.
Permissões-Política
Anteriormente conhecida como Feature-Policy, ela foi renomeada como Permissions-Policy com recursos aprimorados. você pode conferir esse para entender as grandes mudanças entre Feature-Policy para Permissions-Policy.
Com a Política de Permissões, você pode controlar os recursos do navegador, como geolocalização, tela cheia, alto-falante, USB, reprodução automática, alto-falante, microfone, pagamento, status da bateria, etc., para habilitar ou desabilitar em um aplicativo da web. Ao implementar essa política, você permite que seu servidor instrua um cliente (navegador) a obedecer à funcionalidade do aplicativo da web.
Apache
Digamos que você precise desabilitar o recurso de tela cheia e, para isso, pode adicionar o seguinte em httpd.conf
ou apache2.conf
dependendo do sabor do servidor Apache HTTP que você usa.
Header always set Permissions-Policy "fullscreen 'none' "
Que tal adicionar vários recursos em uma única linha?
Isso também é possível!
Header always set Permissions-Policy "fullscreen 'none'; microphone 'none'"
Reinicie o Apache HTTP para ver o resultado.
HTTP/1.1 200 OK
Date: Thu, 29 Apr 2021 06:40:43 GMT
Server: Apache/2.4.37 (centos)
Permissions-Policy: fullscreen 'none'; microphone 'none'
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
O código acima instruirá o navegador a desativar a tela cheia e o microfone.
Você também pode desativar totalmente o recurso mantendo a lista de permissões vazia.
Por exemplo, você pode adicionar o seguinte para desativar o recurso de geolocalização.
Header always set Permissions-Policy "geolocation=()"
Isso resultaria no navegador como abaixo.
HTTP/1.1 200 OK
Date: Thu, 29 Apr 2021 06:44:19 GMT
Server: Apache/2.4.37 (centos)
Permissions-Policy: geolocation=()
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
NginxGenericName
Vamos dar outro exemplo – desabilitar o recurso de vibração.
add_header Permissions-Policy "vibrate 'none';";
Ou desative geolocalização, câmera e alto-falante.
add_header Permissions-Policy "geolocation 'none'; camera 'none'; speaker 'none';";
Aqui está a saída após reiniciar o Nginx.
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Thu, 29 Apr 2021 06:48:35 GMT
Content-Type: text/html
Content-Length: 4057
Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT
Connection: keep-alive
ETag: "5d9bab28-fd9"
Permissions-Policy: geolocation 'none'; camera 'none'; speaker 'none';
Accept-Ranges: bytes
Toda a configuração do Nginx vai abaixo http
bloquear em nginx.conf
ou qualquer arquivo personalizado que você usa.
Limpar dados do site
Como você pode imaginar pelo nome, a implementação de um cabeçalho Clear-Site-Data é uma ótima maneira de dizer a um cliente para limpar os dados de navegação, como cache, armazenamento, cookies ou tudo. Isso lhe dá mais controle sobre como deseja armazenar os dados do site no navegador.
Apache
Digamos que você queira limpar o cache de origem, você pode adicionar abaixo.
Header always set Clear-Site-Data "cache"
Que produzirá a resposta HTTP conforme abaixo.
HTTP/1.1 200 OK
Date: Thu, 29 Apr 2021 07:52:14 GMT
Server: Apache/2.4.37 (centos)
Clear-Site-Data: cache
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
ou, para limpar tudo.
Header always set Clear-Site-Data "*"
NginxGenericName
Vamos configurar o Nginx para limpar os cookies.
add_header Clear-Site-Data "cookies";
E você verá a saída abaixo.
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Thu, 29 Apr 2021 07:55:58 GMT
Content-Type: text/html
Content-Length: 4057
Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT
Connection: keep-alive
ETag: "5d9bab28-fd9"
Clear-Site-Data: cookies
Accept-Ranges: bytes
Conclusão
Proteger um site é desafiador e espero que, ao implementar os cabeçalhos acima, você adicione uma camada de segurança. Se você estiver executando um site de negócios, também pode considerar o uso de WAF em nuvem como SUCURI para proteger o seu negócio online. A coisa boa sobre SUCURI é que oferece segurança e desempenho.
Se você optar por SUCURI WAF, encontrará uma seção de cabeçalhos adicionais na guia Firewall >> Segurança.