
As empresas que vendem scorecards de segurança estão aumentando, e sua influência nas vendas corporativas está crescendo. Além disso, existem aqueles que estão confusos com a baixa classificação de segurança dos vendedores e aqueles que pelo menos uma vez, olhando a classificação, se recusaram a comprar - conversei com essas pessoas.
Examinei como essas empresas calculam o desempenho de segurança de outras empresas. Aconteceu que eles estavam procurando uma combinação do uso do cabeçalho HTTP para segurança e reputação dos endereços IP.
A reputação de um endereço IP é baseada em dados da lista negra e da lista de spam, combinados com informações sobre o proprietário do endereço IP público. Em princípio, deve ficar limpo se a sua empresa não enviar spam e conseguir identificar e interromper rapidamente a implementação maliciosa. O uso do cabeçalho de segurança HTTP é calculado da mesma maneira que o Observatório Mozilla funciona.
Assim, a classificação da maioria das empresas é determinada principalmente pelos títulos incluídos nos sites públicos de segurança.
Definir o título corretamente não é longo (não é necessária nenhuma verificação séria), mas melhorará a segurança do site e ajudará a não perder clientes para os quais a segurança não é uma frase vazia
Duvido do valor da metodologia de verificação mencionada; além disso, o preço do serviço é exorbitante. É improvável que os fornecedores desse serviço possam determinar a segurança de um recurso com a precisão declarada. No entanto, a situação enfatiza mais uma vez a importância de se sentar e reservar um tempo para ativar e configurar os cabeçalhos corretos.
Neste artigo, falarei sobre os cabeçalhos verificados com mais frequência, pois cada um aconselharei os valores de segurança e darei um exemplo de configurações. No final, darei exemplos de configurações para aplicativos e servidores da Web comuns.
Cabeçalhos de segurança importantes
Política de segurança de conteúdo
O CSP é usado para impedir scripts entre sites - determinando quais recursos podem ser baixados. A partir da lista inteira, esse cabeçalho levará mais tempo do que o restante para criar e oferecer suporte adequado, e ainda mais outros estão em risco. Ao desenvolver um CSP, verifique-o com cuidado - se você bloquear repentinamente a fonte que está usando, interrompa a funcionalidade do seu próprio site.
Para a versão preliminar, você pode usar uma ferramenta maravilhosa - uma extensão para o navegador Mozilla, Laboratory CSP . Instale-o em um navegador, estude cuidadosamente o site para o qual deseja criar um CSP e use o CSP gerado em seu site. Idealmente, você ainda precisa refazer o JavaScript para poder remover a diretiva inline não segura.
O CSP pode parecer complicado e confuso; portanto, se você quiser aprofundar o assunto, visite o site oficial .
Você pode pré-configurar o CSP assim (em um site de combate, provavelmente será necessário muitas modificações). Adicione domínios a cada seção do seu site.
# Default to only allow content from the current site # Allow images from current site and imgur.com # Don't allow objects such as Flash and Java # Only allow scripts from the current site # Only allow styles from the current site # Only allow frames from the current site # Restrict URL's in the <base> tag to current site # Allow forms to submit only to the current site Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';
Segurança estrita do transporte
Esse cabeçalho informa ao navegador que você só pode acessar o site usando o protocolo HTTPS - sempre ative-o se o HTTPS estiver ativado no site. Inclua-o em todos os subdomínios usados, se houver.
Strict-Transport-Security: max-age=3600; includeSubDomains
Opções de tipo de conteúdo X
Graças a esse cabeçalho, os navegadores aderem aos tipos MIME instalados pelo aplicativo, o que ajuda a evitar alguns ataques de script entre sites.
Também reduz o risco de comportamento inesperado do aplicativo quando o navegador adivinha incorretamente o tipo de conteúdo no site - por exemplo, se o desenvolvedor designa uma página "HTML" e o navegador vê JavaScript e tenta renderizar a página de acordo. Além disso, graças a esse cabeçalho, o navegador sempre mantém os tipos MIME instalados pelo servidor.
X-Content-Type-Options: nosniff
Controle de cache
Este será mais pobre que os outros, porque, para diferentes tipos de conteúdo, você provavelmente precisará de políticas de cache diferentes.
Nenhuma informação confidencial - como a página de um usuário ou a página de pagamento do produto - deve ser armazenada em cache. Uma das razões para isso é que outro usuário do computador não pressiona o botão Voltar, não lê o histórico e não vê os dados pessoais de outro usuário.
No entanto, você pode e deve armazenar em cache as páginas que raramente são atualizadas, como recursos estáticos (imagens, arquivos CSS e JS). O armazenamento em cache pode ser configurado página por página ou usando regex nas configurações do servidor.
# Don't cache by default Header set Cache-Control no-cache # Cache static assets for 1 day <filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$"> Header set Cache-Control "max-age=86400, public" </filesMatch>
Expira
Esse cabeçalho define o horário em que a solicitação atual é armazenada em cache. Ele é ignorado se o cabeçalho de idade máxima do Cache-Control estiver ativado, portanto, apenas o habilitamos no caso de um simples scanner verificá-lo - excluindo os controles de cache.
Assumimos que, por razões de segurança, o navegador não armazena nada em cache; portanto, a data no cabeçalho sempre estará no passado.
Expires: 0
Opções de quadro X
Este cabeçalho permite a exibição do site em um iFrame.
Ao colocar seu site em um iFrame, um recurso malicioso tem a oportunidade de realizar um ataque de clickjacking - iniciando algum tipo de JavaScript que induz o usuário a clicar no iFrame e depois começa a interagir com o recurso pelo nome, usuário e nome (ou seja, uma pessoa clica em um link ou botão malicioso sem nem mesmo saber!).
Esse cabeçalho sempre deve ser configurado para falhar, com exceção se você usar intencionalmente quadros. Em seguida, o cabeçalho deve ser definido para a mesma fonte. Se você usar quadros com um site diferente por padrão, coloque na lista de permissões o domínio de terceiros.
Também deve ser observado que esse cabeçalho é substituído pela diretiva CSP frame-ancestors. Eu recomendo ativá-lo por enquanto, mas, para fechar as ferramentas de verificação dos cabeçalhos, eles provavelmente se livrarão disso no futuro.
X-Frame-Options: deny
Controle de Acesso - Permitir Origem
Esse cabeçalho informa ao navegador qual código externo de quais sites de terceiros tem o direito de fazer solicitações para uma página específica. As configurações padrão geralmente estão corretas, mas você pode alterá-las se necessário.
Por exemplo, o site A contém algum tipo de JavaScript que deseja fazer uma solicitação para o site B. O site B deve responder a essa solicitação - se o cabeçalho permitir que o site A faça uma solicitação. Se você precisar configurar muitas fontes, consulte os detalhes na página MDN .
Aqui você pode ficar um pouco confuso, então fiz um diagrama - para ilustrar como esse cabeçalho funciona:

Fluxo de dados com acesso-controle-permissão-origem
Access-Control-Allow-Origin: http://www.one.site.com
Definir cookie
Certifique-se de que seus cookies sejam definidos apenas pelo protocolo HTTPS (com criptografia) e que não sejam acessíveis por JavaScript. Esses arquivos só podem ser enviados se o site também suportar HTTPS, como deveria. Você sempre precisa definir esses sinalizadores:
Exemplo de definição de cookie:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
Leia mais na excelente documentação de cookies Mozilla .
Proteção X-XSS
Este cabeçalho indica ao navegador para interromper os ataques de script entre sites detectados. Ao ativá-lo, você não corre muito risco, mas teste-o antes de iniciá-lo no ambiente de produção.
X-XSS-Protection: 1; mode=block
Exemplo de configurações do servidor da Web
Em geral, nas configurações do servidor, é melhor adicionar cabeçalhos ao site inteiro. Os cookies são uma exceção, pois são definidos no próprio aplicativo.
Aconselho você, antes de adicionar cabeçalhos ao site, verifique primeiro com o Observatório ou procure manualmente nos cabeçalhos - verifique quais já estão instalados. Alguns mecanismos de site e servidor instalam tudo por conta própria; portanto, implemente os cabeçalhos necessários ou altere os que precisam.
Configuração do Apache
Exemplo de configuração do Apache em .htaccess:
<IfModule mod_headers.c> ## CSP Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers Header set X-XSS-Protection: 1; mode=block Header set Access-Control-Allow-Origin: http://www.one.site.com Header set X-Frame-Options: deny Header set X-Content-Type-Options: nosniff Header set Strict-Transport-Security: max-age=3600; includeSubDomains ## Caching rules # Don't cache by default Header set Cache-Control no-cache Header set Expires: 0 # Cache static assets for 1 day <filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> </IfModule>
Configuração Nginx
## CSP add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers add_header X-XSS-Protection: 1; mode=block; add_header Access-Control-Allow-Origin: http://www.one.site.com; add_header X-Frame-Options: deny; add_header X-Content-Type-Options: nosniff; add_header Strict-Transport-Security: max-age=3600; includeSubDomains; ## Caching rules # Don't cache by default add_header Cache-Control no-cache; add_header Expires: 0; # Cache static assets for 1 day location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ { try_files $uri @rewriteapp; add_header Cache-Control "max-age=86400, public"; }
Configuração do cabeçalho no nível do aplicativo
Se você não tiver acesso ao servidor da Web ou os requisitos para definir os cabeçalhos forem complexos, provavelmente será necessário configurá-los no próprio aplicativo. Normalmente, para todo o site, isso é feito usando middleware ou com base em uma configuração única de cabeçalhos para cada solicitação.
Por uma questão de brevidade, incluí apenas um cabeçalho em cada exemplo. Você adiciona da mesma maneira tudo o que é necessário.
Nó e expresso:
Adicione o caminho de montagem global:
app.use(function(req, res, next) { res.header('X-XSS-Protection', 1; mode=block); next(); });
Java e Spring
Tenho pouca experiência com o Spring, mas Baeldung tem um ótimo guia sobre como configurar cabeçalhos no Spring.
Php
Não estou familiarizado com vários ambientes PHP. Procure middleware para consultas. Para uma única solicitação, tudo é simples.
header("X-XSS-Protection: 1; mode=block");
Python / Django
O Django inclui middleware de segurança personalizável que fará tudo isso para você. Ative-os primeiro.
As respostas de algumas páginas podem ser interpretadas como um dicionário. O Django possui uma maneira especial de trabalhar com armazenamento em cache, e se você deseja configurar cabeçalhos de armazenamento em cache dessa maneira, você precisa se familiarizar com ele.
response = HttpResponse() response["X-XSS-Protection"] = "1; mode=block"
Conclusões
A configuração de cabeçalhos é um processo relativamente simples e rápido, mas oferece um aumento no nível de segurança do site - em termos de proteção de dados, de scripts entre sites e click-jacking.
No futuro, você se protegerá das falhas nas transações, porque sua classificação de segurança permanecerá no nível. A prática de avaliá-lo com base nos parâmetros que examinei está ganhando força, e parece-me que seu papel nos próximos anos no campo das vendas só se intensificará.
Deixe-me saber se eu perdi alguma manchete importante!