为Nginx服务器配置⿊名单或⽩名单功能的防⽕墙
功能描述:
处在⿊名单中的ip与⽹络,将⽆法访问web服务。
处在⽩名单中的ip,访问web服务时,将不受nginx所有安全模块的限制。
⽀持动态⿊名单(需要与ngx_http_limit_req 配合)
具体详见下⾯的说明
⽂件配置⽅法说明
⼀、定义⿊名单或⽩名单⽅法:
1. 配置格式
配置关键字⿊名单或⽩名单⽂件存储空间
white_black_list_conf conf/white.list zone=white:2m;
| | | |
| | | --------------------------------------存储空间⼤⼩这⾥是2m. 空间⼤⼩决定⿊⽩名单的容量
| | ---------------------------------------------------------------------------------------------存储空间名
| ---------------------------------------------------------------⿊名单或⽩名单配置⽂件路径
------------------------------------------------配置命令
2. 配置关键字 white_black_list_conf。
3. 只能在http{} 中使⽤
4. white_black_list_conf可以配置多个只需 zone=value 其中的value不同就可
5. 配置⽰例:
http{
......
white_black_list_conf conf/white.list zone=white:4m;
white_black_list_conf conf/black.list zone=black:4m;
......
server{
.......
}
.......
}
⼆、⿊⽩名单作⽤范围
1. 配置格式
配置关键字 on/off
配置关键字有:white_list 与 black_list 分别⽤来表⽰⽩名单与⿊名单
2. 能在http{}、server{}、location{}下使⽤, 功能默认是关闭
3. 配置⽰例:
http{
etc被拉入黑名单了怎么办......
white_black_list_conf conf/white.list zone=white1:4m;
white_black_list_conf conf/black.list zone=black1:4m;
white_list white1 on; #⽩名单 white1 在整个http{} 中都开启
black_list black1 on; #⿊名单 black1 在整个http{} 中都开启
server{
.......
}
.......
}
http{
......
white_black_list_conf conf/white.list zone=white2:4m;
white_black_list_conf conf/black.list zone=black2:4m;
server{
.......
white_list white2 on; #⽩名单 white1 在整个server{} 中都开启
black_list black2 on; #⿊名单 black1 在整个server{} 中都开启
.
......
}
.......
}
http{
......
white_black_list_conf conf/white.list zone=white3:4m;
white_black_list_conf conf/black.list zone=black3:4m;
white_black_list_conf conf/black.list zone=black2:4m;
white_black_list_conf conf/white.list zone=white2:4m;
server{
.
......
location /do {
........
white_list white3 on; #⽩名单 white3 在location /do{} 中开启
black_list black3 on; #⿊名单 black3 在location /do{} 中开启
........
}
location /do1{
white_list white2 on; #⽩名单 white2 在整个server{} 中都开启
black_list black2 on; #⿊名单 black2 在整个server{} 中都开启
}
.
......
}
.......
}
4.http配置接⼝说明:
(1)配置配置接⼝
http{
.......
server{
......
location /sec_config{
sec_config on;
}
......
}
.......
}
{
"version": "nginx/1.3.0",
"code": "0",
"item": {
"conf_type": "white_black_list_conf",
"zone_name": "white",
"list_path": "/home/john/nginx/conf/white.list"
},
"item": {
"conf_type": "white_black_list_conf",
"zone_name": "black",
"list_path": "/home/john/nginx/conf/black.list"
},
"item": {
"conf_type": "white_black_list_conf",
"zone_name": "ex",
"list_path": "/home/john/nginx/conf/status_ex"
}
}
2.2.2.2
192.168.141.1
3.3.3.3
4.4.4.5
2.3.4.4
四、动态⿊名单
要使⽤该功能必须对 ngx_http_limit_req_module.c 进⾏patch 在ngx_http_limit_req_module.c中
增加#include <white_black_list.h>
并修改代码到:
"
if (rc == NGX_BUSY) {
ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,
"limiting requests, excess: %ui.%03ui by zone \"%V\"",
excess / 1000, excess % 1000,
&limit->shm_zone->shm.name);
"
在其下⾯增加:
ngx_black_add_item_interface(r, 1);
配备关键字:
dyn_black
格式:
dyn_black $zone_name time;
⽐如:
dyn_black black 60; //禁⽌访问60秒,60秒后⾃动解除
注意:
必须要配置black_list
配置⽰例:
http{
....
white_black_list_conf conf/black.list zone=black:4m;
limit_req_zone $binary_remote_addr zone=one:8m rate=4r/s;
...
server {
location / {
black_list black on;
limit_req zone=one burst=6;
dyn_black black 60; //禁⽌访问60秒,60秒后⾃动解除
...
}
location /xxx {
sec_config on;
}
...
}
...
}
PS:基于lua-nginx-module的ngx_lua_waf防⽕墙
推荐使⽤lujit2.1做lua⽀持
ngx_lua如果是0.9.2以上版本,建议正则过滤函数改为find,匹配效率会提⾼三倍左右。使⽤说明:
nginx安装路径假设为:/usr/local/nginx/conf/
把ngx_lua_waf下载到conf⽬录下,解压命名为waf
在f的http段添加
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;
配置config.lua⾥的waf规则⽬录(⼀般在waf/conf/⽬录下)
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
绝对路径如有变动,需对应修改
然后重启nginx即可
配置⽂件详细说明:
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⽩名单
ipWhitelist={"127.0.0.1"}
--ip⽩名单,多个ip⽤逗号分隔
ipBlocklist={"1.0.0.1"}
--ip⿊名单,多个ip⽤逗号分隔
CCDeny="on"
--是否开启拦截cc攻击(需要f的http段增加lua_shared_dict limit 10m;)
CCrate = "100/60"
--设置cc攻击频率,单位为秒.
-
-默认1分钟同⼀个IP只能请求同⼀个地址100次
html=[[Please go away~~]]
--警告内容,可在中括号内⾃定义
备注:不要乱动双引号,区分⼤⼩写
检查规则是否⽣效
部署完毕可以尝试如下命令:
curl xxxx/test.php?id=../etc/passwd
返回"Please go away~~"字样,说明规则⽣效。
注意:默认,本机在⽩名单不过滤,可⾃⾏调整config.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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论