Nginx reenviando hosts no deseados a Django

3

He estado recibiendo errores de Django en mi servidor web (detrás de Nginx / uWSGI) quejándose de que se está accediendo con una solicitud donde Host es la dirección IP del servidor. Nginx usa hosts virtuales, por lo que espero que Host sea siempre el nombre del servidor, por lo que ALLOWED_HOSTS de Django es solo eso.

Invalid HTTP_HOST header: '###.###.###.###'. You may need to add '###.###.###.###' to ALLOWED_HOSTS.

Request repr():
<WSGIRequest
path:/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '',
 'CONTENT_TYPE': '',
 'DOCUMENT_ROOT': '/usr/share/nginx/html',
 'HTTP_HOST': '###.###.###.###',
 'PATH_INFO': '/',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '184.105.139.68',
 'REMOTE_PORT': '45409',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'subdomain.example.net',
 'SERVER_PORT': '443',
 'SERVER_PROTOCOL': 'HTTP/1.1',
 'UWSGI_SCHEME': 'https',
 'uwsgi.core': 1,
 'uwsgi.node': b'subdomain.example.net',
 'uwsgi.version': b'2.0.12',
 'wsgi.errors': <_io.TextIOWrapper name=2 mode='w' encoding='ANSI_X3.4-1968'>,
 'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
 'wsgi.input': <uwsgi._Input object at 0x7f...>,
 'wsgi.multiprocess': True,
 'wsgi.multithread': True,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'https',
 'wsgi.version': (1, 0)}>

Los errores son provocados por 184.105.247.195, 1 o 2 por día, que es propiedad de la "Fundación Shadowserver", por lo que no estoy seguro de que estos (simulacros) ataques sean frustrados con éxito (pero me molestan con un error). código) o si algo extraño está sucediendo ... por ejemplo, cómo / por qué Nginx está pasando una solicitud con un IP Host a un bloque de servidor que tiene el siguiente formato (tengo un bloque de servidor catch-all que rechaza Host- menos solicitudes):

server {
    listen 443;
    server_name abc.example.net;
    # ...
}

Esta respuesta SO me dice cómo configurar Nginx para rechazar solicitudes mal formadas (encabezado Host incorrecto), pero eso parece como un enfoque de cinturón y tirantes.

¿Esto indica que mi cinturón no se ha cerrado correctamente mientras alguien está intentando jadearme?

Como un anexo, está usando SSL (y estoy hospedando múltiples sitios SSL en el mismo puerto, usando SNI para distinguirlos, no estoy seguro de si eso importa ...). Algo así como esta respuesta (a otra pregunta) menciona , ¿el "ataque" consiste en negociar con uno de los Nginx? el servidor bloquea, luego en la solicitud cifrada cambiando el encabezado Host a la IP de mi servidor?

    
pregunta Nick T 23.03.2016 - 23:18
fuente

1 respuesta

1

El problema fue causado por Nginx usando mi host Django como predeterminado, por lo que se le delegó una solicitud de enlace ". La solución fue agregar un servidor predeterminado. El valor predeterminado se usa cuando ningún otro bloque server server_name no coincide con la solicitud. Es elegido por Nginx para ser:

  1. Un servidor listen ing en el puerto (y la dirección, si se especifica) con la propiedad default_server
  2. De lo contrario, el primer bloque de servidor en la configuración.

He modificado el archivo principal /etc/nginx/nginx.conf para incluir bloques de servidor predeterminados implícitos que, ya sea

  • redirige HTTP a lo que sea el host "predeterminado" para el servidor, o
  • cierra las solicitudes HTTPS a nombres de host no válidos.

Este último no tiene impacto en los usuarios porque es imposible obtener un certificado válido para una dirección IP. Solo los rastreadores / clientes extraños que se asoman alrededor de los hosts de IP, ignorando la validez del certificado por alguna extraña razón, son eliminados.

server {
    # Redirect IP request to primary host
    listen 80;
    return 301 https://defaulthost.example.com/;
}
server {
    # Terminate any HTTPS connections made with the IP address as host
    # (or any other unrecognized host).
    listen 443;
    server_name _;

    ssl on;
    # this is just a self-signed cert; there needs to be 
    # a well-formed one for nginx to start
    ssl_certificate /srv/ssl/sham.cer;
    ssl_certificate_key /srv/ssl/sham.key;

    return 444;
}
    
respondido por el Nick T 15.11.2016 - 21:19
fuente

Lea otras preguntas en las etiquetas