试用了阿里云香港的轻量服务器之后,赶紧确实是一个不错的选择,因此,决定把网站给迁移过来。以前都是用的oneinstack安装包,这是因为军哥的lnmp如果使用mysql5.6以上的话就必须要内存2G衣裳,这次用的就是2G的,所以还是使用lnmp一键安装包比较舒心。和one的区别是,one很多的事项在编译环境的时候已经弄好了,而lnmp需要西西的打磨,这也是一个好事,毕竟服务器不同,弄的规则也不尽一样。闲言少续,开始正体。
lnmp开启waf的方法
LNMP一键安装包从1.5开始增加了lua支持的选项,可以通过修改lnmp.conf中Enable_Nginx_Lua后的参数为 y 来启用lua,如果没安装lnmp,修改lnmp.conf后保存,安装完lnmp就是支持lua的,如果已经安装好lnmp,也是按前面修改lnmp.conf,然后lnmp安装包目录下 ./upgrade.sh nginx 升级nginx,输入当前 nginx 版本号或更新的nginx版本号,升级完成就是支持lua的了。
下载安装ngx_lua_waf:
wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip -O ngx_lua_waf.zip
unzip ngx_lua_waf.zip
mv ngx_lua_waf-master /usr/local/nginx/conf/waf
nginx上设置并启用ngx_lua_waf
编辑 /usr/local/nginx/conf/nginx.conf 在 server_tokens off; 下面添加如下代码:
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;
修改完成保存
如果要想在某个虚拟主机启用ngx_lua_waf可以修改对应虚拟主机的server段,在该server段中 root 网站目录行下面添加如下代码:
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
修改完成保存
测试nginx配置文件: /usr/local/nginx/sbin/nginx -t
重载nginx配置生效: /usr/local/nginx/sbin/nginx -s reload
如果测试和重载都没报错就已经生效。
可以通过访问 http://域名/test.php?id=../etc/passwd 来测试
提示:您的请求带有>不合法参数,已被网站管理员设置拦截!说明已经正确设置
ngx_lua_waf配置文件位置:/usr/local/nginx/conf/waf/config.lua
使用 Fail2Ban防护网站及服务器
Fail2Ban 是一种入侵防御软件框架,可以保护计算机服务器免受暴力攻击。它以 Python 编程语言编写,能够在 POSIX 系统上运行,该系统具有本地安装的数据包控制系统或防火墙的接口,例如 iptables 或 TCP Wrapper。
所以要想使用Fail2Ban,就必须让服务器识别来源的真实IP地址,而不是套的cdn的地址。
套用CDN后获取来源的真实IP的方法
在nginx.conf内的http下增加:
#自定义一个日志格式
log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
‘”$request” $status $body_bytes_sent ‘
‘”$http_referer” “$http_user_agent”‘;
然后修改access_log /home/wwwlogs/xxxx.log; 为access_log /home/wwwlogs/xxxx.log main;
nginx-t 检查无误后,service nginx restart,现在在看日志文件,里面的地址就是真正的来源地址了。
使用 Fail2Ban 保护 Nginx、WordPress
Fail2Ban 会自动读取 .local 文件的配置,然后再增量地读取 conf 配置,这样就避免了更新它时你辛辛苦苦写好的配置被覆盖掉了。
然后我们就来编辑 Fail2Ban 的配置
首先是在 [DEFAULT] 字段下,我们可以改变一些行为参数,比如这样修改(多余的没有提到的配置就保留默认,不要理会即可):
接下来就是添加我们的监狱配置了,默认配置信息中并没有内置 Nginx ,只有 Apache:
注意这里的配置都是基于 Nginx 的日志的,所以你必须要允许 Nginx 记录日志,有些管理员为了性能考量会关闭日志,这样我们这篇文章也就失去了意义。
上述配置中 logpath 是指日志文件的路径的(如:/var/log/nginx/access.log),需要注意的是这里可以指定多个日志文件的,具体格式如下:
每个日志文件需要回车换行(空格直接去掉了,所以可以放心用空格对齐)才能识别到哦!
另,在配置 Fail2Ban 之前,你就应该先安装好 Nginx,否则 Fail2Ban 读不到 Nginx 的日志,会报错。
设置好了要启用的监狱,接下来就是给监狱创建规则了:
在这个目录下,存放这所有规则文件,一个配置名一个文件,有多少个文件就有多少个规则,这些规则被上文中监狱配置里 filter 字段调用。
这个规则是存在的,我们在规则中加一行配置,来过滤除了账号密码错误外,空白账号或者密码的错误:
[Definition]
failregex = ^ [error] </span>d+#</span>d+: </span></span>d+ user “\S+”:? (password mismatch|was not found in “.”), client: «/span>HOST>, server: </span>S+, request: “\S+ \S+ HTTP/\d+.\d+”, host: “\S+”</span>s*$
^ [error] </strong>d+#</strong>d+: </strong></strong>d+ no user/password was provided for basic authentication, client: «/strong>HOST>, server: </strong>S+, request: “\S+ \S+ HTTP/\d+.\d+”, host: “\S+”</strong>s$
ignoreregex =
添加的是加粗的那一行。
过滤爬虫的规则是有现成的,所以我们只需要改个名就可以了;
vim nginx-nohome.conf
这是过滤获取目录的:
[Definition]
failregex = ^«/span>HOST> -.GET ./~.*
ignoreregex =
vim nginx-noproxy.conf
这是过滤反代的:
[Definition]
failregex = ^«/span>HOST> –.GET http.
ignoreregex =
vim wp-login.conf
这是防止 WordPress 受到 xmlrpc.php 请求的 CC 攻击:
[Definition]
failregex = ^«/span>HOST> -.* /wp-login.php.* HTTP/1..“
ignoreregex =
vim xmlrpc.conf
防范 WordPress 暴力破解登录请求
[Definition]
failregex = ^«/span>HOST> -.*POST .*xmlrpc.php.*
ignoreregex =
跋涉者提示
很多网站上面的代码都不正确,是因为,高亮代码不知道怎么会屏蔽这个语法,造成错误,本文已经更正,放心的使用。
做完上述配置之后,就可以重启
这时你可以通过命令 fail2ban-client status 来查看,不出意外,应该类似这样:
Status
|- Number of jail: 7
`- Jail list: nginx-badbots, nginx-http-auth, nginx-nohome, nginx-noproxy, sshd, wp-login, xmlrpc
至此,Fail2Ban 保护 Nginx、WordPress 基本算是完成了,至少跋涉者目前需要的安全策略都完成了,平时可以观察一下 Fail2Ban 的日志文件来观察 Fail2Ban 的防御效果,如:
用 Fail2Ban屏蔽无效的404请求
借助 Fail2Ban 可以筛选出发送这些请求的 IP 地址来进行拦截屏蔽处理,根据日志中返回 404 的记录制定 Fail2Ban 监狱规则命名为 nginx-not-found.conf,具体内容如下:
打开编辑 nginx-not-found.conf 监狱规则文件,注意一定要在/etc/fail2ban/filter.d/目录内哦。
保存退出。
再打开编辑 jail.local 启用这个监狱规则。
添加下面的代码到 jail.local 里即可。同样的,注意 jail.local 文件的目录哦。
保存退出。
重新启动 Fail2Ban:
看下日志:
nginxno404已经开始生效,并且Ban了一个ip,14.204.69.48
看一下iptables的记录,如上图,已经拒绝这个IP的访问了
本文参考了落格部落及明月登楼博客里的一些文章,在此表示感谢