Pesquisa de site

O guia definitivo para proteger, fortalecer e melhorar o desempenho do servidor Web Nginx


Com base nas coisas maravilhosas que você ouviu sobre o Nginx, talvez você tenha decidido tentar. Você pode ter gostado tanto que está pensando em substituir suas instalações do Apache pelo Nginx depois de ler alguns dos artigos sobre o assunto que publicamos neste site.

Nesse caso, tenho certeza de que você receberá este guia de braços abertos, pois abordaremos 12 dicas para aumentar a segurança de seus servidores Nginx (desde manter o Nginx atualizado até usando TLS e redirecionando HTTP para HTTPS), e você notará que alguns deles são muito semelhantes ao que você faria com o Apache.

Não perca:

13 Dicas de segurança e proteção do servidor Web Apache

25 truques do Apache Htaccess para proteger o servidor Web Apache

Ambiente de teste Nginx

Usaremos o seguinte ambiente neste guia:

  1. Debian GNU/Linux 8.1 (jessie).
  2. Endereço IP: 192.168.0.25 (tecmintlovesnginx.com) e 192.168.0.26 (nginxmeanspower.com), conforme descrito no documento virtual baseado em IP seção de hosts em

    1. “Como configurar hosts virtuais baseados em nome e IP (blocos de servidor) com Nginx“
  3. Versão Nginx: nginx/1.6.2.
  4. Para sua comodidade, aqui está o arquivo de configuração final (link Pastebin).

Com isso em mente, vamos começar.

DICA #1: Mantenha o Nginx atualizado

No momento em que este livro foi escrito, as versões mais recentes do Nginx no CentOS (em EPEL) e nos repositórios Debian eram 1.6.3 e 1.6.2-5, respectivamente.

Não perca: Instale a versão estável mais recente do Nginx a partir de repositórios e fontes

Embora instalar software a partir dos repositórios seja mais fácil do que compilar o programa a partir do código-fonte, esta última opção tem duas vantagens: 1) permite construir módulos extras no Nginx (como mod_security) e 2) sempre fornecerá uma versão mais recente do que os repositórios (1.9.9 a partir de hoje). As notas de lançamento estão sempre disponíveis no site do Nginx.

Não perca:

Proteja o Apache contra ataques de força bruta e DDoS usando Mod_Security e Mod_Evasive

DICA #2: Remova módulos desnecessários no Nginx

Para remover explicitamente os módulos do Nginx durante a instalação a partir do código-fonte, faça:

./configure --without-module1 --without-module2 --without-module3

Por exemplo:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Como você provavelmente já deve ter adivinhado, a remoção de módulos de uma instalação anterior do Nginx do código-fonte requer a execução da compilação novamente.

Uma palavra de cautela: As diretivas de configuração são fornecidas por módulos. Certifique-se de não desabilitar um módulo que contém uma diretiva que você precisará no futuro! Você deve verificar a documentação do nginx para obter a lista de diretivas disponíveis em cada módulo antes de tomar uma decisão sobre a desativação dos módulos.

DICA #3: Desative a diretiva server_tokens no Nginx

A diretiva server_tokens diz ao Nginx para exibir sua versão atual nas páginas de erro. Isso não é desejável, pois você não deseja compartilhar essas informações com o mundo para evitar ataques ao seu servidor web causados por vulnerabilidades conhecidas nessa versão específica.

Para desativar a diretiva server_tokens, defina if como off dentro de um bloco de servidor:

server {
    listen       192.168.0.25:80;
    server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
        root   /var/www/tecmintlovesnginx.com/public_html;
        index  index.html index.htm;
}

Reinicie o nginx e verifique as alterações:

DICA nº 4: negar agentes de usuário HTTP no Nginx

Um agente de usuário HTTP é um software usado para negociação de conteúdo em um servidor web. Isso também inclui bots e rastreadores de malware que podem acabar impactando o desempenho do seu servidor web, desperdiçando recursos do sistema.

Para manter mais facilmente a lista de agentes de usuários indesejados, crie um arquivo (/etc/nginx/blockuseragents.rules por exemplo) com o seguinte conteúdo:

map $http_user_agent $blockedagent {
        default         0;
        ~*malicious     1;
        ~*bot           1;
        ~*backdoor      1;
        ~*crawler       1;
        ~*bandit        1;
}

Em seguida, coloque a seguinte linha antes da definição do bloco do servidor:

include /etc/nginx/blockuseragents.rules;

E uma instrução if para retornar uma resposta 403 se a string do agente do usuário estiver na lista negra definida acima:

Reinicie o nginx e todos os agentes de usuário cuja string corresponda à acima serão impedidos de acessar seu servidor web. Substitua 192.168.0.25 pelo IP do seu servidor e sinta-se à vontade para escolher uma string diferente para a opção --user-agent de wget:

wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 

DICA #5: Desative métodos HTTP indesejados no Nginx

Também conhecidos como verbos, os métodos HTTP indicam a ação desejada a ser executada em um recurso servido pelo Nginx. Para sites e aplicativos comuns, você deve permitir apenas GET, POST e HEAD e desativar todos os outros.

Para fazer isso, coloque as seguintes linhas dentro de um bloco de servidor. Uma resposta HTTP 444 significa uma resposta vazia e é frequentemente usada no Nginx para enganar ataques de malware:

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

Para testar, use curl para enviar uma solicitação DELETE e compare o resultado com quando você envia um GET normal:

curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html 

DICA #6: Defina limitações de tamanho de buffer no Nginx

Para evitar ataques de buffer overflow contra seu servidor web Nginx, defina as seguintes diretivas em um arquivo separado (crie um novo arquivo chamado /etc/nginx/conf.d/buffer.conf, por exemplo):

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

As diretivas acima garantirão que as solicitações feitas ao seu servidor web não causarão um buffer overflow no seu sistema. Mais uma vez, consulte a documentação para obter mais detalhes sobre o que cada um deles faz.

Em seguida, adicione uma diretiva include no arquivo de configuração:

include /etc/nginx/conf.d/*.conf;

DICA #7: Limite o número de conexões por IP no Nginx

Para limitar as conexões por IP, use as diretivas limit_conn_zone (em um contexto http ou pelo menos fora do bloco server) e limit_conn (em um http, bloco server ou contexto de localização).

Porém, lembre-se de que nem todas as conexões são contadas – mas apenas aquelas que possuem uma solicitação processada pelo servidor e todo o seu cabeçalho de solicitação foi lido.

Por exemplo, vamos definir o número máximo de conexões como 1 (sim, é um exagero, mas funcionará perfeitamente neste caso) em uma zona chamada addr (você pode definir isso como qualquer nome que desejar):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;

Um teste simples com Apache Benchmark (Perform Nginx Load) onde 10 conexões totais são feitas com 2 solicitações simultâneas nos ajudará a demonstrar nosso ponto:

ab -n 10 -c 2 http://192.168.0.25/index.html

Veja a próxima dica para mais detalhes.

DICA #8: Configurar logs do monitor para Nginx

Depois de realizar o teste descrito na dica anterior, verifique o log de erros que está definido para o bloco do servidor:

Você pode usar grep para filtrar os logs de solicitações com falha feitas à zona add definida na DICA #7:

grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto

Da mesma forma, você pode filtrar o log de acesso para obter informações de interesse, como:

  1. IP do cliente
  2. Tipo de navegador
  3. Tipo de solicitação HTTP
  4. Recurso solicitado
  5. Bloco de servidor que responde à solicitação (útil se vários hosts virtuais estiverem registrando no mesmo arquivo).

E tome as medidas apropriadas se detectar qualquer atividade incomum ou indesejada.

DICA #9: Evite hotlinking de imagens no Nginx

O hotlinking de imagens acontece quando uma pessoa exibe em outro site uma imagem hospedada no seu. Isso causa um aumento no uso da largura de banda (pela qual você paga), enquanto a outra pessoa exibe alegremente a imagem como se fosse sua propriedade. Em outras palavras, é uma perda dupla para você.

Por exemplo, digamos que você tenha um subdiretório chamado img dentro do seu bloco de servidor onde você armazena todas as imagens usadas naquele host virtual. Para evitar que outros sites usem suas imagens, você precisará inserir o seguinte bloco de localização dentro da definição do seu host virtual:

location /img/ {
  valid_referers none blocked 192.168.0.25;
   if ($invalid_referer) {
     return   403;
   }
}

Em seguida, modifique o arquivo index.html em cada host virtual da seguinte forma:

192.168.0.26

192.168.0.25

<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>



<head>

Tecmint adora Nginx

<body>

Tecmint adora Nginx!




Agora navegue até cada site e como você pode ver, a imagem é exibida corretamente em 192.168.0.25, mas é substituída por uma resposta 403 em 192.168.0.26:

Observe que esta dica depende do navegador remoto enviar o campo Referer.

DICA #10: Desative SSL e habilite apenas TLS no Nginx

Sempre que possível, faça o que for necessário para evitar o SSL em qualquer uma de suas versões e use o TLS. Os seguintes ssl_protocols devem ser colocados em um servidor ou contexto http em seu arquivo host virtual ou em um arquivo separado por meio de uma diretiva include (algumas pessoas usam um arquivo chamado ssl.conf , mas depende inteiramente de você):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Por exemplo:

DICA #11: Crie certificados no Nginx

Primeiro, gere uma chave e um certificado. Sinta-se à vontade para usar um tipo diferente de criptografia se desejar:

openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
cp tecmintlovesnginx.key tecmintlovesnginx.key.org
openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt

Em seguida, adicione as seguintes linhas dentro de um bloco de servidor separado em preparação para a próxima dica (redirecionamento http --> https) e mova as diretivas relacionadas ao SSL para o novo bloco também:

server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
}

Na próxima dica verificaremos como nosso site agora está usando certificado autoassinado e TLS.

DICA #12: Redirecione o tráfego HTTP para HTTPS no Nginx

Adicione a seguinte linha ao primeiro bloco do servidor:

return 301 https://$server_name$request_uri;

A diretiva acima retornará uma resposta 301 (Movido permanentemente), que é usada para redirecionamento permanente de URL sempre que uma solicitação for feita para a porta 80 do seu host virtual, e redirecionará a solicitação para o bloco do servidor que adicionado na dica anterior.

A imagem abaixo mostra o redirecionamento e confirma o fato de que estamos usando TLS 1.2 e AES-256 para criptografia:

Resumo

Neste artigo, compartilhamos algumas dicas para proteger seu servidor web Nginx. Adoraríamos saber sua opinião e, se você tiver outras dicas que gostaria de compartilhar com o resto da comunidade, sinta-se à vontade para nos informar enviando-nos uma nota através do formulário de comentários abaixo.