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:
- Debian GNU/Linux 8.1 (jessie).
-
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
- “Como configurar hosts virtuais baseados em nome e IP (blocos de servidor) com Nginx“
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:
- IP do cliente
- Tipo de navegador
- Tipo de solicitação HTTP
- Recurso solicitado
- 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!