為Nginx服務(wù)器配置黑名單或白名單功能的防火墻
功能描述:
處在黑名單中的ip與網(wǎng)絡(luò),將無(wú)法訪問(wèn)web服務(wù)。
處在白名單中的ip,訪問(wèn)web服務(wù)時(shí),將不受nginx所有安全模塊的限制。
支持動(dòng)態(tài)黑名單(需要與ngx_http_limit_req 配合)
具體詳見下面的說(shuō)明
文件配置方法說(shuō)明
一、定義黑名單或白名單方法:
1. 配置格式
配置關(guān)鍵字 黑名單或白名單文件 存儲(chǔ)空間
white_black_list_conf conf/white.list zone=white:2m;
| | | |
| | | --------------------------------------存儲(chǔ)空間大小 這里是2m. 空間大小決定黑白名單的容量
| | ---------------------------------------------------------------------------------------------存儲(chǔ)空間名
| ---------------------------------------------------------------黑名單或白名單配置文件路徑
------------------------------------------------配置命令
2. 配置關(guān)鍵字 white_black_list_conf。
3. 只能在http{} 中使用
4. white_black_list_conf可以配置多個(gè) 只需 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. 配置格式
配置關(guān)鍵字 on/off
配置關(guān)鍵字有:white_list 與 black_list 分別用來(lái)表示白名單與黑名單
2. 能在http{}、server{}、location{}下使用, 功能默認(rèn)是關(guān)閉
3. 配置示例:
http{
......
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 在整個(gè)http{} 中都開啟
black_list black1 on; #黑名單 black1 在整個(gè)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 在整個(gè)server{} 中都開啟
black_list black2 on; #黑名單 black1 在整個(gè)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 在整個(gè)server{} 中都開啟
black_list black2 on; #黑名單 black2 在整個(gè)server{} 中都開啟
}
.......
}
.......
}
4.http配置接口說(shuō)明:
(1)配置配置接口
http{
.......
server{
......
location /sec_config{
sec_config on;
}
......
}
.......
}
(2)配置方法:
a. http://xxx/sec_config 查看黑白名單定義情況
返回結(jié)果如下
{
"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"
}
}
b. http://xxx/sec_config?zone_name=white 查看zone_name 為white 的 list_path中的具體內(nèi)容
c.http://xxx/sec_config?zone_name=white&add_item=192.168.141.23 向 zone_name 為white 中增加192.168.141.23
d. http://xxx/sec_config?zone_name=white&delete_item=192.168.141.23 在 zone_name 為white 中刪除192.168.141.23
查看配置方法2:
http://xxx/sec_config?for_each
三、黑白名單文件內(nèi)容
conf/black.list 文件內(nèi)容如下
2.2.2.2 192.168.141.1 3.3.3.3 4.4.4.5 2.3.4.4
四、動(dòng)態(tài)黑名單
要使用該功能必須對(duì) ngx_http_limit_req_module.c 進(jìn)行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);
配備關(guān)鍵字:
dyn_black
格式:
dyn_black $zone_name time;
比如:
dyn_black black 60; //禁止訪問(wèn)60秒,60秒后自動(dòng)解除
注意:
必須要配置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; //禁止訪問(wèn)60秒,60秒后自動(dòng)解除
...
}
location /xxx {
sec_config on;
}
...
}
...
}
PS:基于lua-nginx-module的ngx_lua_waf防火墻
項(xiàng)目地址:https://github.com/loveshell/ngx_lua_waf?utm_source=tuicool&utm_medium=referral
推薦安裝:
推薦使用lujit2.1做lua支持
ngx_lua如果是0.9.2以上版本,建議正則過(guò)濾函數(shù)改為ngx.re.find,匹配效率會(huì)提高三倍左右。
使用說(shuō)明:
nginx安裝路徑假設(shè)為:/usr/local/nginx/conf/
把ngx_lua_waf下載到conf目錄下,解壓命名為waf
在nginx.conf的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規(guī)則目錄(一般在waf/conf/目錄下)
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
絕對(duì)路徑如有變動(dòng),需對(duì)應(yīng)修改
然后重啟nginx即可
配置文件詳細(xì)說(shuō)明:
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--規(guī)則存放目錄
attacklog = "off"
--是否開啟攻擊信息記錄,需要配置logdir
logdir = "/usr/local/nginx/logs/hack/"
--log存儲(chǔ)目錄,該目錄需要用戶自己新建,切需要nginx用戶的可寫權(quán)限
UrlDeny="on"
--是否攔截url訪問(wèn)
Redirect="on"
--是否攔截后重定向
CookieMatch = "on"
--是否攔截cookie攻擊
postMatch = "on"
--是否攔截post攻擊
whiteModule = "on"
--是否開啟URL白名單
ipWhitelist={"127.0.0.1"}
--ip白名單,多個(gè)ip用逗號(hào)分隔
ipBlocklist={"1.0.0.1"}
--ip黑名單,多個(gè)ip用逗號(hào)分隔
CCDeny="on"
--是否開啟攔截cc攻擊(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCrate = "100/60"
--設(shè)置cc攻擊頻率,單位為秒.
--默認(rèn)1分鐘同一個(gè)IP只能請(qǐng)求同一個(gè)地址100次
html=[[Please go away~~]]
--警告內(nèi)容,可在中括號(hào)內(nèi)自定義
備注:不要亂動(dòng)雙引號(hào),區(qū)分大小寫
檢查規(guī)則是否生效
部署完畢可以嘗試如下命令:
curl http://xxxx/test.php?id=../etc/passwd
返回"Please go away~~"字樣,說(shuō)明規(guī)則生效。
注意:默認(rèn),本機(jī)在白名單不過(guò)濾,可自行調(diào)整config.lua配置


規(guī)則更新:
考慮到正則的緩存問(wèn)題,動(dòng)態(tài)規(guī)則會(huì)影響性能,所以暫沒用共享內(nèi)存字典和redis之類東西做動(dòng)態(tài)管理。
規(guī)則更新可以把規(guī)則文件放置到其他服務(wù)器,通過(guò)crontab任務(wù)定時(shí)下載來(lái)更新規(guī)則,nginx reload即可生效。以保障ngx lua waf的高性能。
只記錄過(guò)濾日志,不開啟過(guò)濾,在代碼里在check前面加上--注釋即可,如果需要過(guò)濾,反之
一些說(shuō)明:
過(guò)濾規(guī)則在wafconf下,可根據(jù)需求自行調(diào)整,每條規(guī)則需換行,或者用|分割
- global是全局過(guò)濾文件,里面的規(guī)則對(duì)post和get都過(guò)濾
- get是只在get請(qǐng)求過(guò)濾的規(guī)則
- post是只在post請(qǐng)求過(guò)濾的規(guī)則
- whitelist是白名單,里面的url匹配到不做過(guò)濾
- user-agent是對(duì)user-agent的過(guò)濾規(guī)則
默認(rèn)開啟了get和post過(guò)濾,需要開啟cookie過(guò)濾的,編輯waf.lua取消部分--注釋即可
日志文件名稱格式如下:虛擬主機(jī)名_sec.log
相關(guān)文章
詳解在使用CDN加速時(shí)Nginx獲取用戶IP的配置方法
這篇文章主要介紹了在使用CDN加速時(shí)Nginx服務(wù)器獲取用戶IP的方法,文中針對(duì)PHP站點(diǎn)環(huán)境舉例來(lái)講,需要的朋友可以參考下2016-02-02
一些優(yōu)化Nginx服務(wù)器的技巧簡(jiǎn)介
這篇文章主要介紹了一些優(yōu)化Nginx服務(wù)器的技巧簡(jiǎn)介,包括對(duì)HTTP模塊和Events模塊的配置建議,需要的朋友可以參考下2015-06-06
Nginx配置本地圖片服務(wù)器的實(shí)現(xiàn)
本文主要介紹了Nginx配置本地圖片服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Nginx漏洞整改實(shí)現(xiàn)限制IP訪問(wèn)&隱藏nginx版本信息
本文主要介紹了Nginx漏洞整改實(shí)現(xiàn)限制IP訪問(wèn)&隱藏nginx版本信息,通過(guò)配置Nginx的ACL,可以輕松實(shí)現(xiàn),下面就來(lái)具體介紹一下,感興趣的可以了解一下2024-03-03
nginx之virtual host虛擬主機(jī)的配置實(shí)現(xiàn)
虛擬主機(jī)(vhost)技術(shù)允許一臺(tái)物理服務(wù)器托管多個(gè)獨(dú)立網(wǎng)站或應(yīng)用,每個(gè)虛擬主機(jī)擁有獨(dú)立的域名、配置文件等,實(shí)現(xiàn)資源隔離管理,Nginx服務(wù)器通過(guò)配置文件實(shí)現(xiàn)虛擬主機(jī)設(shè)置,感興趣的可以了解一下2024-11-11
基于Nginx 反向代理獲取真實(shí)IP的問(wèn)題詳解
下面小編就為大家分享一篇基于Nginx 反向代理獲取真實(shí)IP的問(wèn)題詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
解決httpd占用80端口導(dǎo)致Nginx啟動(dòng)失敗報(bào)錯(cuò)的解決辦法
今天在建自己小網(wǎng)站時(shí)啟動(dòng)Nginx時(shí),發(fā)現(xiàn)其報(bào)下列錯(cuò)誤,意思是因?yàn)?0端口被占用導(dǎo)致Nginx啟動(dòng)失敗,所以本文小編給大家介紹介紹如何解決解決httpd占用80端口導(dǎo)致Nginx啟動(dòng)不成功報(bào)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)2023-11-11
nginx 隱藏版本號(hào)與WEB服務(wù)器信息的解決方法
這篇文章主要介紹了nginx 隱藏版本號(hào)與WEB服務(wù)器信息的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11

