Aprenda a configurar o Nginx para bloquear o acesso direto por IP e garantir que apenas solicitações para domínios autorizados sejam processadas, protegendo seu servidor contra ataques que contornam o WAF.
Com apenas algumas linhas de código, você pode configurar o Nginx para bloquear acessos diretos por IP. Isso garante que seu servidor esteja protegido contra atacantes que tentam contornar medidas de segurança, como um WAF, acessando diretamente o IP do servidor.
Um problema para sites que usam Cloudflare é a possibilidade de um atacante descobrir o IP do servidor e realizar ataques diretos, como DOS, sem passar pela proteção. Neste post, você aprenderá a configurar corretamente o default_server do Nginx para bloquear esses acessos diretos por IP, protegendo seu servidor contra esses tipos de ataques.
Verificar se o nginx possui default_server;
grep -Ril "default_server" /etc/nginxUse o grep para buscar na pasta /etc/nginx se existe algum arquivo com o conteúdo “default_server”
Caso já exista e criar outra configuração com a porta 80 ou 443 default_server vai dar erro, então é preciso retirar a opção default_server, principalmente se ela estiver em um domínio.
server {
listen 80 default_server;
server_name meusite.com.br
...Essa configuração acima redireciona para meusite.com.br caso alguém digite diretamente o ip do servidor por exemplo, 200.200.200.200, por isso ela é insegura e pode ser melhorada.
server {
listen 80;
server_name meusite.com.br
...Modifique retirando o default_server e vamos criar uma outra configuração chamada default.
Criar a configuração default porta 80
Crie o arquivo /etc/nginx/conf.d/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
if ($request !~* ^(GET|POST|HEAD)) {
return 444;
}
location = /favicon.ico {
log_not_found off;
access_log off;
return 204;
}
return 403;
}Mas ainda é preciso criar para porta 443 SSL, para isso é preciso de um certificado SSL, vamos criar ele:
Configuração nginx default porta 443
# crie uma pasta ssl dentro de /etc/nginx
mkdir -p /etc/nginx/ssl
# crie o certificado
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/selfsigned.key -out /etc/nginx/ssl/selfsigned.crtAgora temos 2 arquivos necessários para configurar SSL no nginx:
ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;Vamos criar o server que escuta a porta 443:
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
ssl_stapling off;
ssl_stapling_verify off;
if ($request !~* ^(GET|POST|HEAD)) {
return 444;
}
location = /favicon.ico {
log_not_found off;
access_log off;
return 204;
}
return 403;
}Os 2 servers podem estar no mesmo arquivo default em /etc/nginx/conf.d/default.
Configuração final default para nginx
O comando abaixo cria o arquivo e coloca todo conteúdo dentro:
tee /etc/nginx/conf.d/default << END
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
if ($request !~* ^(GET|POST|HEAD)) {
return 444;
}
location = /favicon.ico {
log_not_found off;
access_log off;
return 204;
}
return 444;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
ssl_stapling off;
ssl_stapling_verify off;
if ($request !~* ^(GET|POST|HEAD)) {
return 444;
}
location = /favicon.ico {
log_not_found off;
access_log off;
return 204;
}
return 444;
}
ENDO arquivo também pode ficar em /etc/nginx/sites-enabled/default
Quando o nginx usa essa estrutura os arquivos ficam em /etc/nginx/sites-available/ e são criados links para /etc/nginx/sites-enabled/, use o comando abaixo para criar o link.
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/A configuração do nginx server_name _; aceita qualquer requisição, então qualquer requisição feita que não for qualquer um dos domínios configurados vai para esse server e vai ser retornado erro 444 No Response.
Também foi adicionado a verificação de se a requisição é GET|POST|HEAD se não for nenhuma dessas, também é respondido como 444 No Response.
Agora é preciso testar antes de reiniciar o servidor nginx:
nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Se o resultado foi esse, deu tudo certo e já pode reiniciar ou fazer reload no servidor com o comando:
sudo systemctl restart nginx
sudo systemctl reload nginxAo acessar o IP diretamente no navegador vai ser exibida essa mensagem de erro:
