首頁 > 運維 > Nginx > 主體

怎麼為Nginx伺服器設定黑名單或白名單功能

王林
發布: 2023-05-17 15:40:06
轉載
2299 人瀏覽過

一、定義黑名單或白名單方法:
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{
    ......
    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;
        }
        ......
    }
    .......
}
登入後複製

(2)設定方法:
a. http://xxx/sec_config 查看黑白名單定義情況
傳回結果如下

{
    "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中的具體內容
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 中查看設定方法168.141.23 在zone_name 為#white. http://xxx/sec_config?for_each

三、黑白名單檔案內容
conf/black.list 檔案內容如下

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 <>
#

  "
  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 $zone_name time;

        例如:
                dyn_black black 60; //禁止使用60秒,60秒後自動解除

             設定範例:


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防火牆


項目地址:https://github.com/loveshell/ngx_lua_waf?utm_source=tuicool&utm_medium=referral
推薦安裝:

建議使用lujit2.1做lua支援

ngx_lua如果是0.9.2以上版本,建議正規過濾函數改為ngx.re.find,匹配效率會提高三倍左右。 使用說明:

nginx安裝路徑假設為:/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規則目錄(一般在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攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
ccrate = "100/60"
--设置cc攻击频率,单位为秒.
--默认1分钟同一个ip只能请求同一个地址100次
html=[[please go away~~]]
--警告内容,可在中括号内自定义
备注:不要乱动双引号,区分大小写

检查规则是否生效

部署完毕可以尝试如下命令:

  curl http://xxxx/test.php?id=../etc/passwd
登入後複製

    返回"please go away~~"字样,说明规则生效。
注意:默认,本机在白名单不过滤,可自行调整config.lua配置

怎麼為Nginx伺服器設定黑名單或白名單功能

怎麼為Nginx伺服器設定黑名單或白名單功能

规则更新:

考虑到正则的缓存问题,动态规则会影响性能,所以暂没用共享内存字典和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

以上是怎麼為Nginx伺服器設定黑名單或白名單功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!