Pular para o conteúdo
Início » Bloqueio de Acesso Direto por IP para Proteger seu Servidor Nginx

Bloqueio de Acesso Direto por IP para Proteger seu Servidor Nginx

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/nginx

Use 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.crt

Agora 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;
}
END

O 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 -t

nginx: 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 nginx

Ao acessar o IP diretamente no navegador vai ser exibida essa mensagem de erro:

mensagem erro nginx 444

Comentários

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *