草庐IT

NGINX安全防护之基于ngx_lua的web应用防火墙

wyy962653920 2023-03-28 原文
NGINX安全防护

 

ngx_lua_waf安装说明文档

作者github地址:

https://github.com/loveshell/ngx_lua_waf

 

转自作者说明文档:

ngx_lua_waf是我一个基于ngx_lua的web应用防火墙。 代码很简单,开发初衷主要是使用简单,高性能和轻量级。 现在开源出来.其中包含我们的过滤规则。如果大家有什么建议和想fa,欢迎和我一起完善。   用途: 用于过滤post,get,cookie方式常见的web攻击 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,×××F等web攻击 防止svn/备份之类文件泄漏 防止ApacheBench之类压力测试工具的攻击 屏蔽常见的扫描黑客工具,扫描器 屏蔽异常的网络请求 屏蔽图片附件类目录php执行权限 防止webshell上传   推荐安装: 请自行给nginx安装ngx_lua模块,推荐lujit2.0做lua支持 请提前新建/data/logs/hack/目录攻击日志,并赋予nginx用户对该目录的写入权限。   配置文件添加: 在http段添加 lua_need_request_bodyon;(开启post请求) access_by_lua_file/usr/local/nginx/conf/waf.lua;   规则更新: 考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和redis之类东西做动态管理。 规则更新可以把规则文件放置到其他服务器,通过crontab任务定时下载来更新规则,nginx reload即可生效。以保障ngx lua waf的高性能 只记录过滤日志,不开启过滤,在代码里在check前面加上–注释即可,如果需要过滤,反之   一些说明: 过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割 global是全局过滤文件,里面的规则对post和get都过滤 get是只在get请求过滤的规则 post是只在post请求过滤的规则 whitelist是白名单,里面的url匹配到不做过滤 user-agent是对user-agent的过滤规则   默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分–注释即可 日志文件名称格式如下:虚拟主机名_sec.log 欢迎大家到http://bbs.linuxtone.org多多交流 weibo:[@ppla](http://weibo.com/opscode) 感谢ngx_lua模块的开发者[@agentzh](https://github.com/agentzh/),春哥是我见过开源精神最好的人之一   本文记录如何安装ngx_lua模块 nginx_lua_module是由淘宝的工程师清无(王晓哲)和春来(章亦春)所开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力

 

http://wiki.nginx.org/HttpLuaModule

 

1下载luajit2.0并安装

http://luajit.org/download.html

wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz

 

直接使用源码make && make install

所以lib和include是直接放在/usr/local/lib和usr/local/include

 

2下载nginx源码解压

wget  http://nginx.org/download/nginx-1.2.7.tar.gz

注意版本号,如果机子上已经装了nginx,不想升级的话,请使用/to/nginx/sbin/nginx -v 来查看版本号

tar -zxvf  nginx-1.8.0.tar.gz

 

下载ngx_devel_kit解压

 

https://github.com/simpl/ngx_devel_kit/tags

wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz

tar-zxvf  v0.2.18

 

4  下载nginx_lua_module解压

 

https://github.com/chaoslawful/lua-nginx-module/tags

 

wge thttps://github.com/openresty/lua-nginx-module/archive/v0.10.1rc1.tar.gz

tar-zxvf v0.10.1rc1.tar.gz

 

5 进入nginx源码文件夹

cd nginx-1.2.7/

 

6 导入环境变量,编译

exportLUAJIT_LIB=/usr/local/lib    #这个很有可能不一样

exportLUAJIT_INC=/usr/local/include/luajit-2.0 #这个很有可能不一样

 

./configure–prefix=/usr/local/nginx\    #nginx的安装路径

--add-module=/usr/local/src/ngx_devel_kit-0.2.18\   #ngx_devel_kit 的源码路径

–add-module=--add-module=/usr/local/src/lua-nginx-module-0.10.1rc1 #nginx_lua_module 的源码路径

 

例子:

./configure\

 --user=www --group=www\

 --prefix=/usr/local/nginx\

 --with-http_stub_status_module\

 --with-http_ssl_module\

 --with-http_spdy_module\

 --with-http_gzip_static_module\

 --with-ipv6\

 --with-http_sub_module\

--with-ld-opt=-ljemalloc\

--with-openssl=/usr/local/src/openssl-1.0.1c\

 --with-pcre=/usr/local/src/pcre-8.30\

 --with-zlib=/usr/local/src/zlib-1.2.8\

 --add-module=/usr/local/src/ngx_devel_kit-0.2.18\

 --add-module=/usr/local/src/lua-nginx-module-0.10.1rc1\

 

make

 

安装lua模块发现的问题:

我在编译安装 Nginx 的第三方模块时,碰到一个错误:

viewplaincopyprint?

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

/usr/local/nginx/sbin/nginx:error while loading shared libraries: libluajit-5.1.so.2: cannot open sharedobject file: No such file or directory

./sbin/nginx -t

如果出现error:

 error while loading sharedlibraries: libluajit-5.1.so.2: cannot open shared object file: No such file ordirectory

可能是./configure时--conf-path未配置,或者# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5

 

7 请提前新建/data/logs/hack/目录攻击日志,并赋予nginx用户对该目录的写入权限。

mkdir-p /data/logs/hack/

www账户是跑nginx和php-fpm

chown-R www:www /usr/local/nginx/logs/hack/

chmod-R 755 /usr/local/nginx/logs/hack/

 

8 安装ngx_lua_waf模块

wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip–no-check-certificate

把这个文件解压到

nginx的conf目录下.

然后在nginx.conf里的http配置里添加

http{

    lua_package_path"/usr/local/nginx/conf/waf/?.lua";

    lua_shared_dict limit10m;

    init_by_lua_file  /usr/local/nginx/conf/waf/init.lua;

    access_by_lua_file/usr/local/nginx/conf/waf/waf.lua;

RulePath= "/usr/local/nginx/conf/waf/wafconf/"

   

    --规则存放目录

        attacklog = "off"

        --是否开启攻击信息记录,需要配置logdir

        logdir = "/usr/local/nginx/logs/hack/"

        --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~~]]


9 过滤配置说明:

过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割

global是全局过滤文件,里面的规则对post和get都过滤

get是只在get请求过滤的规则

post是只在post请求过滤的规则

whitelist是白名单,里面的url匹配到不做过滤

user-agent是对user-agent的过滤规则

 

注意:每次更改waf.lua代码需要把nginx -s reload一下!


测试


模拟web攻击

curl  http://xxxx/test.php?id=../etc/passwd  


 使用apache ab工具测试防压测

ab -n50 -c10 http://xxxxx/


查看日志

有关NGINX安全防护之基于ngx_lua的web应用防火墙的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  10. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

随机推荐