• 开源nginx_lua_waf部署安装


     

    0x01 前言

    ngx_lua_waf实现 WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。

    原版本主要的功能如下:

    1.防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
    
    2.防止svn/备份之类文件泄漏
    
    3.防止ApacheBench之类压力测试工具的攻击
    
    4.屏蔽常见的扫描黑客工具,扫描器
    
    5.屏蔽异常的网络请求
    
    6.屏蔽图片附件类目录php执行权限
    
    7.防止webshell上传

    二次改造后的规则拦截功能:

    1.支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
    
    2.支持URL白名单,将不需要过滤的URL进行定义。
    
    3.支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    
    4.支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
    
    5.支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
    
    6.支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
    
    7.支持URL参数过滤,原理同上。
    
    8.支持日志记录,将所有拒绝的操作,记录到日志中去。
    
    9.日志记录为JSON格式,便于日志分析,例如使用ELKStack进行攻击日志收集、存储、搜索和展示

     

    0x02  Nginx + Lua部署

    系统环境:centos7.0x64

     

    1.进入到/usr/local/src目录下

    [root@localhost src]# cd /usr/local/src

    2.分别下载Nginx安装必备的NginxPCRE软件包以及当前最新的luajitngx_devel_kit (NDK)软件包和春哥编写的lua-nginx-module

    [root@localhost src]# wget http://nginx.org/download/nginx-1.9.4.tar.gz
    
    [root@localhost src]#wget https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz  --no-check-certificate

    [root@localhost src]#wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
    
    [root@localhost src]#
    
    wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz  --no-check-certificate
    
    [root@localhost src]#
    
    wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz  --no-check-certificate

    3. 创建Nginx运行的普通用户

    [root@nginx-lua src]# useradd -s /sbin/nologin -M www

    4.分别在当前目录下解压已下载的软件包

    [root@localhost src]# tar zxvf v0.2.19.tar.gz
    
    [root@localhost src]# tar zxvf v0.9.16.tar.gz

    [root@localhost src]# tar  zxvf pcre-8.37.tar.gz

    [root@localhost src]# tar zxvf LuaJIT-2.0.4.tar.gz

    5. 安装Luajit以及需要编译的gcc编译环境。

    [root@localhost src]# cd LuaJIT-2.0.3
    
    [root@localhost src]#yum install gcc
    
    [root@localhost src]# make && make install

    6. 安装Nginx并加载模块以及需要编译的openssl模块和c++模块。

    [root@localhost LuaJIT-2.0.4]# cd ..
    
    [root@localhost src]# tar  zxvfnginx-1.9.4.tar.gz

    [root@localhost src]# export LUAJIT_LIB=/usr/local/lib
    
    [root@localhost src]# export LUAJIT_INC=/usr/local/include/luajit-2.0

    [root@localhost nginx-1.9.4]# yum -y install openssl openssl-devel

    [root@localhost 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@localhost nginx-1.9.4]# yum -y install gcc-c++

    [root@localhost nginx-1.9.4]# make -j2 && make install

    7. 创建软连接动态库连接

    [root@localhost nginx-1.9.4]#  ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

    8.启动nginx服务

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

    9关闭centos7自带的防火墙

    [root@localhost nginx-1.9.4]#  sed -i 7s/enforcing/disabled/ /etc/selinux/config
    
    [root@localhost nginx-1.9.4]#  systemctl stop firewalld.service

    10.远程访问http:// 172.16.89.145,显示页面如下,表示已成功安装nginx

    11.安装git服务

    [root@localhost src]# yum install git

    12.克隆下载ngx_lua_waf, nginx安装路径假设为:/usr/local/nginx/conf/

    ngx_lua_waf下载到conf目录下,解压命名为waf

    [root@localhost src]# git clone https://github.com/loveshell/ngx_lua_waf.git
    
    [root@localhost ngx_lua_waf]# cd /usr/local/nginx/conf/
    
    [root@localhost conf]# mkdir  waf

    [root@localhost ngx_lua_waf]#cp -R /usr/local/src/ngx_lua_waf/*   /usr/local/nginx/conf/waf/

    注意,其主要目录信息如下:

    ├── config.lua          #waf的配置文件
    ├── init.lua            #读取waf的规则文件
    ├── install.sh            #waf安装文件,需要做修改
    ├── README.md        #说明文档
    ├── wafconf            #规则库
    │   ├── args            #get请求的参数过滤规则
    │   ├── cookie        #cookie过滤规则
    │   ├── post            #post请求过滤规则
    │   ├── url            #get请求的URL过滤规则
    │   ├── user-agent        #user-agent过滤规则
    │   └── whiteurl        #白名单
    └── waf.lua            #waf规则执行文件

     

    13.nginx.conf中的http段进行配置

    [root@localhost waf]# vi /usr/local/nginx/conf/nginx.conf

    大概的配置信息如下,Nginx.conf:

    lua_package_path "/usr/local/nginx/conf/waf/?.lua";
    
    lua_shared_dict limit 10m;
    
    init_by_lua_file/usr/local/nginx/conf/waf/init.lua;
    
    access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

    14.修改ngx_lua_waf下的config.lua文件

    root@localhost waf]# vi /usr/local/nginx/conf/waf/config.lua
    
    [root@localhost logs]# mkdir waf

    配置详细信息如下,config.lua:

    RulePath = "/usr/local/nginx/conf/waf/wafconf/"
        --规则存放目录
        attacklog = "off"
        --是否开启攻击信息记录,需要配置logdir
        logdir = "/usr/local/nginx/logs/waf/"
        --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
        UrlDeny="on"
        --是否拦截url访问
        Redirect="on"
        --是否拦截后重定向
        CookieMatch = "on"
        --是否拦截cookie攻击
        postMatch = "on" 
        --是否拦截post攻击
        whiteModule = "on" 
        --是否开启URL白名单
        black_fileExt={"php","jsp"}
        --填写不允许上传文件后缀类型
        ipWhitelist={"127.0.0.1"}
        --ip白名单,多个ip用逗号分隔
        ipBlocklist={"1.0.0.1"}
        --ip黑名单,多个ip用逗号分隔
        CCDeny="on"
        --是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
        CCrate = "100/60"
        --设置cc攻击频率,单位为秒.
        --默认1分钟同一个IP只能请求同一个地址100次
        html=[[Please go away~~]]
        --警告内容,可在中括号内自定义
        备注:不要乱动双引号,区分大小写

    15.重启nginx服务

    /usr/local/nginx/sbin/nginx   -s     reload

    16.访问带恶意的连接地址,出现如下信息表示ngx_lua_waf已部署成功。

    http://172.16.89.145/?s=../etc/passwd

    0x03 记录WAF日志拦截记录

    1.logs日志记录添加授权用户www(该用户是nginx运行的用户)

    [root@localhost waf]# chown  -R www.www   /usr/local/nginx/logs/waf/

    2.logs目录进行添加写入权限。

    [root@localhost waf]# chmod  700/usr/local/nginx/logs/waf/

    3.可查看WAF记录的日志信息

    [root@localhost waf]# cat localhost_2018-06-05_sec.log

     

     

    0x04 其他规则说明

    过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割
                   args里面的规则get参数进行过滤的
                   url是只在get请求url过滤的规则                      
                   post是只在post请求过滤的规则                       
                   whitelist是白名单,里面的url匹配到不做过滤                 
                   user-agent是对user-agent的过滤规则
    默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可日志文件名称格式如下:虚拟主机名_sec.log

    0x05 总结

    1.Nginx_lua_waf总体来说功能强大,相比其他软件防火墙Modsecurity还稍微简单点。
    2.Ngx_lua_wafbug主要就是防火墙策略写的不严谨导致的,会造成两种结果:一是部分***通过伪装绕过防火墙;二是防火墙策略配置不当会造成误杀。
    3.另外根据站点的类型需要配置不同的策略,默认配置后全局生效。比如论坛等比较特殊允许很多html插入,这样的策略需要更宽松。
    4.最后生成的hack记录日志可以通过ELK分析,ELK这边需要根据日志格式制作特殊模版,此模版能兼容大部分日志类型,还有少部分完全没有规律的日志分析不了。
    5.最后ELK能展示日志分析结果分类,但是还不能区分各种ruletag类型***属于哪一种直白的表示出来。
    6.最后建议ngx_lua_waf如果真的要用可以考虑在部分源站站点少量试用,前端站点不建议使用,等对该软件理解深入后才可线上使用。
    7.补充:目前对ngx_lua_waf拒绝特定的user agent、拒绝特定后缀文件访问、防止sql注入三大类比较熟悉。
     
    计划大概实施步骤:
    1.不要一次性部署上线,先部署后,只记录日志,然后观察和调整规则,保证正常的请求不会被误防。
    2.使用SaltStack管理规则库的更新。
    3.使用ELKStack进行日志收集和分析,非常方便的可以在Kibana上做出一个漂亮的统计的饼图。(目前也能实现)
     
  • 相关阅读:
    python 安装impala包
    Hive表导出成csv文件
    linux sed命令详解
    Android--Sensor传感器
    Android--ColorMatrix改变图片颜色
    Android--Matrix图片变换处理
    Android--使用Canvas绘图
    Android--从系统Camera和Gallery获取图片优化
    Android--从系统Gallery获取图片
    Android--Tween补间动画
  • 原文地址:https://www.cnblogs.com/backlion/p/9439253.html
Copyright © 2020-2023  润新知