李子

利用openresty防御cc攻击
日常建站过程中难免会遇到cc攻击,导致你的网站无法正常访问,甚至受到经济损失。所以我们不得不自己配置防火墙来规避损...
扫描右侧二维码阅读全文
06
2018/10

利用openresty防御cc攻击

日常建站过程中难免会遇到cc攻击,导致你的网站无法正常访问,甚至受到经济损失。所以我们不得不自己配置防火墙来规避损失。

如果会使用kangle,也可以用kangle来防cc,这里我使用的是nginx+lua的方式,这里我就直接用openresty了。

首先安装春哥的openresty:

安装依赖:

yum -y install wget vim screen make gcc gcc-c++
yum -y install readline-devel pcre pcre-devel openssl-devel gcc

创建id为508的www用户和组:

groupadd -g 508 www
useradd -g www -u 508 -s /sbin/nologin -M www

下载openresty编译并安装:

wget https://openresty.org/download/openresty-1.13.6.2.tar.gz
tar xf openresty-1.13.6.2.tar.gz
cd openresty-1.13.6.2
./configure 
make && make install

/usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful

建立软链接并启动:

ln -s /usr/local/openresty/nginx/sbin/nginx /usr/bin/nginx
/usr/local/openresty/nginx/sbin/nginx

切换到配置文件目录,下载博主提供的anti-cc.tar.gz并解压:

cd /usr/local/openresty/nginx/conf/
tar zxvf anti-cc.tar.gz
解压后的目录名字是waf:
[root@ns1 waf]# pwd
/usr/local/openresty/nginx/conf/waf
[root@ns1 waf]# ll
total 328
drwxr-xr-x 2 www www 266240 Aug 20 18:06 captcha
-rw-r--r-- 1 www www   7290 Oct  5 23:09 config.lua
-rw-r--r-- 1 www www  31357 Aug 20 19:29 guard.lua
drwxr-xr-x 2 www www   4096 Jul 17 19:07 html
-rw-r--r-- 1 www www   5794 Jun 20  2017 init.lua
drwxr-xr-x 2 www www   4096 Oct  5 23:10 logs
-rw-r--r-- 1 www www    100 Jun 20  2017 README.md
-rw-r--r-- 1 www www   2692 Jun 20  2017 runtime.lua
drwxr-xr-x 2 www www   4096 Oct  5 23:07 url-protect

回到上级目录,新建一个配置文件ccwaf.conf,内容如下,

[root@ns1 conf]# pwd
/usr/local/openresty/nginx/conf
[root@ns1 conf]# cat ccwaf.conf 
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
lua_shared_dict guard_dict 100m;
lua_shared_dict dict_captcha 70m;
init_by_lua_file '/usr/local/openresty/nginx/conf/waf/init.lua';
access_by_lua_file '/usr/local/openresty/nginx/conf/waf/runtime.lua';
lua_max_running_timers 1;

然后在nginx主配置文件http段中引用此文件:

http {
...
    include ccwaf.conf;
...
    include vhost/*.conf;
}

下面给www用户设置一个密码(cc255),用于www用户提升权限控制iptables实现异常ip阻断:

[root@ns1 conf]# passwd www
Changing password for user www.
New password: 
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.

该密码需在/usr/local/openresty/nginx/conf/waf/config.lua中配置,其他配置也需要在这里修改。

-- anti-cc实际安装目录。
baseDir = '/usr/local/openresty/nginx/conf/waf/'
-- nginx运行用户的sudo密码,blockAction值为iptables需要设置。
sudoPass = 'cc255',
支持根据请求频率,js人机验证,人工验证码等,根据需要在config中开启即可。

目录说明:

  • 验证码生成目录,默认已生成,如需再次生成可执行php getImg.php:
    /usr/local/openresty/nginx/conf/waf/captcha
  • 指定了需要开启策略的url类型,默认为保护php类型,可以自行增加/api/等:
    /usr/local/openresty/nginx/conf/waf/url-protect
  • 验证码页面前端,可自行修改:
    /usr/local/openresty/nginx/conf/waf/html
  • 拦截日志:
    /usr/local/openresty/nginx/conf/waf/logs

调整openresty目录权限,递归更改属主为www,否则可能会出现500错误。

chown -R www:www /usr/local/openresty/nginx/

添加sudo授权,我这里直接写成了命令方便大家使用,执行添加即可。

#提升www用户权限,用于阻断cc攻击者ip,防止服务器负载上升
sed -i '/group to run networking/i\www  ALL=(root) /sbin/iptables -I INPUT -p tcp -m multiport -s [0-9.]* --dport 80\\,443 -j DROP' /etc/sudoers

我们开启js验证,并在访问频率超过限制后要求输入验证码,如果在验证码页面,十次之内未能通过验证则使用iptables禁止访问服务器,

测试效果:
直接curl请求测试。可以看到并未直接返回网站内容,而是需要js验证。

[root@vultr ~]# curl www.xxx.com/index.php
<script>window.location.href='/index.php?keyjs=16edc723f0&expirejs=1538755850';</script>
[root@vultr ~]# 

然后换客户端浏览器访问www.xxx.com查看,网站正常浏览。

狂刷页面,出现验证码:
607.png
然后错误输入十次,可以看到已经访问不了:
738.png
然后查看服务器防火墙,可以看到恶意ip已经被iptables阻断了。
116.png

cc防火墙就配置好了。使用中规则要按自己实际情况调整,我就不再多介绍了。

Last modification:October 11th, 2018 at 06:08 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment