O guia final para proteger, endurecer e melhorar o desempenho do Nginx Web Server

O guia final para proteger, endurecer e melhorar o desempenho do Nginx Web Server
Dicas de endurecimento de segurança nginx

Com base nas coisas maravilhosas que você ouviu sobre Nginx, Talvez você tenha decidido tentar. Você pode ter gostado tanto que está pensando em substituir as instalações do Apache pelo Nginx depois de passar por alguns dos artigos sobre o tópico que publicamos neste site.

Nesse caso, tenho certeza que você receberá este guia de braços abertos, já que vamos cobrir 12 dicas para aumentar a segurança do seu nginx Os servidores (que vão manter o NGINX atualizado até o uso do uso do TLS e redirecionar o 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 endurecimento do servidor da Web Apache

25 truques do Apache HTACCESS para proteger o Apache Web Server

Ambiente de teste nginx

Usaremos o seguinte ambiente neste guia:

  1. Debian GNU/Linux 8.1 (Jessie).
  2. Endereço de IP: 192.168.0.25 (Tecmintlovesnginx.com) e 192.168.0.26 (NginxMeanSpower.com), conforme descrito na seção de hosts virtuais baseados em IP em
    1. “Como configurar hosts virtuais baseados em nomes e baseados em IP (blocos de servidores) com nginx“
  3. Versão nginx: nginx/1.6.2.
  4. Para sua conveniência, 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 da redação deste artigo, as mais recentes versões Nginx no CentOS (em EPEL) e os repositórios do Debian são 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 fonte

Embora a instalação do software 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 que você construa módulos extras em 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 da 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 da fonte, faça:

# ./Configure --without-module1 ---without-module2 ---without-module3 

Por exemplo:

# ./Configure --without-http_dav_module ---withouthttp_spdy_module 

Como você provavelmente imaginará, a remoção de módulos de uma instalação anterior do NGINX da fonte requer executar a compilação novamente.

Uma palavra de cautela: Diretivas de configuração são fornecidas por módulos. Certifique -se de não desativar um módulo que contenha uma diretiva que você precisará no caminho! Você deve verificar os documentos nginx para obter a lista de diretrizes disponíveis em cada módulo antes de tomar uma decisão sobre os módulos de desativação.

Dica #3: Desativar a Diretiva Server_tokens no Nginx

O Server_tokens A Diretiva 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 em seu servidor web causado por vulnerabilidades conhecidas nessa versão específica.

Para desativar o Server_tokens Diretiva, defina se para desligar dentro de um bloco de servidor:

Servidor Ouça 192.168.0.25:80; server_tokens desativado; server_name tecmintlovesnginx.com www.Tecmintlovesnginx.com; access_log/var/www/logs/tecmintlovesnginx.acesso.registro; error_log/var/www/logs/tecmintlovesnginx.erro.erro de log; root/var/www/tecmintlovesnginx.com/public_html; ÍNDICE ÍNDICE.Índice HTML.htm;  

Reinicie o nginx e verifique as alterações:

Ocultar informações da versão nginx

Dica #4: negar agentes de usuário HTTP no Nginx

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

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

mapa $ http_user_agent $ bloqueado padrão 0; ~*malicioso 1; ~*bot 1; ~*backdoor 1; ~*rastreador 1; ~*bandit 1;  

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

Incluir/etc/nginx/BlockUseragents.regras; 

E uma instrução IF para retornar uma resposta 403 se a sequência do agente do usuário estiver na lista preta definida acima:

Desativar agentes de usuários no nginx

Reinicie o nginx e todos os agentes de usuários cuja string corresponde que o acima será impedido de acessar seu servidor da web. Substituir 192.168.0.25 com o IP do seu servidor e fique à vontade para escolher uma string diferente para o --agente de usuário interruptor de wget:

# wget http: // 192.168.0.25/índice.html # wget-user-agent "eu sou um bandido haha" http: // 192.168.0.25/índice.html 
Bloquear agentes de usuário no nginx

Dica #5: Desative os métodos HTTP indesejados no Nginx

Também conhecido como verbos, os métodos HTTP indicam a ação desejada a ser tomada em um recurso servido pela Nginx. Para sites e aplicativos comuns, você deve permitir apenas PEGAR, PUBLICAR, e CABEÇA e desativar todos os outros.

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

if ($ request_method !~ ^(Get | head | post) $) return 444;  

Para testar, use ondulação para enviar um EXCLUIR solicitar e comparar a saída com quando você enviar um regular PEGAR:

# curl -x exclua http: // 192.168.0.25/índice.html # curl -x post http: // 192.168.0.25/índice.html 
Desativar solicitações HTTP indesejadas no nginx

Dica #6: Defina as limitações do tamanho do buffer no Nginx

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

client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; grande_client_header_buffers 2 1k; 

As diretivas acima garantirão que as solicitações feitas ao seu servidor da web não causarão um excesso de buffer em seu sistema. Mais uma vez, consulte os documentos para obter mais detalhes sobre o que cada um deles faz.

Em seguida, adicione uma diretiva incluída no arquivo de configuração:

incluir/etc/nginx/conf.d/*.conf; 
Defina o tamanho do buffer no nginx

Dica #7: limite o número de conexões por ip no nginx

Para limitar as conexões por IP, use o limite_conn_zone (em um contexto HTTP ou pelo menos fora do bloco do servidor) e limite_conn (em diretivas HTTP, servidor ou contexto de localização).

No entanto, lembre -se de que nem todas as conexões são contadas - mas apenas aquelas que têm 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 para 1 (Sim, é um exagero, mas fará o trabalho muito bem neste caso) em uma zona chamada Addr (você pode definir isso para qualquer nome que desejar):

limite_conn_zone $ binary_remote_addr zone = addr: 5m; limite_conn addr 1; 
Número limite de solicitações HTTP no Nginx

Um teste simples com o benchmark Apache (execute a carga nginx) onde 10 As conexões totais são feitas com 2 Solicitações simultâneas nos ajudarão a demonstrar nosso ponto:

# ab -n 10 -c 2 http: // 192.168.0.25/índice.html 

Veja a próxima dica para obter mais detalhes.

Dica #8: Configurar logs do monitor para nginx

Depois de executar o teste descrito na dica anterior, verifique o log de erros definido para o bloco do servidor:

Log de erro nginx

Você pode querer usar grep Para filtrar os logs para solicitações falhadas feitas para o adicionarr Zona definida em Dica #7:

# grep addr/var/www/logs/tecmintlovesnginx.erro.Log - -Color = Auto 
Monitoramento do log nginx

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 respondendo à solicitação (útil se vários hosts virtuais estiverem logando no mesmo arquivo).

E tomar medidas apropriadas se você detectar qualquer atividade incomum ou indesejada.

Dica #9: Evite o Hotlinking de imagem em Nginx

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

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

Localização / IMG / Vidid_Referers Nenhum bloqueado 192.168.0.25; if ($ invalid_referer) return 403;  

Em seguida, modifique o índice.html Arquivo em cada host virtual da seguinte forma:

192.168.0.26

192.168.0.25





Nginx significa poder


Nginx significa poder!








Tecmint adora nginx


Tecmint adora nginx!




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

Desativar o HotLinking de imagem nginx

Observe que esta dica depende do navegador remoto que envia o campo do referente.

Dica nº 10: desative o SSL e ative apenas o TLS no nginx

Sempre que possível, faça o que for preciso para evitar Ssl em qualquer uma de suas versões e uso TLS em vez de. A seguir ssl_protocols deve ser colocado em um servidor ou contexto HTTP no seu arquivo de host virtual ou é um arquivo separado por meio de uma diretiva incluída (algumas pessoas usam um arquivo nomeado ssl.conf, Mas depende de você):

ssl_protocols tlsv1 tlsv1.1 TLSV1.2; 

Por exemplo:

Desative o SSL e habilite TLS em Nginx

Dica #11: Crie certificados no Nginx

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

# OpenSSL Genrsa -aes256 -Out Tecmintlovesnginx.chave 1024 # OpenSSL Req -New -Key Tecmintlovesnginx.Chave -Out tecmintlovesnginx.CSR # CP Tecmintlovesnginx.Tecmintlovesnginx da chave.chave.org # openssl rsa -no tecmintlovesnginx.chave.org -out tecmintlovesnginx.chave # openSSL x509 -req -Days 365 -N Tecmintlovesnginx.CSR -SignKey Tecmintlovesnginx.Chave -Out tecmintlovesnginx.Crt 

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

Servidor Ouça 192.168.0.25: 443 SSL; server_tokens desativado; server_name tecmintlovesnginx.com www.Tecmintlovesnginx.com; root/var/www/tecmintlovesnginx.com/public_html; ssl_certificate/etc/nginx/sites-inabled/certs/tecmintlovesnginx.CRT; ssl_certificate_key/etc/nginx/sites-enabled/certs/tecmintlovesnginx.chave; ssl_protocols tlsv1 tlsv1.1 TLSV1.2;  

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

Dica #12: Redirecionar o tráfego HTTP para HTTPS no Nginx

Adicione a seguinte linha ao primeiro bloco de servidor:

retornar 301 https: // $ server_name $ request_uri; 
Redirecionar http para https em nginx

A diretiva acima retornará um 301 (Movido permanentemente) Resposta, 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 de servidor que adicionamos 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:

Verifique a criptografia tls nginx

Resumo

Neste artigo, compartilhamos algumas dicas para proteger seu servidor web nginx. Gostaríamos muito de ouvir o que você pensa e, se você tiver outras dicas que gostaria de compartilhar com o resto da comunidade, fique à vontade para nos informar enviando uma nota usando o formulário de comentário abaixo.