防cc攻击利器之httpgrard

一、httpgrard介绍

HttpGuard是基于openresty,以lua脚本语言开发的防cc攻击软件。而openresty是集成了高性能web服务器Nginx,以及一系列的Nginx模块,这其中最重要的,也是我们主要用到的nginx lua模块。HttpGuard基于nginx lua开发,继承了nginx高并发,高性能的特点,可以以非常小的性能损耗来防范大规模的cc攻击。

1.1 httpgrard防cc特效

  • 限制访客在一定时间内的请求次数
  • 向访客发送302转向响应头来识别恶意用户,并阻止其再次访问
  • 向访客发送带有跳转功能的js代码来识别恶意用户,并阻止其再次访问
  • 向访客发送cookie来识别恶意用户,并阻止其再次访问
  • 支持向访客发送带有验证码的页面,来进一步识别,以免误伤
  • 支持直接断开恶意访客的连接
  • 支持结合iptables来阻止恶意访客再次连接
  • 支持白名单功能

支持根据统计特定端口的连接数来自动开启或关闭防cc模式

详见github地址https://github.com/centos-bz/HttpGuard

另一个README.md地址https://www.centos.bz/forum/thread-119-1-1.html

1.2 安装

shell 脚本安装 ,开启自动防御

#!/bin/sh
############################################################
# cat /etc/redhat-release
# CentOS release 6.8 (Final)
# uname -r
# 2.6.32-642.13.1.el6.x86_64
############################################################
. /etc/init.d/functions

#Defined result function
function Msg(){
if [ $? -eq 0 ];then
        action "$1" /bin/true
        else
        action "$1" /bin/false
fi
}

OPENRESTY_VERSION=‘1.11.2.2‘
PHP_VERSION=‘5.5.38‘
PYTH="/usr/local/openresty/nginx/conf"
RED_COLOR=‘\E[1;31m‘
RES=‘\E[0m‘

echo -e "$RED_COLOR Transit IP  $RES"
read  -p "Input relay IP: " a

function Install_openresty(){
 id www&>/dev/null
if [ $? -ne 0 ];then
    useradd -s /sbin/nologin -M www
fi
yum install -y readline-devel pcre-devel openssl-devel gcc unzip  &> /dev/null
cd /usr/src/
[ ! -f openresty-${OPENRESTY_VERSION}.tar.gz ] && wget https://openresty.org/download/openresty-1.11.2.2.tar.gz  &> /dev/null
tar xf openresty-${OPENRESTY_VERSION}.tar.gz
cd openresty-${OPENRESTY_VERSION}
./configure --prefix=/usr/local/openresty --with-luajit --with-http_stub_status_module --with-pcre --with-pcre-jit  &> /dev/null
gmake &> /dev/null && gmake install &> /dev/null

[ ! -f master.zip ] && wget --no-check-certificate https://github.com/centos-bz/HttpGuard/archive/master.zip  &> /dev/null
unzip master.zip  &> /dev/null
mv HttpGuard-master $PYTH/waf
cd $PYTH/waf
chown www logs
Msg "Install_openresty"
}

function Configfile_nginx(){
\cp $PYTH/nginx.conf $PYTH/nginx.conf.bak
>$PYTH/nginx.conf
cat >> $PYTH/nginx.conf <<EOF
user  www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    lua_max_running_timers 1;
    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_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass  http://${a};
            proxy_redirect   off;
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
            proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
EOF
sed -i "s#baseDir = ‘/data/www/waf/‘#baseDir = ‘$PYTH/waf/‘#g" $PYTH/waf/config.lua
sed -i ‘90s#Off#On#‘ $PYTH/waf/config.lua
sed -i ‘44s#off#On#‘ $PYTH/waf/config.lua
Msg "Configfile_nginx"
}

function Install_php(){
yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2-devel  &> /dev/null
cd /usr/src/
[ ! -f php-${PHP_VERSION}.tar.gz ] && wget http://cn.php.net/distributions/php-5.5.38.tar.gz  &> /dev/null
tar xf php-${PHP_VERSION}.tar.gz
cd php-${PHP_VERSION}
./configure --with-png-dir --with-freetype-dir --with-jpeg-dir --with-gd --prefix=/usr/local/php  &> /dev/null
make  &> /dev/null && make install &> /dev/null
cd $PYTH/waf/captcha
/usr/local/php/bin/php getImg.php
Msg "Install_php"
}

function Check_openresty(){
/usr/local/openresty/nginx/sbin/nginx -t  &> /dev/null
/usr/local/openresty/nginx/sbin/nginx
if [ `grep "openresty" /etc/rc.local|wc -l` -eq 0 ];then
    echo "/usr/local/openresty/nginx/sbin/nginx" >>/etc/rc.local
fi
Msg "Check_openresty"
}

function Iptables_configure(){
yum -y install ipset  &> /dev/null
iptables -F
/etc/init.d/iptables save &> /dev/null
/etc/init.d/iptables restart &> /dev/null
ipset create forbidip hash:ip timeout 600
iptables -A INPUT -p tcp -m set --match-set forbidip src -m tcp --dport 80 -j DROP
/etc/init.d/iptables save &> /dev/null
chkconfig iptables on
if [ `grep "forbidip" /etc/rc.local|wc -l` -eq 0 ];then
    echo "ipset create forbidip hash:ip timeout 600" >> /etc/rc.local
fi
chkconfig iptables on
Msg "Iptables_configure"
}

function main(){
    Install_openresty
    Configfile_nginx
    Install_php
    Check_openresty
    Iptables_configure
}
main

防御模块介绍

有三种主动防御模式

-- 主动防御,302响应头跳转模块

-- 主动防御,发送js跳转代码模块

-- 主动防御,发送cookie验证模块

具体查看config.lua配置文件

-- state : 为此模块的状态,表示开启或关闭,可选值为On或Off;
        -- keySecret : 用于生成token的密码,如果上面的keyDefine为dynamic,就不需要修改
        -- 主动防御,发送js跳转代码模块。利用cc控制端无法解析js跳转的特点,来识别是否为正常用户,当有必要时才建议开启。
        -- keySecret : 用于生成token的密码,如果上面的keyDefine为dynamic,就不需要修改
        -- urlProtect  同limitReqModules模块中的urlProtect的解释。

        -- state : 为此模块的状态,表示开启或关闭,可选值为On或Off;
        -- keySecret : 用于生成token的密码,如果上面的keyDefine为dynamic,就不需要修改
        -- urlProtect  同limitReqModules模块中的urlProtect的解释。

        -- 自动开启主动防御,原理是根据protectPort端口的已连接数超过maxConnection来确定
        -- state : 为此模块的状态,表示开启或关闭,可选值为On或Off;
        -- interval  间隔30秒检查一次连接数,默认为30秒。
        -- protectPort,maxConnection,normalTimes,exceedTimes :  enableModule中的模块为关闭状态时,当端口protectPort的连接数连续exceedTimes次超过maxConnection时,开启enableModule中的模块;
        -- enableModule中的模块为开启状态时,当端口protectPort的连接数连续normalTimes次低于maxConnection时,关闭enableModule中的模块。
        -- ssCommand  : 我们是使用ss命令来检查特定端口的已连接的连接数,ss命令比同类的命令netstat快得多。请把ss命令的路径改为自己系统上的>路径。
        -- enableModules : 自动启动哪个主动防御模块,可选值为redirectModules JsJumpModules cookieModules
测试:
-- 值为captcha时,表示ip在黑名单后返回带有验证码的页面,输入正确的验证码才允许继续访问网站


当值为blockAction = "forbidden",-- 值为forbidden时,表示ip在黑名单后,服务器会直接断开与用户的连接.

当值为 blockAction = "iptables",时
cat attack-2016-12-29.log
2016-12-29 00:23:52 [WARNING] [limitReqModules] IP 192.168.179.1 visit 51 times,block it.
[[email protected] logs]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  bogon                anywhere            tcp dpt:http 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
封锁时间
        -- 表示http-guard封锁ip的时间
        blockTime = 600,

        -- JsJumpModules redirectModules cookieModules验证通过后,ip在白名单的时间
        whiteTime = 600,

问题点

当这个白名单开启,需在white_ip_list.txt 里写一些IP,否则所有防御失效,这可能是个bug

-- 白名单ip文件,文件内容为正则表达式。

whiteIpModules = { state = "Off", ipList = baseDir.."url-protect/white_ip_list.txt" },

默认只限制php的请求

-- urlProtect : 指定限制请求次数的url正则表达式文件,默认值为\.php$,表示只限制php的请求(当然,当urlMatchMode = "uri"时,此正则才>能起作用)

匹配php等其它

\.(php|htm|html|asp)$

匹配所有

.*

或者

^/$

\.asp.*$

\.php.*$

\.htm.*$

日志太大

好像关不了,可以加个定时任务清理。cat /dev/null > log

1.3、WAF上线

  • 初期上线只记录日志,不开启WAF,防止误杀
  • WAF规则管理使用saltstack工具
  • 要知道并不是有了WAF就安全,存在人为因素

1.4、Modsecurity

Modsecurity原理分析--从防御方面谈WAF的绕过

http://www.tuicool.com/articles/rE3i63n

安装配置

https://github.com/SpiderLabs/ModSecurity/wiki/Compilation-recipes

时间: 2024-11-05 03:42:21

防cc攻击利器之httpgrard的相关文章

OpenResty(nginx扩展)实现防cc攻击

OpenResty(nginx扩展)实现防cc攻击 导读 OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台.这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统 流程图 本文介绍使用openresty来实现防cc攻击的功能.ope

使用Discuz!自带参数防御CC攻击以及原理,修改Discuz X 开启防CC攻击后,不影响搜索引擎收录的方法

这部份的工作,以前花的时间太少. 希望能产生一定的作用. http://www.nigesb.com/discuz-cc-attacker-defence.html http://bbs.zb7.com/thread-8644-1-1.html CC攻击确实是很蛋疼的一种攻击方式,Discuz!的配置文件中已经有了一个自带的减缓CC攻击的参数,在配置文件config.inc.php中: 1 $attackevasive = 0;             // 论坛防御级别,可防止大量的非正常请求

Linux防CC攻击脚本

多数CC攻击在web服务器日志中都有相同攻击的特征,我们可以根据这些特征过滤出攻击的ip,利用iptables来阻止 #!/bin/bash #by LinuxEye #BLOG: http://blog.linuxeye.com OLD_IFS=$IFS IFS=$'n' not_status=`iptables -nvL | grep "dpt:80" | awk '{print $8}'` for status in `cat /usr/local/nginx/logs/word

linux中防CC攻击两种实现方法(转)

CC攻击就是说攻击者利用服务器或代理服务器指向被攻击的主机,然后模仿DDOS,和伪装方法网站,这种CC主要是用来攻击页面的,导致系统性能用完而主机挂掉了,下面我们来看linux中防CC攻击方法. 什么是CC攻击 cc攻击简单就是(ChallengeCollapsar) CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃.CC主要是用来攻击页面的,每个人都有 这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线

(转自张戈博客)Linux系统防CC攻击自动拉黑IP增强版Shell脚本

(转自张戈博客) 前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存黑名单突然无法过滤后台,导致WordPress无法登录!虽然,可以通过修改本地hosts文件来解决这个问题,但是还是想暂时取消CDN加速和防护来测试下服务器的性能优化及安全防护. 前天写的Shell脚本是加入到crontab计划任务执行的,每5分钟执行一次,今天实际测试了下,可还是可以用的,但是感觉5分钟时间有点过长,无法做到严密防护.于是稍微改进了下代码,现在简单的分享下! 一.

iptables防cc攻击

我们可以使用 iptables 来在一定程度上实现 黑洞 抗 CC (连接耗尽)攻击的能力,详细配置如下: 1. 系统要求: 1)LINUX 内核版本:2.6.9-42 ELsmp 或 2.6.9-55 ELsmp (其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的) 2)iptables 版本:1.3.7 2. 安装 iptables 1.3.7(http://www.netfilter.org/projects/iptables/files/iptables-1.3.7.tar.b

Nginx 防CC攻击拒绝代理访问

先大概说说简单的结构…前端一个Nginx反向代理,后端一个Nginx instance app for PHP…实际上就是个Discuz,之前面对CC攻击都是预警脚本或者走CDN,但是这次攻击者不再打流量,而是针对数据库请求页面进行攻击,如search操作…帖子ID F5等..从日志分析来看是从3个URL着手攻击的,当时使用Nginx 匹配$query_string 来return 503…不过会导致页面不能访问,所以想到这么一个折中的办法. 首先你看一段代理请求的NGINX日志: ##通过分析

Linux系统防CC攻击自动拉黑IP增强版Shell脚本

一.Shell代码 #!/bin/bash #Author:ZhangGe #Desc:Auto Deny Black_IP Script. #Date:2014-11-05 #取得参数$1为并发阈值,若留空则默认允许单IP最大50并发(实际测试发现,2M带宽,十来个并发服务器就已经无法访问了!) if [[ -z $1 ]];then num=50 else num=$1 fi #巧妙的进入到脚本工作目录 cd $(cd $(dirname $BASH_SOURCE) && pwd) #

Linux/CentOS防CC攻击脚本

#!/bin/sh cd /var/log/httpd/ cat access_log|awk '{print $1}'|sort|uniq -c|sort -n -r|head -n 20 > a cp /dev/null access_log cp /dev/null error_log cp /dev/null limit.sh cp /dev/null c #awk '{print $2}' a|awk -F. '{print $1"."$2"."$3