Рейтинг:0

Недопустимый заголовок HTTP_HOST. Конфигурация NGINX не предотвращает недопустимые заголовки localhost от сканеров IP-портов, поражающих django

флаг jm

Я получаю сообщение об ошибке Invalid Host header от своего сервера и не знаю, как с этим справиться.

URL-адрес запроса ошибок https://127.0.0.1:8000 и очевидное предложение состоит в том, чтобы добавить localhost к моим (использующим django) РАЗРЕШЕННЫМ хостам. Однако я читал, что сохранение локального хоста в разрешенных хостах в производстве - это плохая практика и потенциальная брешь в безопасности. На данный момент мои разрешенные хосты в prod ограничены моим зарегистрированным доменом.

Я немного покопался, кажется, что эти запросы исходят от сканеров IP-портов. В отчете по электронной почте я иногда вижу ссылки GitHub в HTTP_USER_AGENT на такие репозитории сканера. А HTTP_X_FORWARDED_FOR почти всегда либо какой-то VPN-провайдер, либо находится в Москве или Пекине.

Вот моя текущая конфигурация nginx. Я реализовал несколько предложений из других сообщений, таких как пользовательская фильтрация регулярных выражений, но, похоже, это не дало эффекта.

Помимо этой проблемы, все остальное, кажется, работает как задумано. Любая помощь будет принята с благодарностью. Впервые настраиваю что-то подобное, поэтому, пожалуйста, укажите на очевидные ошибки.

# Файл: /etc/nginx/sites-available/app

server_tokens отключены;
журнал_доступа /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log;

сервер {
    слушать 80 default_server;
    вернуть 444;
}

сервер {
    имя_сервера app.example.com;
    слушать 80;
    вернуть 301 https://$host$request_uri;
}

сервер {

    # Пользовательское регулярное выражение if для 444 любого неожиданного заголовка хоста
    если ( $хост !~* ^(app.example.com|example.com)$ ) {
        вернуть 444;
    }

    местоположение/статический {
        включен автоиндекс;
        псевдоним /path/to/django/staticfiles;
    }
    
    # Передача запросов на прослушивание guinicorn на http://localhost:8000
    место расположения / {
        proxy_pass http://localhost:8000;
        включить /etc/nginx/proxy_params;
        прокси_перенаправление выключено;
    }

    слушать 443 ssl;
    имя_сервера app.example.com;
    ssl_certificate /путь/к/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ШИФР;
}
Рейтинг:1
флаг us

Вам не хватает default_server блокировка для HTTPS. Поэтому все запросы к любому хосту через HTTPS передаются в ваш app.example.com сервер block (я изменил его на пример домена).

Ваша конфигурация должна выглядеть следующим образом для сервера по умолчанию:

сервер {
    слушать 80 default_server;
    слушать 443 default_server ssl;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    вернуть 444;
}

В этом блоке я использую самоподписанный сертификат/ключ системы. Например, в системах на базе Debian есть /etc/ssl/private/ssl-cert-snakeoil.key и /etc/ssl/certs/ssl-cert-snakeoil.pem.

Затем нужно удалить если блокировать в своем app.example.com блокировать.

Atayls avatar
флаг jm
Спасибо, я попробую. В SSL-сертификате я могу просто продублировать свои текущие строки SSL, но в измененном блоке сервера по умолчанию. Нет проблем с наличием строк сертификата дважды в двух отдельных блоках?
флаг us
Это один из вариантов.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.