Proteção em Servidores Web - Nginx

14:14 Lucas Taraia 0 Comentarios



Imagem: Pixabay

O Nginx é um servidor web que foi lançado em 2004. Desde então, vem ganhando excelente reputação e é usado em milhões de sites com grande numero de acessos. Segundo a W3Techs (site que fornece informações sobre o uso de vários tipos de tecnologias da web), o nginx, é o servidor da web que mais cresce no setor e atualmente ocupa a terceira posição em participação de mercado.

Utilizando a configuração padrão na instalação do Nginx, muitas informações confidenciais são reveladas, o que pode ajudar o hacker na preparação de um ataque, e é por isso que iremos mostrar aqui algumas medidas para fortalecer e tornar seguro seu servidor web.

Este guia pode ser considerado um complemento do artigo sobre segurança em headers já escrito e publicado por Marcos Ferreira aqui no labs.

Todas os procedimentos apresentados abaixo necessitam que seja reiniciado o serviço do nginx para que sejam aplicada as devidas configurações após ocorrerem quaisquer alterações no arquivo de configuração do nginx, comumente disponível em /etc/nginx/nginx.conf.

Utilize os comandos abaixo:

           nginx -t #testa se há erros no arquivo de configuração
           service nginx restart #reinicia o serviço - não aconselhável executar em produção
           nginx -s reload #recarrega o arquivo de configuração - evita downtime - mais aconselhável

Caso apresente algum erro, será apresentado o parâmetro de configuração incorreto e a linha que está causando o erro, do arquivo nginx. Abra o arquivo de configuração e revise as modificações.

É importante que seja feito um backup do arquivo de configuração original antes de realizar qualquer alteração, caso seja necessário restaurar as configurações antigas, o arquivo estará disponível.

- Desativar número de versão do Nginx

Na configuração padrão do Nginx, o banner do cabeçalho de resposta do servidor é ativado, o que expõe a versão do nginx que você está utilizando. Para desativar esta informação exposta, insira no arquivo de configuração o bloco abaixo:

          server_tokens off;

- Desativar assinatura do servidor Nginx

Mesmo executando o processo anterior, ocultando a versão do serviço, o servidor ainda expõe a utilização do Nginx, contudo, você pode manipular essa informação exposta, colocando um nome para identificar o servidor, tal que não exponha nenhuma informação relevante para um possível atacante.
Primeiramente utilize o comando abaixo e  instale o pacote do nginx com módulos e features extras para que seja possível utilizar essa funcionalidade de alteração de banner.

          apt-get install nginx-extras

Agora coloque o bloco abaixo no arquivo de configuração.

          more_set_headers "Server: NomeCustomizadoServer";

- Proteção contra Clickjacking

Quando utilizado, indica ao browser se ele está autorizado ou não a renderizar a página dentro de um frame. A não utilização deste recurso possibilita que um atacante inclua páginas legítimas da empresa em endereços suspeitos.
Um exemplo é criar um domínio falso com formulários de usuário e senha na parte superior do site e inserir a página legítima da empresa logo abaixo.

          add_header X-Frame-Options "SAMEORIGIN";

O cabeçalho acima instruirá o navegador a carregar SOMENTE os recursos da mesma origem.

- Proteção contra XSS

Este cabeçalho pode ser utilizado para configurar uma proteção no navegador contra ataques XSS Reflected. O filtro XSS opera como um componente com visibilidade entre todas as requets/responses que passam pelo browser. Quando o filtro identifica o XSS ele neutraliza a execução do mesmo e emite uma mensagem que o XSS foi bloqueado.

          add_header X-XSS-Protection "1; mode=block";

- Bloquear sniffing de conteúdo Mime-Type

Este cabeçalho é utilizado pelo servidor para impedir que o cabeçalho MIME Type seja modificado. Ele impede que outros tipos de dados sejam recebidos pelo servidor que não sejam os especificados previamente.

          add_header X-Content-Type-Options "nosniff";

- Habilitar HSTS (Strict Transport Security)

Este cabeçalho força a utilização do HTTPS impedindo que sites sejam acessados usando o protocolo HTTP ou que parte do código de um site que está usando HTTPS seja executada em servidores usando o HTTP.

          add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

- Reduz riscos de XSS - Content-Security-Policy

O Content Security Policy é um cabeçalho HTTP que fornece uma whitelist de recursos confiáveis no qual o navegador poderá confiar. Um recurso pode ser um script, CSS, imagem ou outro tipo de arquivo que poderá ser indicado. Isso significa que mesmo se um atacante conseguir injetar um código XSS no seu site, o CSP poderá impedir a sua execução.

          add_header Content-Security-Policy "default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'";

- Referrer Policy

Este cabeçalho indica ao navegador da web como lidar com as informações de referência enviadas aos sites quando um usuário clica em um link que leva a outra página ou site.

          add_header Referrer-Policy "no-referrer";

- Manter somente TLS 1.2

Utilize somente protocolo TLS forte.

          ssl_protocols       TLSv1.2;

- Desativar conjunto de cifras fracas

Chaves e cifras consideradas frágeis devem ser desabilitadas no servidor, ou seja, deve-se preferir o uso de AES no lugar de DES e Triple-DES, pois um usuário malicioso pode forçar o uso de tais cifras para, posteriormente, lançar um ataque de criptoanálise, podendo também aproveitar da vulnerabilidade SWEET32.

          ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM  SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20- POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

- Forçar conexões sob TLS

Insira a linha abaixo no bloco servido de HTTP (porta 80) nas configurações para que seja forçado o uso de criptografia no transporte das informações (TLS).

          return 301 https://$host$request_uri;

O comando acima irá retornar uma resposta 301 (Movido Permanentemente), que é usada para o redirecionamento URL permanente. Sempre que é realizada uma solicitação para a porta 80 do seu host virtual ela será redirecionada para o bloco servido de HTTPS.

- Desativar métodos HTTP indesejados

Geralmente são necessárias apenas as solicitações GET, HEAD, POST e HTTP para aplicações web. Permitir TRACE ou DELETE pode ser arriscado, pois implica em possíveis  ataques de rastreamento entre sites possibilitando que um atacante "roube" as informações contidas nos cookies.

          if ($request_method !~ ^(GET|HEAD|POST)$ )
          {
                    return 405;
          }

Salve o arquivo e reinicie o Nginx. Agora mostrará 405 Não permitido se alguém estiver tentando acessar TRACE, DELETE, PUT, OPTIONS.

- Mantenha o Nginx atualizado

Por último, mas não menos importante, você precisa manter o Nginx atualizado, pois há muitos aprimoramentos de desempenho, correções de segurança e novos recursos sendo adicionados a cada nova versão disponibilizada.

Se você seguiu as etapas acima e executar o comando curl para verificar a resposta do cabeçalho, terá um resultado conforme imagem abaixo:

Imagem: Elaborada pelo autor.

Espero que este post ajude você a manter seu Nginx mais seguro contra agentes maliciosos. 😊

Referências:
https://owasp.org/www-project-secure-headers/
https://cheatsheetseries.owasp.org/cheatsheets/TLS_Cipher_String_Cheat_Sheet.html
https://docs.nginx.com/nginx/admin-guide/security-controls/
https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/

0 comentários: