Proteger o seu servidor web é crucial para proteger contra várias vulnerabilidades da web. Adicionar cabeçalhos de segurança à configuração do Nginx é uma maneira eficaz de aumentar a segurança. Aqui estão alguns cabeçalhos de segurança recomendados e suas configurações:

  • Strict-Transport-Security (HSTS): Objetivo: impõe o uso de HTTPS pelo período especificado, protegendo contra ataques man-in-the-middle. Configuração:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  • Content-Security-Policy (CSP): Objetivo: Controla as fontes das quais seu site pode carregar conteúdo, reduzindo o risco de ataques XSS. Configuração (ajuste conforme necessário para os requisitos do seu site):
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';" always;

Outro exemplo de configuração: se for necessário você pode adicionar vários domínios neste cabeçalho apenas mantendo o espaço entre eles, como aqui: *.domain.com *.domain2.com

more_set_headers "Content-Security-Policy default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; style-src-elem 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; font-src 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; script-src-elem 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; img-src 'self' 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; connect-src 'self' 'unsafe-inline' *.domain.com; frame-src 'self' 'unsafe-inline' *.domain.com; manifest-src 'self' 'unsafe-inline'; form-action 'self' 'unsafe-inline'; frame-ancestors 'self'; upgrade-insecure-requests"; 
  • X-Content-Type-Options: Objetivo: Impede que os navegadores interpretem os arquivos como um tipo MIME diferente do declarado pelo servidor, reduzindo o risco de ataques baseados em MIME. Configuração:
add_header X-Content-Type-Options "nosniff" always;
  • X-Frame-Options: Objetivo: Evita que seu site seja incorporado a um iframe, reduzindo o risco de ataques de clickjacking. Configuração:
add_header X-Frame-Options "SAMEORIGIN" always;
  • X-XSS-Protection: Objetivo: Habilita o mecanismo de proteção XSS do navegador. Configuração:
add_header X-XSS-Protection "1; mode=block" always;
  • Referrer-Policy: Objetivo: Controla a quantidade de informações incluídas no cabeçalho do Referer ao navegar de uma página para outra. Configuração:
add_header Referrer-Policy "no-referrer-when-downgrade" always;
  • Feature-Policy: Finalidade: Controla quais recursos da plataforma web são permitidos ou não em uma página. Configuração:
add_header Feature-Policy "geolocation 'self'; microphone 'self'; camera 'self'" always;

Ao implementar esses cabeçalhos de segurança, você cria camadas de defesa contra diversas vulnerabilidades da web, incluindo acesso não autorizado a dados, ataques de injeção e problemas de privacidade. Esses cabeçalhos contribuem para um ambiente web mais seguro, protegendo seu site e seus usuários contra possíveis ameaças e ataques.

Lembre-se de ajustar essas configurações com base em seus requisitos específicos e nas necessidades de seu aplicativo web. Além disso, sempre teste exaustivamente após fazer alterações para garantir que seu site funcione corretamente com os cabeçalhos de segurança adicionados.

Exemplo de configuração, neste exemplo abaixo estou usando um module adicional more_set_headers para incluir novos headers, mas voce pode usar o default add_header.

    server {
        listen        8081;
        server_tokens off;
        
        more_set_headers    "Server";
        more_set_headers    "X-Content-Type-Options nosniff";
        more_set_headers    "Strict-Transport-Security max-age=31536000; includeSubDomains; preload";
        more_set_headers    "Content-Security-Policy default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; style-src-elem 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; font-src 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; script-src-elem 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; img-src 'self' 'self' 'unsafe-inline' 'unsafe-eval' *.domain.com; connect-src 'self' 'unsafe-inline' *.domain.com; frame-src 'self' 'unsafe-inline' *.domain.com; manifest-src 'self' 'unsafe-inline'; form-action 'self' 'unsafe-inline'; frame-ancestors 'self'; upgrade-insecure-requests";        
        
        location / {
            root /usr/share/nginx/html;
            try_files $uri /index.html;

            more_set_headers "Pragma no-cache";
            more_set_headers "Cache-Control max-age=0, no-cache";
        }

        location /assets/ {
           more_set_headers "Cache-Control public max-age=604800";
        }
    }

Links: