每周一坑-nginx设置白名单ip不生效
每周一坑-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 }