最近苏南大叔接到了一个服务器维护的委托,主要问题就是服务器被黑客攻占了。经过数天的排查和努力,目前局势已经在掌控之中。那么,黑客的攻击方式和手段是什么呢?苏南大叔给出的防御措施又是什么呢?

苏南大叔:防范黑客cc攻击,nginx修改配置阻断连接方案 - nginx-conf-cc
防范黑客cc攻击,nginx修改配置阻断连接方案(图1-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔与互联网络的故事。本文测试环境:centos@7.9nginx@1.20.2。黑客使用了非常多的攻击方式,本文中苏南大叔就仅仅描述防御cc攻击的故事。当然,防御的措施也有很多种,本文中仅仅是其中一个非常基础的操作。

容器的基本情况

测试服务器是用于提供www服务的容器,对外暴露端口80,内部安装有mariadb/php/nginx等。非常典型的小型站点传统配置类型。

nginx配置如下:

server{
    #...
    include /www/server/panel/vhost/nginx/*.conf;
}

站点vhost配置如下:

server
{
    #...
    location / {
        #...
    }
}
CC的攻击原理也比较简单,就是对一些那些比较耗费资源应用页面不停的发出请求,从而达到消耗资服务器资源的目的,在web应用中,查询数据库,读写硬盘文件的等操作都是比较消耗资源的。

当服务器被僵尸网络攻击的时候,服务器出现无法打开,反应迟钝,远程无法登录(超时或非常慢)等现象,整个服务器拒绝服务。

暂停nginx服务

因为服务器被攻击的非常厉害,做出任何操作都非常困难。阿里云方面,还一直发送警告短信邮件。真心让人心急又上火。通过苏南大叔最喜欢的winscp客户端进行链接后,无法下载源码,表现为超时。

通过putty进入了服务器命令行模式,然后强制关停了nginx服务。

nginx -s stop
关停了服务器的话,就无法进行日志分析了。

当关停nginx服务后,服务器压力瞬时减轻,就可以正常上传下载文件了。果断下载保存重要文件,查看服务器日志。

启动nginx命令:nginx -s start
重载nginx配置命令:nginx -s reload

winscp联动putty的方法,可以点击下面的连接:

分析问题

通过观察服务器日志,可以发现:短时间内,黑客使用了大量僵尸网络,发动了潮水一般的攻击。主要的特点是:
访问某个页面,然后在页面后添加了一些随机参数。例如:

/article/read/id/111?details?a=24fda.txt
/article/read/id/111?details?abc=fdaeagt.txt

攻击的早期,都是访问同一个连接地址的。攻击的后期,对访问地址进行了变更。例如:

/article/read/id/123?details?a=24fda.txt
/article/read/id/156?details?abc=fdaeagt.txt

根据url屏蔽

修改nginx配置,对cc攻击的链接地址进行403封锁。也就是说,访问这些被攻击的页面的时候,直接返回403错误码,舍小保大。

站点配置如下:

server
{
    #...
    location / {
        #...
        location ~ /article/read/id/103 {
                return 403;
        }
    }
}

这里nginx配置使用了~~*操作符,它们的主要意思就是使用正则表达式。所以,对于后期,大量的被攻击链接出现后,这里的配置又做了修改。

~ 意思是不区分大小写,~* 意思是区分大小写。
server
{
    #...
    location / {
        #...
        location ~ /article/read/id/(1496|103|1454|1163|89|1595|1163) {
                return 403;
        }
        if ($request_uri ~ (eval|insert|group|select)){
                return 403;
        }
        #if ($query_string ~ (eval|insert|group|select)){
        #        return 403;
        #}
    }
}
上面的这个配置,是根据目标服务器日志进行设置的。和大家的情况一定不一致,请不要原版照抄。请分析的利用。

通过保存文件,nginx -s reload之后,大部分的cc攻击就被挡住了,开启了nginx之后,服务器暂时恢复正常。

$request_uri / $args / $query_string 是有区别的,请期待后续文章。

根据ua屏蔽

这里还根据nginx日志里面显示的ua,对ua进行了屏蔽。

server
{
    #...
    location / {
        #...
        if ($http_user_agent ~ "Go-http-client/1.1"){
                return 403;
        }
        if ($http_user_agent ~ "Go-http"){
                return 403;
        }
        if ($http_user_agent ~ (Scrapy|Curl|HttpClient|Java|wget|curl|qdesk)) {
                return 403; 
        }
    }
}

根据ip屏蔽

查获可疑的ip之后,可以在nginx配置里面给deny掉。

server
{
    #...
    location / {
        #...
        deny 192.168.1.1;
        deny 192.168.1.0/24;
        deny 10.1.1.0/16;
        # deny  all;
        #...
    }
}

也可以把这些deny语句单独放置在一个文件中,比如:

server
{
    #...
    location / {
        #...
        include ip.conf
        #...
    }
}

ip.conf文件:

deny 192.168.1.1;
deny 192.168.1.0/24;
deny 10.1.1.0/16;

这里如果自己测试的话,使用自己的ip做测试也是可以的。需要注意的是:

  • 自己的ip请以nginx那边检测的为准,而不要使用第三方网络上面检测到了。两者很可能不一样。
  • ip可以使用带掩码的范围段表达式,比如:/16或者/24之类的表达。
  • 使用自己的ip做测试的话,只是nginx屏蔽了ip而已。使用ssh还是可以很容易的对配置文件做修改的。所以,这里并不存在悖论。

相关文章

nignx配置相关文章:

以前别的服务器被攻击的时候,选择过的方案:

结束语

本文使用nginx对攻击行为进行还击,但是,这仅仅是权宜之计。后续,这些黑客还做了哪些攻击行为呢?苏南大叔又是如何处理的呢?请关注后续的文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。