今天用上了军哥的LNMP一键包 LNMP1.5 测试版后,第一时间就重新编译了Nginx,加入了Lua的支持!这个可以说是明月当时选用LNMP生产环境的主要诱因,没有想到自己的编译水平实在是有限,照着教程都无法顺利编译通过,直到这次 LNMP1.5 测试版 发布集成了支持Lua的编译开关才算是真正的在Nginx里用上了Lua(可参考【军哥 LNMP 一键安装包 1.5测试版发布】一文了解)。
升级LNMP1.5测试版后,迫不及待的在lnmp.conf里打开Lua支持开关重新编译Nginx,一气呵成!
PS:可惜了前几天的【纯自嗨,LNMP下启用TLSv1.3支持过程全记录】一文启用的SSL的TLSv1.3支持因为重新编译也给放弃了,不过毕竟是“孤芳自赏”自嗨的,放弃也就放弃了!
要说明月一直以来最想用的Lua模块就是ngx_lua_waf了,至于这是干啥的,看下面的说明大家就知道了
ngx_lua_waf说明
- 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击。
- 防止svn/备份之类文件泄漏。
- 防止ApacheBench之类压力测试工具的攻击。
- 屏蔽常见的扫描黑客工具,扫描器。
- 屏蔽异常的网络请求。
- 屏蔽图片附件类目录php执行权限。
- 防止webshell上传
下载ngx_lua_waf
wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
解压缩到当前目录
unzip master.zip
进入ngx_lua_waf目录复制所有文件和目录到/usr/local/nginx/conf/waf/
目录(这个一般默认都是这里,如果不是请记得修改为自己Nginx配置文件目录即可。)
mv ngx_lua_waf-master/* /usr/local/nginx/conf/waf/
创建一个存放攻击日志记录的目录并赋予Nginx对应的权限,比如:
mkdir -p /data/logs/hack/
chown -R www:www /data/logs/hack/
chmod -R 755 /data/logs/hack/
安装部署ngx_lua_waf
在Nginx默认的nginx.conf配置文件http模块里添加如下语句引用ngx_lua_waf模块生效:
#部署ngx_lua_waf防火墙
lua_need_request_body on;
lua_shared_dict limit 10m;
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
编辑完成后,保存退出
为了确保万一,让Nginx检查以下配置文件语法正确与否是个好习惯:
nginx -t
返回如下信息即表明配置文件正确无误。
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
修改ngx_lua_waf配置
可以编辑/usr/local/nginx/conf/waf/config.lua
来调整ngx_lua_waf
的相关配置。
附送ngx_lua_waf 配置文件config.lua中文注释
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--规则存放目录
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir
logdir = "/data/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~~]]
--警告内容,可在中括号内自定义
备注:不要乱动双引号,区分大小写
可以把config.lua中的Redirect设置为off,只记录不拦截,观察没有误拦后再开启。
完成自己的需求的配置后,保存退出。重启Nginx后就生效了。
测试
测试创建个test.php文件,内容为test,使用curl来访问。
curl http://localhost/test.php?id=../etc/passwd
返回的内容:test
因为127.0.0.1允许的所以能看见页面的内容,因为域名地址是不允许的所以能看不见页面的内容,说明生效了
curl https://www.imydl.tech/test.php?id=../etc/passwd
同样的上面的地址在浏览器里看到的就是config.lua文件里的HTML源码的内容了,如下图:
所以具体的内容大家可以根据自己兴趣任意定制了!
什么是WAF
Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保护的一款产品。
WAF的功能
- 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
- 支持URL白名单,将不需要过滤的URL进行定义。
- 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
- 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
- 支持URL参数过滤,原理同上。
- 支持日志记录,将所有拒绝的操作,记录到日志中去。
WAF的特点
- 异常检测协议
Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。并且,它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。甚至,一些Web应用防火墙还可以严格限定HTTP协议中那些过于松散或未被完全制定的选项。
- 增强的输入验证
增强输入验证,可以有效防止网页篡改、信息泄露、木马植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
- 及时补丁
修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。WAF可以为我们做这项工作了——只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,并且没有安装对应的补丁本身就是一种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
- 基于规则的保护和基于异常的保护
基于规则的保护可以提供各种Web应用的安全规则,WAF生产商会维护这个规则库,并时时为其更新。用户可以按照这些规则对应用进行全方面检测。还有的产品可以基于合法应用数据建立模型,并以此为依据判断应用数据的异常。但这需要对用户企业的应用具有十分透彻的了解才可能做到,可现实中这是十分困难的一件事情。
- 状态管理
WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并且在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
- 其他防护技术
WAF还有一些安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、响应监视和信息泄露保护。
WAF与网络防火墙的区别
网络防火墙作为访问控制设备,主要工作在OSI模型三、四层,基于IP报文进行检测。只是对端口做限制,对TCP协议做封堵。其产品设计无需理解HTTP会话,也就决定了无法理解Web应用程序语言如HTML、SQL语言。因此,它不可能对HTTP通讯进行输入验证或攻击规则分析。针对Web网站的恶意攻击绝大部分都将封装为HTTP请求,从80或443端口顺利通过防火墙检测。
一些定位比较综合、提供丰富功能的防火墙,也具备一定程度的应用层防御能力,如能根据TCP会话异常性及攻击特征阻止网络层的攻击,通过IP分拆和组合也能判断是否有攻击隐藏在多个数据包中,但从根本上说他仍然无法理解HTTP会话,难以应对如SQL注入、跨站脚本、cookie窃取、网页篡改等应用层攻击。
web应用防火墙能在应用层理解分析HTTP会话,因此能有效的防止各类应用层攻击,同时他向下兼容,具备网络防火墙的功能。
42 条评论
怎么我到http 配置文件下 加入lua_need_request_body on;
lua_shared_dict limit 10m;
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua; 这个加入不了 提示nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed
那你就看看init.lua文件是不是有语法错误!
这个ngx_lua_waf太久没有更新了,不建议再用了!
找有WAF功能 CDN 来解决吧,推荐上海云盾 CDN 。
博主 我更改目录可以保存 但上去了 所有网站都打不开 提示500 Internal Server Error
nginx
用lnmp1.6吧,实测兼容性很好!没有那么多问题!
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir 这个logdir 应该怎么配置?|´・ω・)ノ
就是日志保存的目录,你根据自己服务器的情况设定即可!一般都是在/var下面的!
这个会不会影响到搜索引擎的蜘蛛抓取?
不会,正规的搜索引擎就不会影响,除非是个假冒的!
这个防火墙屏蔽wpsacn爆破吗?
总有人来破解用户
可以的!屏蔽恶意扫描是必须的!
你好,博主,请问下,waf开源git库上展示拦截效果的效果图是怎么出来的?是自己根据日志文件分析的吗?
那应该是作者自己根据日志分析得出的!
这个真心很不错!已在服务器部署。
多谢支持!
爱折腾,技术进步才更快,赞博主
呵呵,是呀,没有折腾哪来的经验呀!
真的很会玩
呵呵,多谢支持!
看了你这文章,去百度搜了了一下,这工具集成度很高啊,啥都给你整好了。
恩,这个ngx_lua等于是给Nginx提供了一个强大高效的自定义扩展接口!所以lua_waf的实用性自然也就高了!反正我这几天用着是感觉超爽!
服务器端一直使用着nginx。
使用Nginx是对的!这个Web服务器性能真的不是一般的牛X!
感觉Nginx有很大的潜力可开发!
明月兄越折腾越厉害,我一直都不敢折腾服务器
怕啥,做好备份和快照,实在不行就回滚嘛!话说我还没有一次回滚快照呢
这个不好用哇
不好用?怎么讲?
明月大佬,加上cdn能用吗,还有cc的防护能力呢
CC目前没有测试过,但是普通的拦截和屏蔽还是很有效的!
其实对于软件防御CC这个真心不能太依赖的!因为效果只能说是一般!
据说 CloudFlare 采用“云”技术实现了“软防御”CC攻击,目前国内还没有这个技术的!
感谢讲解
客气了!多谢支持!
对了,AhrefsBot的那个问题,博主你的robots里面的上下顺序写反了,把这个User-agent: AhrefsBot
Disallow: / 放在开头就好了
我已经修正了!但是这些爬虫经常会换个名字甚至UA继续来的!
不行,根本就不遵守robots协议!
那不知道了,我这样写了之后,那蜘蛛就没来过
https://www.miaomiaomiao.org/robots.txt
可能,博主的站干货比较多吧蜘蛛舍不得
呵呵,我始终感觉我的站点是被人提交到某个扫描库里了!
这个LNMP 1.5测试版?稳定性如何?能用在生产环境嘛?
这个只是LNMP一键包的脚本而已,对服务器生产环境几乎没有影响的!当然目前来看个人博客来玩玩尝鲜啥的是没有问题的!
不错,有机会试试去!
呵呵,目前我已经是启用了,感觉还是很不错的!就是起拦截屏蔽能力真的是太强悍了,弄不好就把自己屏蔽了都!
这个真心很不错!一直都有听说!
确实是很不错的,就是用好还需要持续研究!