AWS, Nginx e Django: servidor padrão para evitar cadeias de host falsas

1

Temos uma configuração de servidor com a AWS que deve atender aos seguintes requisitos:

1: solicitações de entrada originadas do balanceador de carga (especificamente, verificações de integridade e verificações de latência) devem ter permissão para acessar os servidores da Web.

2: as solicitações válidas que contêm as sequências de Host corretas devem ter permissão para acessar o servidor da web.

3: Todas as outras solicitações devem ser rejeitadas com a rejeição não padrão Nginx '444', o que significa que elas serão ignoradas.

Além disso, nosso site tem vários subdomínios, cada um executando essencialmente o mesmo código para diferentes clientes. Nós configuramos o Nginx para redirecionar todo o tráfego HTTP para esses subdomínios para https. Vou chamar esses subdomínios "a.example.com", "b.example.com" e "c.example.com".

Nós notamos em nossos registros que nosso código do Django está retornando muitos erros 500 devido a strings 'Host' falsas passando pelo Nginx. As strings de host que estamos vendo para cada uma dessas requisições é "* .example.com", que combina com qualquer um dos nossos subdomínios e, portanto, faz com que seja para o código do Django. Uma vez que essa string do host não é reconhecida, o Django retorna um erro 500.

O que se segue é um resumo aproximado do nosso arquivo disponível no Nginx:

# Repeat this for each subdomain:
server {
    server_name a.example.com;
    listen 80;
    return 301 https://a.example.com$request_uri;
}

server {
    server_name a.example.com;
    listen 443;
    location / {
        set $my_host $host;
        if ($host ~ "\d+\.\d+\.\d+\.\d+") {
            set $my_host "elb.example.com";
        }
    }
}

Nós tentamos capturar esta string host incorreta com a seguinte definição de servidor "buraco negro" no Nginx:

server {
    server_name *.example.com;
    listen 80 default_server;
    listen 443 default_server;
    return 444
}

No entanto, a cadeia do host "* .example.com" corresponde a uma das definições do servidor https e é encaminhada para o código do Django.

O que estou perdendo?

    
por user3934630 17.02.2015 / 18:39

1 resposta

0

Na sua tentativa de configuração, tudo o que você precisava alterar era a variável server_name para algo que não corresponderia a nenhum outro bloco de servidor, mas seria válido, por exemplo, localhost , e deveria ser o servidor com o qual as solicitações voltariam eles não correspondem a nenhum outro nome de host (desde que você o marcou como default_server - isso só complica o uso de um nome de host curinga).

server {
    server_name localhost;
    listen 80 default_server;
    listen 443 default_server;
    return 444
}
    
por 17.02.2015 / 18:56