欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

软WAF的另一种思路:基于Openresty+Naxsi的WAF实现

来源:本站整理 作者:erwinlic 时间:2018-05-10 TAG: 我要投稿

目前软WAF的开发,大部分都采用Nginx+Lua基于openresty的方式,安全防护策略如果是基于lua正则匹配http请求内容的话,在加载了大量的防护规则后,nginx的性能会大大降低。
本文采用了lua+naxsi整合的方式,使用lua来实现如cc攻击的防护、IP访问频率限制等相对复杂的安全防护策略,使用Naxsi来防护相对简单的http请求内容策略规则,有效的扬长避短,大大提升nginx 防护性能。
0×01 WAF功能
Naxsi在本WAF中主要实现基于http请求内容的防护策略规则,用于防护一些常见的漏洞,如:
SQL注入攻击 XSS攻击 目录遍历漏洞 命令注入攻击 虚拟补丁 扫描器攻击等
Lua在本waf中主要负责实现相对复杂的安全防护策略,如cc攻击防护、全局IP访问频率限制、特定url访问频率限制、ip黑白名单防护、url白名单防护、http请求转发等功能。
WAF管理后台可实现WAF节点的统一管理,本WAF可以基于云WAF模式部署或者直接嵌入到应用现有的nginx的方式部署。
0×02 WAF架构

0×03 WAF管理后台
由于WAF使用了两个独立的nginx模块,所以需要两套完全不同的配置文件。naxsi模块的防护规则配置需要以文件的形式下发到nginx节点,Lua代码也需要以文件的形式下发到nginx节点。为实现文件的下发和同步,我们将配置文件放到WAF的管理端,由WAF的nginx节点定期通过http访问管理端下载配置文件。
其中naxsi的配置文件建议和lua的代码分开存放。

配置文件的管理,为了防止修改配置文件出错而造成nginx运行异常,我们通过python脚本结合nginx检查配置文件是是否正确,并且做到了配置文件有更新才去服务端拉取文件并且reload nginx,避免了频繁的reload nginx节点。
def get_rules_file(rulesdir,rulesfile):
    for filename in os.listdir(rulesdir):
        if filename not in  ['files.txt', 'files.md5', 'get_naxsi-rules.py', 'install_naxsi_rules.py']:
            CalcMD5(rulesdir,filename,rulesfile)
def CalcMD5(path,filename,rulesfile):
    filepath = path + filename
    with open(filepath,'rb') as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        hash = md5obj.hexdigest()
        rulesfile.write(filename + ';,' + hash + '\n')
        print filename + ';,' + hash
def calc_files_md5(filedir,fimename):
    files_md5 = open(fimename,"w")
    filepath = filedir + 'files.txt'
    with open(filepath,'rb') as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        hash = md5obj.hexdigest()
        files_md5.write(hash)
    f.close()
def check_rules():
    check = commands.getstatusoutput("/usr/local/nginx/sbin/nginx -t")
    if check[0] == 0:
        pattern = re.compile(r'test is successful')
        match = pattern.search(check[1])
        if match:
            msg = "rules update successful"
            print msg
            get_rules_file(rulesdir,naxsi_rulesfile)
            naxsi_rulesfile.close()
            calc_files_md5(rulesdir,naxsi_md5_file)
            get_rules_file(lua_waf_dir, lua_waf_file)
            lua_waf_file.close()

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载