Proteção em Servidores Web - Nginx
![]() |
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.
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";
- 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:
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/
- 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";
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: