防范黑客cc攻击,nginx修改配置阻断连接方案
发布于 作者:苏南大叔 来源:程序如此灵动~最近苏南大叔接到了一个服务器维护的委托,主要问题就是服务器被黑客攻占了。经过数天的排查和努力,目前局势已经在掌控之中。那么,黑客的攻击方式和手段是什么呢?苏南大叔给出的防御措施又是什么呢?
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔与互联网络的故事。本文测试环境:centos@7.9
,nginx@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
对攻击行为进行还击,但是,这仅仅是权宜之计。后续,这些黑客还做了哪些攻击行为呢?苏南大叔又是如何处理的呢?请关注后续的文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。