HTTP_HOST 标头无效。NGINX 配置无法阻止来自 IP 端口扫描器的 localhost 无效标头影响 django

HTTP_HOST 标头无效。NGINX 配置无法阻止来自 IP 端口扫描器的 localhost 无效标头影响 django

我的服务器出现无效主机头错误,我不确定如何解决它。

错误请求 URL 为https://127.0.0.1:8000显而易见的建议是将 localhost 添加到我的(使用 django)允许的主机中。但是,我读到过,在生产环境中将 localhost 保留在允许的主机中是一种不好的做法,并且可能存在安全漏洞。目前,我在生产环境中允许的主机仅限于我注册的域。

我做了一些调查,发现这些请求似乎来自 IP 端口扫描器。在电子邮件报告中,我有时可以在 HTTP_USER_AGENT 中看到指向此类扫描器存储库的 GitHub 链接。HTTP_X_FORWARDED_FOR 几乎总是某个 VPN 提供商,或者位于莫斯科或北京。

这是我当前的 nginx 配置。我实施了其他帖子中的一些建议,例如自定义 if 正则表达式过滤,但似乎没有效果。

除了这个问题之外,其他一切似乎都按预期运行。任何帮助都将不胜感激。第一次设置这样的功能,所以请指出任何明显的错误。

# File: /etc/nginx/sites-available/app

server_tokens               off;
access_log                  /var/log/nginx/app.access.log;
error_log                   /var/log/nginx/app.error.log;

server {
    listen                  80 default_server;
    return                  444;
}

server {
    server_name             app.example.com;
    listen                  80;
    return                  301 https://$host$request_uri;
}

server {

    # Custom regex if statement to 444 any unexpected host header
    if ( $host !~* ^(app.example.com|example.com)$ ) {
        return 444;
    }

    location /static {
        autoindex           on;
        alias               /path/to/django/staticfiles;
    }
    
    # Pass on requests to guinicorn listening on http://localhost:8000
    location / {
        proxy_pass      http://localhost:8000;
        include         /etc/nginx/proxy_params;
        proxy_redirect  off;
    }

    listen              443 ssl;
    server_name         app.example.com;
    ssl_certificate     /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         CIPHER;
}

答案1

您缺少default_serverHTTPS 块。因此,通过 HTTPS 对任何主机的所有请求都会传递到您的app.example.com server块中(我将其更改为示例域)。

对于默认服务器,您的配置应如下所示:

server {
    listen 80 default_server;
    listen 443 default_server ssl;

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

    return 444;
}

我在此块中使用系统的自签名证书/密钥。例如,在基于 Debian 的系统中,有/etc/ssl/private/ssl-cert-snakeoil.key/etc/ssl/certs/ssl-cert-snakeoil.pem

然后你需要删除ifapp.example.com块中的块。

相关内容