每周一坑-nginx设置白名单ip不生效

发布时间 2023-07-18 23:18:13作者: windysai
每周一坑-nginx设置白名单ip不生效
  长话短说,最近加班很严重,从端午后基本没停过,周末不是在公司加班,就是在家加班:
(1)端午后从电信到联通的割接迁移(很怕迁少了东西)
(2)上上周五下午通知,某系统A的上级系统被抽中做攻防演练的靶向系统,其中下面有40多个子系统,我们是其中一个,于是需要紧急出方案及做相关安全措施控制(7月8、9日回公司加班,我经理写方案,我实现方案里的技术点)
(3)上周五下午,某系统B在第一轮攻防期间被红队查出刚要释放在电信的gitlab版本存在漏洞,好巧不巧的是,电信这个gitlab服务器在13号已经停机释放,红队在系统割接期间在扫描,刚好在这个节点被查出。昨天跟领导一起去甲方里认错,说我们管理流程不规范,说我们用过期有漏洞软件,说我们不加白名单ip控制,说我们用他们域名做gitlab解析代表着甲方的颜面。。。这玩意虽然不是我自作主张装的(用他们的域名是因为想测gitlab能否接入到waf防护,大家都知道默认waf如果不买域名扩展包,只能保护一个根域名及旗下二级域名,测下来发现压根不支持ssh协议防护,但服务器拉代码用到这个协议,只能保护https协议网站不是我们预想效果,所以干脆做数据备份),但版本是我选的(跟生产一样的版本,熟悉嘛),所以归根到底还是我的锅。。。然后从今天开始,我们领导十分重视安全问题(所以接下来我很忙,也麻烦,不知道啥时候能缓下。。。反正觉得最近脑袋瓜加班加的有点傻)
  今天就开始搞安全了,其中涉及到 IP 白名单,话说二级域名也要改,改成一堆别人猜不透的字符串,防止字典匹配,例如:test.ljy.com  改成 Hs1Rxdg5.ljy.com,诸如此类。
  回到正题,nginx设置IP白名单无非用allow,再deny搞。今天发现怎么配都不生效!!!!
       坑来了,nginx前面有个web防火墙,我加白名单ip的时候,怎么加都有问题,而且日志还没有。

   然后我领导观察正常日志有个clientip,问是谁的。我说是防火墙ip,这时我们就怀疑是这个防火墙导致怎么配都不行,因为我试过另一台经过阿里云waf的服务器,也是怎么设置都不行。

   本来我们想叫防火墙的人帮针对某个目录设置ip白名单,怎么知道他们的产品特水,只能我们搞。于是我们换种思路,打算从xff入手,对应nginx内置变量:$http_x_forwarded_for,而不行的clientip对应nginx内置变量:$remote_addr。

   因为有多个白名单ip,所以最终成品是这样(location里面的规则是一条条顺序匹配的,要注意不要第一条规则就匹配上,让它直接跳出来不执行后面的)

location ^~ /windysai/admin {
        ### 白名单ip
        set $flag "9";
        if ($http_x_forwarded_for ~ "白名单ip1|白名单ip2|白名单ip3")
        {
               set $flag "1";
        }
  
        if ($flag ~ "9")
        {
               return 403;
       }
       proxy_pass https://服务ip:端口;
}

  最后投诉下这个小可爱,乱说,也有可能人家写对了,它打不了竖线 “|”。本来多个ip我不会匹配的时候,写了n多个if语句,后来晚上看了视频才知道上面那样写。

   以下这两个方法,大家感兴趣可以试下:

1、感觉跟上面的方法有点类似

 

2、借用Lua模块

  引用小可爱的话:

  对于复杂的IP地址匹配逻辑,最佳实践是使用Lua脚本。Lua脚本在Nginx中可以提供更高级的功能和灵活性。如果您希望实现IP白名单功能,并能够处理匹配多个IP地址,可以按照以下步骤配置,

  在下面配置中,我们使用access_by_lua_block指令来嵌入Lua脚本。该脚本检查$http_x_forwarded_for头部的值是否匹配白名单中的任何IP地址。如果客户端IP不在白名单中,将返回403 Forbidden错误,否则将允许访问。

请确保您在配置文件中修改allowed_ips列表,添加允许访问的IP地址。这样,您就能够灵活地配置多个IP地址的白名单。记得重新加载或重启Nginx以使更改生效。

 1 http {
 2     # ... 其他配置 ...
 3 
 4     lua_shared_dict ip_whitelist_dict 10m;  # 创建一个共享内存区域用于存储白名单IP
 5 
 6     server {
 7         listen 80;
 8         server_name example.com;
 9 
10         access_by_lua_block {
11             local allowed_ips = { "X.X.X.X", "Y.Y.Y.Y" }  -- 添加允许访问的IP地址到列表中
12 
13             local client_ip = ngx.var.http_x_forwarded_for
14             local is_allowed = false
15 
16             -- 检查client_ip是否在allowed_ips列表中
17             for _, ip in ipairs(allowed_ips) do
18                 if client_ip == ip then
19                     is_allowed = true
20                     break
21                 end
22             end
23 
24             if not is_allowed then
25                 ngx.status = ngx.HTTP_FORBIDDEN
26                 ngx.say("403 Forbidden - You are not allowed to access this resource.")
27                 ngx.exit(ngx.HTTP_FORBIDDEN)
28             end
29         }
30 
31         location / {
32             # 允许访问的配置
33 
34         }
35     }
36 }
View Code