前言:
现在小伙伴们对“nginx添加ip黑名单”大致比较关切,同学们都想要知道一些“nginx添加ip黑名单”的相关内容。那么小编同时在网摘上汇集了一些对于“nginx添加ip黑名单””的相关资讯,希望咱们能喜欢,看官们一起来了解一下吧!近日收到阿里云的短信告警,发现短信发送成功率低于95%,而且短信服务相关部分接口响应时间超过2秒钟,多维度告警提示我们的短信接口出现了异常现象。登录kibana平台查看短信接口日志发现存在多个异常IP正在不断请求我们的短信接口,原来我们的短信接口被不法分子盯上了,一个耳熟能详的词语在我脑海中脱颖而出---- 短信轰炸!!!
短信轰炸在我认知中它应该属于臭名昭著的呼死你平台一个分支而已,短信接口被盗用于短信轰炸,一方面大量无辜的用户收到短信骚扰;一方面短信通道不断发送短信,造成资源浪费、大量用户投诉可能导致平台短信通道被关停影响公司正常业务;另外一方面增加了受害公司运营支出成本、业务平台访问异常、公司知名度口碑下滑等各种负面影响和损失。
接下来将带领大家针对此次被黑事件进行剖析,看看如何一步步加强安全防护呢??
先禁止异常IP访问我们的端口接口,在Nginx里面添加黑名单即可,可以参考之前文章【开发环境下如何进行安全加固呢】通过日志平台进行访问行为分析上述截图是后来我添加策略之后的日志,正常没有添加策略的时候访问status是200,通过日志平台分析发现存在以下几种情况:
1)referer 发现大部分均是 zx.loongdl.cn、6665555222.9ps.space等第三方域名或者没有referer标识
2)forwarded_for 异常IP很分散,不固定没有一定规律可言
3)user_agent 变化很多也没有规律可言
4)大部分接口都是get 请求且短信接口直接拼接手机号,对攻击者而言批量操作简单化
5)被盗刷的都是新用户注册接口【登录接口有校验】
6)接口请求频率不高而且URL不固定(因手机号是个变量),但是盗刷行为一直在进行中,不容易监测到异常访问
通过上述分析我们将如何加固短信接口呢?
1)盗刷前开启的安全策略:
(1) 阿里云平台开启防盗刷监控。接口被黑之前就开启了也是我们发现异常行为监控手段
(2) 加强日志监控、接口监控(频率、响应时间、访问次数等)
2) 盗刷后开启的安全策略:
(1) 添加referer策略校验只允许我司域名。后来发现对方学聪明了将referer换成我司的域名
(2) 针对相关接口的源IP添加单位时间内访问次数限制
(3) 将接口GET请求改成POST请求方式,需要研发人员介入
(4) 前端注册、登录、修改密码等页面添加图形验证码等二次验证,需要研发人员介入
3)由于上述环节中需要研发人员配合需要一定周期,盗刷现象又一直在进行为了更快、更简单地处理这个事情,我们采用Nginx+Lua 进行第一次安全加固,后期研发人员进行二次加固
root@devops:/usr/local/nginx/conf/sites-enabled# more devops.conf location /weixin/common/smssend { access_by_lua_file 'conf/scripts/api_smssend.lua'; }root@devops:/usr/local/nginx/conf/scripts# cat api_smssend.lua -- 字符串切割function split(str, reps) local resultStrList = {} string.gsub(str,'[^'..reps..']+',function ( w ) table.insert(resultStrList,w) end) return resultStrListend-- 释放Redis连接local function close_redis(conn) if not conn then return end local pool_max_idle_time = 10000 local pool_size = 100 local ok, err = conn:set_keepalive(pool_max_idle_time, pool_size) if not ok then ngx_log(ngx_ERR, "set redis keepalive error : ", err) endend-- 初始化redislocal redis = require "resty.redis" local conn = redis:new() ok, err = conn:connect("172.17.173.183", 26379)conn:auth('Huajianghu@1949')conn:set_timeout(1000) -- 配置基础策略local ip_block_time = 3600 local ip_time_out = 60 local ip_max_count = 10 -- 获取客户端IPlocal client_ip, err = ngx.req.get_headers()["X-Forwarded-For"]if client_ip then remote_ip = split(client_ip, ",")[1] else remote_ip = '1.1.1.1'end--查询ip是否被禁止访问,如果存在则返回403错误代码is_block, err = conn:get("smssend".."-block-"..remote_ip) if is_block == '1' then ngx.exit(403)end-- referer限制和计数策略if ngx.var.uri:match('/weixin/common/smssend') or ngx.var.uri:match('/ucenter/login/code') then allow = false local refer = ngx.req.get_headers()['Referer'] local request_method = ngx.var.request_method if "OPTIONS" == request_method then allow = true elseif not refer then allow = false elseif refer:match('guoguo.com') or refer:match('servicewechat.com') then ip_count, err = conn:get("smssend".."-count-"..remote_ip) if ip_count == ngx.null then --首次初始化计数 res, err = conn:set("smssend".."-count-"..remote_ip, 1) res, err = conn:expire("smssend".."-count-"..remote_ip, ip_time_out) allow = true else ip_count = ip_count + 1 if ip_count >= ip_max_count then --限制访问首次初始化计数 res, err = conn:set("smssend".."-block-"..remote_ip, 1) res, err = conn:expire("smssend".."-block-"..remote_ip, ip_block_time) allow = false else res, err = conn:set("smssend".."-count-"..remote_ip,ip_count) res, err = conn:expire("smssend".."-count-"..remote_ip, ip_time_out) allow = true end end end if not allow then ngx.exit(403) endendclose_redis(conn)
4)通过上述第一次安全加固基本上能挡住95%以上的攻击,安全策略一定要在上线前进行充分的测试,防止正常的请求被阻拦,注意观察kibana平台日志。
5)如果你认为还有更好的安全加固措施,欢迎在评论区回复哦[呲牙]