精华内容
下载资源
问答
  • 使用NGINX+Openresty实现WAF功能使用NGINX+Openresty实现WAF功能一、了解WAF1.1 什么是WAFWeb应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种...

    使用NGINX+Openresty实现WAF功能

    使用NGINX+Openresty实现WAF功能

    一、了解WAF
    1.1 什么是WAF

    Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保护的一款产品。

    1.2 WAF的功能

    支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
    支持URL白名单,将不需要过滤的URL进行定义。
    支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
    支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
    支持URL参数过滤,原理同上。
    支持日志记录,将所有拒绝的操作,记录到日志中去
    1.3 WAF的特点

    异常检测协议 
    Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。并且,它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。甚至,一些Web应用防火墙还可以严格限定HTTP协议中那些过于松散或未被完全制定的选项。

    增强的输入验证 
    增强输入验证,可以有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
    及时补丁 
    修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。WAF可以为我们做这项工作了——只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,并且没有安装对应的补丁本身就是一种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
    基于规则的保护和基于异常的保护 
    基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。但这需要对用户企业的应用具有十分透彻的了解才可能做到,可现实中这是十分困难的一件事情。
    状态管理 
    WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并且在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
    其他防护技术 
    WAF还有一些安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、响应监视和信息泄露保护。
    1.3WAF与网络防火墙的区别

      网络防火墙作为访问控制设备,主要工作在OSI模型三、四层,基于IP报文进行检测。只是对端口做限制,对TCP协议做封堵。其产品设计无需理解HTTP会话,也就决定了无法理解Web应用程序语言如HTML、SQL语言。因此,它不可能对HTTP通讯进行输入验证或攻击规则分析。针对Web网站的恶意攻击绝大部分都将封装为HTTP请求,从80或443端口顺利通过防火墙检测。 
      一些定位比较综合、提供丰富功能的防火墙,也具备一定程度的应用层防御能力,如能根据TCP会话异常性及攻击特征阻止网络层的攻击,通过IP分拆和组合也能判断是否有攻击隐藏在多个数据包中,但从根本上说他仍然无法理解HTTP会话,难以应对如SQL注入、跨站脚本、cookie窃取、网页篡改等应用层攻击。 
      web应用防火墙能在应用层理解分析HTTP会话,因此能有效的防止各类应用层攻击,同时他向下兼容,具备网络防火墙的功能。

    二、使用nginx配置简单实现403和404
    2.1 小试身手之rerurn 403

    修改nginx配置文件在server中加入以下内容

    set $block_user_agent 0;
    if ($http_user_agent ~ "Wget|AgentBench"){ # 注意if 和(之间要有空格,否则会报错
    set $block_user_agent 1;
    }

    if ($block_user_agent = 1){
    return 403;
    }
    通过其他机器去wget,结果如下

    [root@mini1 ~]# wget http://192.168.3.140
    --2017-05-05 14:14:53-- http://192.168.3.140/
    Connecting to 192.168.3.140:80... connected.
    HTTP request sent, awaiting response... 403 Forbidden
    2017-05-05 14:14:53 ERROR 403: Forbidden.

    2.2小试身手之rerurn 404

    在nginx配置文件中加入如下内容,让访问sql|bak|zip|tgz|tar.gz的请求返回404

    location ~* "\.(sql|bak|zip|tgz|tar.gz)$" {
    return 404;
    }

    NGINX下如何自定义404页面:
    1.创建自己的404.html页面 
    2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 
    3.更改nginx.conf
    中在server 区域加入: error_page 404 /404.html 或者 error_page 404 = http://www.xxx.com/404.html
    4.更改后重启nginx,,测试nginx.conf正确性: /user/local/nginx/sbin/nginx –t

    在网站根目录下放一个.sql
    通过浏览器访问结果如下,404已生效

    三、深入实现WAF
    3.1 WAF实现规划

    分析步骤如下:解析HTTP请求==》匹配规则==》防御动作==》记录日志 
    具体实现如下:

    解析http请求:协议解析模块
    匹配规则:规则检测模块,匹配规则库
    防御动作:return 403 或者跳转到自定义界面
    日志记录:记录到elk中,画出饼图,建议使用json格式


    3.2安装nginx+lua

    由于nginx配置文件书写不方便,并且实现白名单功能很复杂,nginx的白名单也不适用于CC攻击,所以在这里使用nginx+lua来实现WAF,如果想使用lua,须在编译nginx的时候配置上lua,或者结合OpenResty使用,此方法不需要编译nginx时候指定lua

    3.2.1 编译nginx的时候加载lua可以参考

    安装依赖包
    yum install -y gcc gcc-c++ openssl-devel

    环境准备 [root@nginx-lua ~]# cd /usr/local/src 首先,现在Nginx安装必备的Nginx和PCRE软件包。

    [root@nginx-lua src]# wget http://nginx.org/download/nginx-1.9.4.tar.gz
    [root@nginx-lua src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz

    其次,下载当前最新的luajit和ngx_devel_kit (NDK),以及lua-nginx-module
    [root@nginx-lua src]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
    [root@nginx-lua src]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
    [root@nginx-lua src]# wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz

    最后,创建Nginx运行的普通用户 [root@nginx-lua src]# useradd -s /sbin/nologin -M www

    解压NDK和lua-nginx-module

    [root@node1 src]# tar zxvf v0.2.19.tar.gz # 解压后为ngx_devel_kit-0.2.19
    [root@node1 src]# tar -zxvf v0.9.16.tar.gz # 解压后为lua-nginx-module-0.9.16
    [root@node1 src]# tar zxf pcre-8.37.tar.gz

    安装LuaJIT Luajit是Lua即时编译器
    [root@node1 src]# tar zxvf LuaJIT-2.0.4.tar.gz 
    [root@node1 src]# cd LuaJIT-2.0.4
    [root@node1 LuaJIT-2.0.4]# make && make install


    安装Nginx并加载模块(说明该编译方式只能适配nginx1.9.4版本的nginx,1.10和1.12等无法适配)

    [root@node1 nginx-1.9.4]# tar zxf nginx-1.9.4.tar.gz
    [root@node1 src]# cd cd nginx-1.9.4

    [root@node1 nginx-1.9.4]# export LUAJIT_LIB=/usr/local/lib
    [root@node1 nginx-1.9.4]# export LUAJIT_INC=/usr/local/include/luajit-2.0

    [root@node1 nginx-1.9.4]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --add-module=../ngx_devel_kit-0.2.19/ --add-module=../lua-nginx-module-0.9.16/ --with-pcre=/usr/local/src/pcre-8.37

    [root@node1 nginx-1.9.4]# make -j2 && make install # -j2表示同时使用两个任务
    [root@openstack-compute-node5 ~]# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2 #一定创建此软连接,否则报错

    安装完毕后,下面可以测试安装了,修改nginx.conf 增加第一个配置

    location /hello {
    default_type 'text/plain';
    content_by_lua 'ngx.say("hello,lua,heihei")';
    }

    [root@node1 nginx]# /usr/local/nginx-1.9.4/sbin/nginx –t
    [root@node1 nginx]# /usr/local/nginx-1.9.4/sbin/nginx


    3.2.3 Openresty部署

    安装依赖包
    # yum install -y readline-devel pcre-devel openssl-devel

    下载并编译安装openresty(ngx_openresty-1.9.3.2.tar.gz和nginx1.9.4兼容,其他版本无法和nginx1.9.4兼容)
    [root@node1 html]# cd /usr/local/src/
    [root@node1 src]# wget https://openresty.org/download/ngx_openresty-1.9.3.2.tar.gz
    [root@node1 src]# tar -zxf ngx_openresty-1.9.3.2.tar.gz

    [root@node1 src]# cd ngx_openresty-1.9.3.2
    [root@node1 ngx_openresty-1.9.3.2]# ./configure --prefix=/usr/local/openresty-1.9.3.2 --with-luajit --with-http_stub_status_module --with-pcre --with-pcre-jit
    [root@node1 ngx_openresty-1.9.3.2]# gmake && gmake install
    [root@node1 ngx_openresty-1.9.3.2]# ln -s /usr/local/openresty-1.9.3.2/ /usr/local/openresty


    测试openresty安装

    location /hi {
        default_type text/html;
        content_by_lua_block{
        ngx.say('hello openrastry')
      }
    }

    测试并启动openrestry下的nginx
    [root@node1 ngx_openresty-1.9.3.2]# /usr/local/openresty/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf test is successful

    [root@node1 ngx_openresty-1.9.3.2]# pkill nginx
    [root@node1 ngx_openresty-1.9.3.2]# /usr/local/openresty/nginx/sbin/nginx

     

    3.2.4WAF部署

    在github上克隆下代码
    [root@node1 ~]# git clone https://github.com/unixhot/waf.git
    Cloning into 'waf'...
    remote: Counting objects: 75, done.
    remote: Total 75 (delta 0), reused 0 (delta 0), pack-reused 75
    Unpacking objects: 100% (75/75), done.
    [root@node1 ~]# cp -a ./waf/waf /usr/local/openresty/nginx/conf/

    修改Nginx的配置文件,加入(http字段)以下配置。注意路径,同时WAF日志默认存放在/tmp/日期_waf.log
    [root@node1 ~]# vim /usr/local/openresty/nginx/conf/nginx.conf

    #WAF
    lua_shared_dict limit 50m; #防cc使用字典,大小50M
    lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
    init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
    access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";

    [root@node1 ~]# /usr/local/openresty/nginx/sbin/nginx -t
    [root@node1 ~]# /usr/local/openresty/nginx/sbin/nginx -s reload

    根据日志记录位置,创建日志目录

    [root@node1 ~]# mkdir /tmp/waf_logs
    [root@node1 ~]# chown -R www.www /tmp/waf_logs

    3.3学习模块

    3.3.1学习配置模块

    WAF上生产之前,建议不要直接上生产,而是先记录日志,不做任何动作。确定WAF不产生误杀 
    config.lua即WAF功能详解

    # pwd
    # /usr/local/openresty/nginx/conf/waf
    [root@node1 waf]# vim config.lua

    --WAF config file,enable = "on",disable = "off" 
    --waf status 
    config_waf_enable = "on" #是否开启配置
    --log dir 
    config_log_dir = "/tmp/waf_logs" #日志记录地址
    --rule setting 
    config_rule_dir = "/usr/local/nginx/conf/waf/rule-config" 
    #匹配规则缩放地址
    --enable/disable white url 
    config_white_url_check = "on" #是否开启url检测
    --enable/disable white ip 
    config_white_ip_check = "on" #是否开启IP白名单检测
    --enable/disable block ip 
    config_black_ip_check = "on" #是否开启ip黑名单检测
    --enable/disable url filtering 
    config_url_check = "on" #是否开启url过滤
    --enalbe/disable url args filtering 
    config_url_args_check = "on" #是否开启参数检测
    --enable/disable user agent filtering 
    config_user_agent_check = "on" #是否开启ua检测
    --enable/disable cookie deny filtering 
    config_cookie_check = "on" #是否开启cookie检测
    --enable/disable cc filtering 
    config_cc_check = "on" #是否开启防cc攻击
    --cc rate the xxx of xxx seconds 
    config_cc_rate = "10/60" #允许一个ip60秒内只能访问10此
    --enable/disable post filtering 
    config_post_check = "on" #是否开启post检测
    --config waf output redirect/html 
    config_waf_output = "html" #action一个html页面,也可以选择跳转
    --if config_waf_output ,setting url 
    config_waf_redirect_url = "http://www.baidu.com" 
    config_output_html=[[ #下面是html的内容
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <meta http-equiv="Content-Language" content="zh-cn" /> 
    <title>网站防火墙</title> 
    </head> 
    <body> 
    <h1 align="center"> 您的行为已违反本网站相关规定,注意操作规范。</h1>
    </body> 
    </html> 
    ]]

    3.4 学习access.lua的配置

    [root@node1 waf]# pwd
    /usr/local/openresty/nginx/conf/waf
    [root@node1 waf]# cat access.lua 
    require 'init'

    function waf_main()
    if white_ip_check() then
    elseif black_ip_check() then
    elseif user_agent_attack_check() then
    elseif cc_attack_check() then
    elseif cookie_attack_check() then
    elseif white_url_check() then
    elseif url_attack_check() then
    elseif url_args_attack_check() then
    --elseif post_attack_check() then
    else
    return
    end
    end

    waf_main()

    顺序:先检查白名单,通过即不检测;再检查黑名单,不通过即拒绝,检查UA,UA不通过即拒绝;检查cookie;URL检查;URL参数检查,post检查;

    3.5 启用WAF并测试

    3.5.1模拟sql注入即url攻击

    显示效果如下


    日志显示如下,记录了UA,匹配规则,URL,客户端类型,攻击的类型,请求的数据

    [root@node1 waf]# tail -f /tmp/waf_logs/2017-05-05_waf.log 
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:28","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:29","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:29","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}

    3.5.2 使用ab压测工具模拟防cc攻击

    复制代码
    [root@mini1 ~]# ab -n 1000 -c 50 http://192.168.3.140/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking 192.168.3.140 (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software: openresty/1.9.3.2
    Server Hostname: 192.168.3.140
    Server Port: 80
    
    Document Path: /
    Document Length: 612 bytes
    
    Concurrency Level: 50
    Time taken for tests: 0.674 seconds
    Complete requests: 1000
    Failed requests: 989
    (Connect: 0, Receive: 0, Length: 989, Exceptions: 0)
    Write errors: 0
    Non-2xx responses: 989    # config.lua中设置的,60秒内只允许10个请求
    Total transferred: 334731 bytes
    HTML transferred: 178818 bytes
    Requests per second: 1483.92 [#/sec] (mean)
    Time per request: 33.695 [ms] (mean)
    Time per request: 0.674 [ms] (mean, across all concurrent requests)
    Transfer rate: 485.07 [Kbytes/sec] received
    
    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 7
    Processing: 4 32 3.7 32 38
    Waiting: 2 32 3.8 32 38
    Total: 11 33 3.0 33 41
    
    Percentage of the requests served within a certain time (ms)
    50% 33
    66% 34
    75% 34
    80% 34
    90% 35
    95% 36
    98% 37
    99% 38
    100% 41 (longest request)
    复制代码

     

    3.5.3 模拟ip黑名单

    将请求ip放入ip黑名单中

    [root@node1 waf]# echo "192.168.3.84" >>/usr/local/openresty/nginx/conf/waf/rule-config/blackip.rule

    显示结果如下

     

    3.5.4 模拟ip白名单

    将请求ip放入ip白名单中,此时将不对此ip进行任何防护措施,所以sql注入时应该返回404
    [root@node1 waf]# echo "192.168.3.84" >> /usr/local/openresty/nginx/conf/waf/rule-config/whiteip.rule

    显示结果如下

    3.5.5 模拟URL参数检测

    浏览器输入http://192.168.3.140/?id=select * from name where name="jack"
    显示结果如下

    详细规定在arg.rule中有规定,对请求进行了规范

    复制代码
    [root@node1 rule-config]# cat /usr/local/openresty/nginx/conf/waf/rule-config/args.rule 
    \.\./
    \:\$
    \$\{
    select.+(from|limit)
    (?:(union(.*?)select))
    having|rongjitest
    sleep\((\s*)(\d*)(\s*)\)
    benchmark\((.*)\,(.*)\)
    base64_decode\(
    (?:from\W+information_schema\W)
    (?:(?:current_)user|database|schema|connection_id)\s*\(
    (?:etc\/\W*passwd)
    into(\s+)+(?:dump|out)file\s*
    group\s+by.+\(
    xwork.MethodAccessor
    (?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
    xwork\.MethodAccessor
    (gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
    java\.lang
    \$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
    \<(iframe|script|body|img|layer|div|meta|style|base|object|input)
    (onmouseover|onerror|onload)\=
    复制代码

     

    四、防cc攻击利器之httpgrard
    4.1 httpgrard介绍

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

    4.2 httpgrard防cc特效
    限制访客在一定时间内的请求次数
    向访客发送302转向响应头来识别恶意用户,并阻止其再次访问
    向访客发送带有跳转功能的js代码来识别恶意用户,并阻止其再次访问
    向访客发送cookie来识别恶意用户,并阻止其再次访问
    支持向访客发送带有验证码的页面,来进一步识别,以免误伤
    支持直接断开恶意访客的连接
    支持结合iptables来阻止恶意访客再次连接
    支持白名单功能
    支持根据统计特定端口的连接数来自动开启或关闭防cc模式 
    详见github地址https://github.com/centos-bz/HttpGuard

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

    展开全文
  • 转载:https://www.52os.net/articles/nginx-use-modsecurity-module-as-waf.html nginx配合modsecurity实现WAF功能 January 26, 2015 modsecurity原本是Apache上的一款开源waf,可以有效的增强w...

    转载:https://www.52os.net/articles/nginx-use-modsecurity-module-as-waf.html

    nginx配合modsecurity实现WAF功能

    January 26, 2015

    modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。

    一.准备工作

    系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0

    tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz

    modsecurity for Nginxhttps://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz

    OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs

    依赖关系:

    tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:

    yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel

    modsecurty依赖的包:pcre httpd-devel libxml2 apr

    yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel

    二.启用standalone模块并编译

    下载modsecurity for nginx 解压,进入解压后目录执行:

    ./autogen.sh

    ./configure --enable-standalone-module --disable-mlogc

    make

    三.nginx添加modsecurity模块

    在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:

    ./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine

    make && make install

    四.添加规则

    modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。

    1.下载OWASP规则:

    git clone https://github.com/SpiderLabs/owasp-modsecurity-crs

    mv owasp-modsecurity-crs /opt/tengine/conf/

    cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

    2.启用OWASP规则:

    复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。

    编辑modsecurity.conf 文件,将SecRuleEngine设置为 on

    owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。

    Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf

    Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf

    Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf

    Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf

    Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf

    Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf

    Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf

    五.配置nginx

    在需要启用modsecurity的主机的location下面加入下面两行即可:

    ModSecurityEnabled on; 

    ModSecurityConfig modsecurity.conf;

    下面是两个示例配置,php虚拟主机:

    server {

          listen      80;

          server_name 52os.net www.52os.net;


          location ~ \.php$ {

          ModSecurityEnabled on; 

          ModSecurityConfig modsecurity.conf;

          root /web/wordpress;

          index index.php index.html index.htm;


          fastcgi_pass  127.0.0.1:9000;

          fastcgi_index  index.php;

          fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;

          include        fastcgi_params;

          }

      }

    upstream负载均衡:

    upstream 52os.net {

        server 192.168.1.100:8080;

        server 192.168.1.101:8080 backup;

    }

    server {

    listen 80;

    server_name 52os.net www.52os.net;

    location / {

        ModSecurityEnabled on; 

        ModSecurityConfig modsecurity.conf; 

            proxy_pass http://online;

            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;

        }

    }

    六.测试

    我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:


        phpinfo();   

    ?>

    在浏览器中访问:

    http://www.52os.net/phpinfo.php?id=1 正常显示。

    http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。

    http://www.52os.net/phpinfo.php?search=alert('xss');  返回403。

    说明sql注入和xss已经被过滤了

    七、安装过程中排错

    1.缺少APXS会报错

    configure: looking for Apache module support via DSO through APXS

    configure: error: couldn't find APXS

    apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。

    解决方法:

    yum install httpd-devel

    2.没有pcre

    configure: *** pcre library not found.

    configure: error: pcre library is required

    解决方法:

    yum install pcre pcre-devel

    3.没有libxml2

    configure: *** xml library not found.

    configure: error: libxml2 is required

    解决方法:

    yum install  libxml2 libxml2-devel

    4.执行 /opt/tengine/sbin/nginx -m 时有警告

    Tengine version: Tengine/2.1.0 (nginx/1.6.2)

    nginx: [warn] ModSecurity: Loaded APR do not match with compiled!

    原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log

    2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.

    2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded    version="1.3.9"

    2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!

    2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"

    2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"

    2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.

    解决方法,移除低版本的APR (1.3.9)

    yum remove apr

    5.Error.log中有: Audit log: Failed to lock global mutex

    2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock   

    global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]

    解决方法:

    编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:

    SecAuditLogDirMode 0777

    SecAuditLogFileMode 0550

    SecAuditLogStorageDir /var/log/modsecurity

    SecAuditLogType Concurrent

    展开全文
  • 使用NGINX+Openresty实现WAF功能 一、了解WAF1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过...

    使用NGINX+Openresty实现WAF功能

    一、了解WAF
    1.1 什么是WAF

    Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保护的一款产品。

    1.2 WAF的功能

    支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
    支持URL白名单,将不需要过滤的URL进行定义。
    支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
    支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
    支持URL参数过滤,原理同上。
    支持日志记录,将所有拒绝的操作,记录到日志中去
    1.3 WAF的特点

    异常检测协议
    Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。并且,它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。甚至,一些Web应用防火墙还可以严格限定HTTP协议中那些过于松散或未被完全制定的选项。

    增强的输入验证
    增强输入验证,可以有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
    及时补丁
    修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。WAF可以为我们做这项工作了——只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,并且没有安装对应的补丁本身就是一种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
    基于规则的保护和基于异常的保护
    基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。但这需要对用户企业的应用具有十分透彻的了解才可能做到,可现实中这是十分困难的一件事情。
    状态管理
    WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并且在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
    其他防护技术
    WAF还有一些安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、响应监视和信息泄露保护。
    1.3WAF与网络防火墙的区别

      网络防火墙作为访问控制设备,主要工作在OSI模型三、四层,基于IP报文进行检测。只是对端口做限制,对TCP协议做封堵。其产品设计无需理解HTTP会话,也就决定了无法理解Web应用程序语言如HTML、SQL语言。因此,它不可能对HTTP通讯进行输入验证或攻击规则分析。针对Web网站的恶意攻击绝大部分都将封装为HTTP请求,从80或443端口顺利通过防火墙检测。
      一些定位比较综合、提供丰富功能的防火墙,也具备一定程度的应用层防御能力,如能根据TCP会话异常性及攻击特征阻止网络层的攻击,通过IP分拆和组合也能判断是否有攻击隐藏在多个数据包中,但从根本上说他仍然无法理解HTTP会话,难以应对如SQL注入、跨站脚本、cookie窃取、网页篡改等应用层攻击。
      web应用防火墙能在应用层理解分析HTTP会话,因此能有效的防止各类应用层攻击,同时他向下兼容,具备网络防火墙的功能。

    二、使用nginx配置简单实现403和404
    2.1 小试身手之rerurn 403

    修改nginx配置文件在server中加入以下内容

    set $block_user_agent 0;
    if ($http_user_agent ~ "Wget|AgentBench"){ # 注意if 和(之间要有空格,否则会报错
    set $block_user_agent 1;
    }

    if ($block_user_agent = 1){
    return 403;
    }
    通过其他机器去wget,结果如下

    [root@mini1 ~]# wget http://192.168.3.140
    --2017-05-05 14:14:53-- http://192.168.3.140/
    Connecting to 192.168.3.140:80... connected.
    HTTP request sent, awaiting response... 403 Forbidden
    2017-05-05 14:14:53 ERROR 403: Forbidden.

    2.2小试身手之rerurn 404

    在nginx配置文件中加入如下内容,让访问sql|bak|zip|tgz|tar.gz的请求返回404

    location ~* "\.(sql|bak|zip|tgz|tar.gz)$" {
    return 404;
    }

    NGINX下如何自定义404页面:
    1.创建自己的404.html页面
    2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on;
    3.更改nginx.conf
    中在server 区域加入: error_page 404 /404.html 或者 error_page 404 = http://www.xxx.com/404.html
    4.更改后重启nginx,,测试nginx.conf正确性: /user/local/nginx/sbin/nginx –t

    在网站根目录下放一个.sql
    通过浏览器访问结果如下,404已生效

    三、深入实现WAF
    3.1 WAF实现规划

    分析步骤如下:解析HTTP请求==》匹配规则==》防御动作==》记录日志
    具体实现如下:

    解析http请求:协议解析模块
    匹配规则:规则检测模块,匹配规则库
    防御动作:return 403 或者跳转到自定义界面
    日志记录:记录到elk中,画出饼图,建议使用json格式


    3.2安装nginx+lua

    由于nginx配置文件书写不方便,并且实现白名单功能很复杂,nginx的白名单也不适用于CC攻击,所以在这里使用nginx+lua来实现WAF,如果想使用lua,须在编译nginx的时候配置上lua,或者结合OpenResty使用,此方法不需要编译nginx时候指定lua

    3.2.1 编译nginx的时候加载lua可以参考

    安装依赖包
    yum install -y gcc gcc-c++ openssl-devel

    环境准备 [root@nginx-lua ~]# cd /usr/local/src 首先,现在Nginx安装必备的Nginx和PCRE软件包。

    [root@nginx-lua src]# wget http://nginx.org/download/nginx-1.9.4.tar.gz
    [root@nginx-lua src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz

    其次,下载当前最新的luajit和ngx_devel_kit (NDK),以及lua-nginx-module
    [root@nginx-lua src]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
    [root@nginx-lua src]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
    [root@nginx-lua src]# wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz

    最后,创建Nginx运行的普通用户 [root@nginx-lua src]# useradd -s /sbin/nologin -M www

    解压NDK和lua-nginx-module

    [root@node1 src]# tar zxvf v0.2.19.tar.gz # 解压后为ngx_devel_kit-0.2.19
    [root@node1 src]# tar -zxvf v0.9.16.tar.gz # 解压后为lua-nginx-module-0.9.16
    [root@node1 src]# tar zxf pcre-8.37.tar.gz

    安装LuaJIT Luajit是Lua即时编译器
    [root@node1 src]# tar zxvf LuaJIT-2.0.4.tar.gz
    [root@node1 src]# cd LuaJIT-2.0.4
    [root@node1 LuaJIT-2.0.4]# make && make install


    安装Nginx并加载模块(说明该编译方式只能适配nginx1.9.4版本的nginx,1.10和1.12等无法适配)

    [root@node1 nginx-1.9.4]# tar zxf nginx-1.9.4.tar.gz
    [root@node1 src]# cd cd nginx-1.9.4

    [root@node1 nginx-1.9.4]# export LUAJIT_LIB=/usr/local/lib
    [root@node1 nginx-1.9.4]# export LUAJIT_INC=/usr/local/include/luajit-2.0

    [root@node1 nginx-1.9.4]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --add-module=../ngx_devel_kit-0.2.19/ --add-module=../lua-nginx-module-0.9.16/ --with-pcre=/usr/local/src/pcre-8.37

    [root@node1 nginx-1.9.4]# make -j2 && make install # -j2表示同时使用两个任务
    [root@openstack-compute-node5 ~]# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2 #一定创建此软连接,否则报错

    安装完毕后,下面可以测试安装了,修改nginx.conf 增加第一个配置

    location /hello {
    default_type 'text/plain';
    content_by_lua 'ngx.say("hello,lua,heihei")';
    }

    [root@node1 nginx]# /usr/local/nginx-1.9.4/sbin/nginx –t
    [root@node1 nginx]# /usr/local/nginx-1.9.4/sbin/nginx


    3.2.3 Openresty部署

    安装依赖包
    # yum install -y readline-devel pcre-devel openssl-devel

    下载并编译安装openresty(ngx_openresty-1.9.3.2.tar.gz和nginx1.9.4兼容,其他版本无法和nginx1.9.4兼容)
    [root@node1 html]# cd /usr/local/src/
    [root@node1 src]# wget https://openresty.org/download/ngx_openresty-1.9.3.2.tar.gz
    [root@node1 src]# tar -zxf ngx_openresty-1.9.3.2.tar.gz

    [root@node1 src]# cd ngx_openresty-1.9.3.2
    [root@node1 ngx_openresty-1.9.3.2]# ./configure --prefix=/usr/local/openresty-1.9.3.2 --with-luajit --with-http_stub_status_module --with-pcre --with-pcre-jit
    [root@node1 ngx_openresty-1.9.3.2]# gmake && gmake install
    [root@node1 ngx_openresty-1.9.3.2]# ln -s /usr/local/openresty-1.9.3.2/ /usr/local/openresty


    测试openresty安装

    location /hi {
        default_type text/html;
        content_by_lua_block{
        ngx.say('hello openrastry')
      }
    }

    测试并启动openrestry下的nginx
    [root@node1 ngx_openresty-1.9.3.2]# /usr/local/openresty/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf test is successful

    [root@node1 ngx_openresty-1.9.3.2]# pkill nginx
    [root@node1 ngx_openresty-1.9.3.2]# /usr/local/openresty/nginx/sbin/nginx

    3.2.4WAF部署

    在github上克隆下代码
    [root@node1 ~]# git clone https://github.com/unixhot/waf.git
    Cloning into 'waf'...
    remote: Counting objects: 75, done.
    remote: Total 75 (delta 0), reused 0 (delta 0), pack-reused 75
    Unpacking objects: 100% (75/75), done.
    [root@node1 ~]# cp -a ./waf/waf /usr/local/openresty/nginx/conf/

    修改Nginx的配置文件,加入(http字段)以下配置。注意路径,同时WAF日志默认存放在/tmp/日期_waf.log
    [root@node1 ~]# vim /usr/local/openresty/nginx/conf/nginx.conf

    #WAF
    lua_shared_dict limit 50m; #防cc使用字典,大小50M
    lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
    init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
    access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";

    [root@node1 ~]# /usr/local/openresty/nginx/sbin/nginx -t
    [root@node1 ~]# /usr/local/openresty/nginx/sbin/nginx -s reload

    根据日志记录位置,创建日志目录

    [root@node1 ~]# mkdir /tmp/waf_logs
    [root@node1 ~]# chown -R www.www /tmp/waf_logs

    3.3学习模块

    3.3.1学习配置模块

    WAF上生产之前,建议不要直接上生产,而是先记录日志,不做任何动作。确定WAF不产生误杀
    config.lua即WAF功能详解

    # pwd
    # /usr/local/openresty/nginx/conf/waf
    [root@node1 waf]# vim config.lua

    --WAF config file,enable = "on",disable = "off"
    --waf status
    config_waf_enable = "on" #是否开启配置
    --log dir
    config_log_dir = "/tmp/waf_logs" #日志记录地址
    --rule setting
    config_rule_dir = "/usr/local/nginx/conf/waf/rule-config"
    #匹配规则缩放地址
    --enable/disable white url
    config_white_url_check = "on" #是否开启url检测
    --enable/disable white ip
    config_white_ip_check = "on" #是否开启IP白名单检测
    --enable/disable block ip
    config_black_ip_check = "on" #是否开启ip黑名单检测
    --enable/disable url filtering
    config_url_check = "on" #是否开启url过滤
    --enalbe/disable url args filtering
    config_url_args_check = "on" #是否开启参数检测
    --enable/disable user agent filtering
    config_user_agent_check = "on" #是否开启ua检测
    --enable/disable cookie deny filtering
    config_cookie_check = "on" #是否开启cookie检测
    --enable/disable cc filtering
    config_cc_check = "on" #是否开启防cc攻击
    --cc rate the xxx of xxx seconds
    config_cc_rate = "10/60" #允许一个ip60秒内只能访问10此
    --enable/disable post filtering
    config_post_check = "on" #是否开启post检测
    --config waf output redirect/html
    config_waf_output = "html" #action一个html页面,也可以选择跳转
    --if config_waf_output ,setting url
    config_waf_redirect_url = "http://www.baidu.com"
    config_output_html=[[ #下面是html的内容
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="zh-cn" />
    <title>网站防火墙</title>
    </head>
    <body>
    <h1 align="center"> 您的行为已违反本网站相关规定,注意操作规范。</h1>
    </body>
    </html>
    ]]

    3.4 学习access.lua的配置

    [root@node1 waf]# pwd
    /usr/local/openresty/nginx/conf/waf
    [root@node1 waf]# cat access.lua
    require 'init'

    function waf_main()
    if white_ip_check() then
    elseif black_ip_check() then
    elseif user_agent_attack_check() then
    elseif cc_attack_check() then
    elseif cookie_attack_check() then
    elseif white_url_check() then
    elseif url_attack_check() then
    elseif url_args_attack_check() then
    --elseif post_attack_check() then
    else
    return
    end
    end

    waf_main()

    顺序:先检查白名单,通过即不检测;再检查黑名单,不通过即拒绝,检查UA,UA不通过即拒绝;检查cookie;URL检查;URL参数检查,post检查;

    3.5 启用WAF并测试

    3.5.1模拟sql注入即url攻击

    显示效果如下


    日志显示如下,记录了UA,匹配规则,URL,客户端类型,攻击的类型,请求的数据

    [root@node1 waf]# tail -f /tmp/waf_logs/2017-05-05_waf.log
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:28","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:29","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}
    {"user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.133 Safari\/537.36","rule_tag":"\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$","req_url":"\/abc.sql","client_ip":"192.168.3.84","local_time":"2017-05-05 17:06:29","attack_method":"Deny_URL","req_data":"-","server_name":"localhost"}

    3.5.2 使用ab压测工具模拟防cc攻击

    [root@mini1 ~]# ab -n 1000 -c 50 http://192.168.3.140/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking 192.168.3.140 (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software: openresty/1.9.3.2
    Server Hostname: 192.168.3.140
    Server Port: 80
    
    Document Path: /
    Document Length: 612 bytes
    
    Concurrency Level: 50
    Time taken for tests: 0.674 seconds
    Complete requests: 1000
    Failed requests: 989
    (Connect: 0, Receive: 0, Length: 989, Exceptions: 0)
    Write errors: 0
    Non-2xx responses: 989    # config.lua中设置的,60秒内只允许10个请求
    Total transferred: 334731 bytes
    HTML transferred: 178818 bytes
    Requests per second: 1483.92 [#/sec] (mean)
    Time per request: 33.695 [ms] (mean)
    Time per request: 0.674 [ms] (mean, across all concurrent requests)
    Transfer rate: 485.07 [Kbytes/sec] received
    
    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 7
    Processing: 4 32 3.7 32 38
    Waiting: 2 32 3.8 32 38
    Total: 11 33 3.0 33 41
    
    Percentage of the requests served within a certain time (ms)
    50% 33
    66% 34
    75% 34
    80% 34
    90% 35
    95% 36
    98% 37
    99% 38
    100% 41 (longest request)
    

    3.5.3 模拟ip黑名单

    将请求ip放入ip黑名单中

    [root@node1 waf]# echo "192.168.3.84" >>/usr/local/openresty/nginx/conf/waf/rule-config/blackip.rule

    显示结果如下

    3.5.4 模拟ip白名单

    将请求ip放入ip白名单中,此时将不对此ip进行任何防护措施,所以sql注入时应该返回404
    [root@node1 waf]# echo "192.168.3.84" >> /usr/local/openresty/nginx/conf/waf/rule-config/whiteip.rule

    显示结果如下

    3.5.5 模拟URL参数检测

    浏览器输入http://192.168.3.140/?id=select * from name where name="jack"
    显示结果如下

    详细规定在arg.rule中有规定,对请求进行了规范

    [root@node1 rule-config]# cat /usr/local/openresty/nginx/conf/waf/rule-config/args.rule 
    \.\./
    \:\$
    \$\{
    select.+(from|limit)
    (?:(union(.*?)select))
    having|rongjitest
    sleep\((\s*)(\d*)(\s*)\)
    benchmark\((.*)\,(.*)\)
    base64_decode\(
    (?:from\W+information_schema\W)
    (?:(?:current_)user|database|schema|connection_id)\s*\(
    (?:etc\/\W*passwd)
    into(\s+)+(?:dump|out)file\s*
    group\s+by.+\(
    xwork.MethodAccessor
    (?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
    xwork\.MethodAccessor
    (gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
    java\.lang
    \$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
    \<(iframe|script|body|img|layer|div|meta|style|base|object|input)
    (onmouseover|onerror|onload)\=
    

    四、防cc攻击利器之httpgrard
    4.1 httpgrard介绍

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

    4.2 httpgrard防cc特效
    限制访客在一定时间内的请求次数
    向访客发送302转向响应头来识别恶意用户,并阻止其再次访问
    向访客发送带有跳转功能的js代码来识别恶意用户,并阻止其再次访问
    向访客发送cookie来识别恶意用户,并阻止其再次访问
    支持向访客发送带有验证码的页面,来进一步识别,以免误伤
    支持直接断开恶意访客的连接
    支持结合iptables来阻止恶意访客再次连接
    支持白名单功能
    支持根据统计特定端口的连接数来自动开启或关闭防cc模式
    详见github地址https://github.com/centos-bz/HttpGuard

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

    展开全文
  • 阿里云CDN WAF功能,是指CDN融合了云盾Web应用防火墙(Web Application Firewall,简称 WAF)能力,在CDN节点上提供安全防护的功能,该功能目前已经开放公测。 WAF是什么 Web应用防火墙是通过监控网站上的...

    阿里云CDN WAF功能,是指CDN融合了云盾Web应用防火墙(Web Application Firewall,简称 WAF)能力,在CDN节点上提供安全防护的功能,该功能目前已经开放公测。

    WAF是什么

    Web应用防火墙是通过监控网站上的HTTP/HTTPS访问请求和自定义过滤规则,来启用Web攻击防护、安全合规等功能,可以帮助用户有效部署网站访问控制。

    阿里云WAF基于云安全大数据,可用于防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,并过滤海量恶意CC攻击,避免网站资产数据泄露,保障网站的安全与可用性。

    CDN WAF能解决什么问题

    用户可以基于CDN服务更便捷地接入WAF功能,确保网站在使用CDN加速的同时,免受因外部恶意攻击而导致的意外损失。在金融、电商、O2O、互联网+、游戏、政府、保险等行业中,使用CDN WAF功能后,可以解决以下问题:
    • 防数据泄密,避免因黑客的注入入侵攻击,导致网站核心数据被拖库泄露。
    • 阻止木马上传网页篡改,保障网站的公信力。
    • 提供虚拟补丁,针对网站被曝光的最新漏洞,最大可能地提供快速修复规则。

    关于计费
    开启WAF功能后,CDN WAF会对此域名的所有请求进行检测,并按照账户维度,对域名开启WAF功能的请求次数汇总,然后收费。
    公测期间,请求数按每小时计算。WAF的计费规则如下:

    计费案例:以用户A和用户B分别在2019年2月28日10:20开通了2个域名的CDN WAF功能为例,他们产生的费用如下表所示:

    展开全文
  • WAF专题1--WAF功能

    2019-05-26 21:15:48
    那么WAF有什么功能呢? 防火墙都是防御性的产品,有防就有攻,要了解WAF有什么功能,就要从攻击者的角度去思考。 攻击的目的要么是为了利益,要么是为了炫技。目前攻击者大多都是闷声发大财,很少会为了炫技而惹上...
  • 使用NGINX+LUA实现WAF功能 一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过...
  • 本文先从网站客户的角度谈等保2.0时代网站防护的必要性,再指出等保时代没有WAF功能的IDC会怎么样,以及该如何做。 已经是等保2.0时代了。 国家已非常重视网络安全、网站安全。 等保2.0时代,对网站运营者...
  • 什么是WAF Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web...
  • WAF功能整理总结

    2019-06-17 10:55:59
    根据网上一些资料,从概念、功能、部署简单整理了一下。可能不是很全,届时再进行完善补充
  • modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器 一.准备工作 系统:centos 6.5 64位、 ...
  • 根据国际权威机构WASC(Web Application Security Consortium )和OWASP(Open Web Application Security Project)的分析,国内外的信息安全厂商当前能防范的...纵观国内外的WAF产品,针对这些攻击的检测手段也各有特色。
  • WAF功能优化

    2014-08-31 00:38:00
     6)使通用的黑客工具(上面提到的)在WAF面前无语。  OEM主要出现在两个地方:    产品界面:源代码中,只能出现一次出现,OEM信息,例如公司名称,产品名称,其他地方均引用变量。    产品...
  • waf的配置采用大神的github的方案:[链接 https://github.com/unixhot/waf](https://www.lixdx.cn/2021/05/04/nginx1/) 但是在部署到openresty的时候出现了如下的报错,无脑的在网上找到一篇文章,按照网上的说法...
  • 使用NGINX+LUA实现WAF功能

    千次阅读 2018-10-16 10:52:57
    一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全...
  • 使用NGINX+实现WAF功能

    2016-11-24 15:11:52
    一、了解WAF1.1 什么是WAFWeb应用防护系统(也称:网站应用级***防御系统 。英文:Web Application Firewall,简称: WAF)。...1.2 WAF功能支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。支...
  • Waf功能、分类与绕过

    2021-01-12 16:56:22
    waf 工作原理 Web 应用防火墙是通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护的一款产品。 常见的系统攻击分为两类: 一是利用 Web 服务器的漏洞进行攻击,如 DDOS 攻击、病毒木马破坏等攻击...
  • 一、了解WAF1.1 什么是WAFWeb应用防护系统(也称:网站应用级***防御系统 。英文:Web Application Firewall,简称: WAF)。...1.2 WAF功能支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。支...
  • 6.将waf功能模块,解压后重命名为waf(并移动到nginx的配置目录下) mv /data/ngx_lua_waf-0.7.2/ waf cp -rf /data/waf/ /data/nginx/conf/ 7.修改waf模块的规则配置路径 8.vim /data/nginx/conf/waf/config.lua ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,381
精华内容 4,152
关键字:

waf功能