nginx限制IP恶意调用接口处理办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx限制IP恶意调用接口处理办法相关的知识,希望对你有一定的参考价值。

今天一大早运营跑来投诉说:“公司昨晚发了20多万条注册短信息,我们没有这么多注册用户啊!”,我查询日志发现,一直有人在恶意调用我们公司的短信接口,造成一直发送注册信息,而且不断变化IP,初次遇到还是有点懵逼的!

调用注册短信接口日志内容:

121.204.87.168 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.001 
222.91.163.130 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 
124.72.40.148 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 
112.14.87.203 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 

我发现这些IP几乎都是每隔三四秒就调用一次,像这种接口一般注册时,一天最多也就调用三五次;

针对这些问题我想了几个方案,发现一般都是处理时间长,不太适合当前情况紧急处理,根据日志判断对方是直接调用我接口的,处理起来只能封IP,考虑到如果用iptables封IP的话,以后这个IP如果在防火墙不做处理,就会误伤很多正常使用的用户!

处理方案:
1、处理思路:用nginx的黑名单处理,通过shell脚本和cron,每隔五分钟就去统计一下,调用短信接口超过5次的IP,直接扔进黑名单配置文件;

2、处理步骤:
shell统计脚本blackip.sh:

#!/bin/bash
NGINX_DIR=/nginx
BLOCK_IP_FILE=/nginx/conf/vhost/blockip.conf
BLOCKED_IP=/nginx/logs/blocked-ip.txt
NGINX_CMD=/nginx/sbin/nginx
LOG_PATH=/nginx/logs/api.xxx.com_access.log

/bin/cp $BLOCK_IP_FILE $BLOCKED_IP &&
/usr/bin/tail -n 20000 ${LOG_PATH}|grep "xxx/短信接口" | awk ‘{print $1,$7,$9}‘|awk ‘{print $1}‘|sort|uniq -c|sort -rn | awk ‘{if($1>10)print "deny "$2";"}‘ > $BLOCKED_IP &&
/bin/grep -v -f $BLOCK_IP_FILE $BLOCKED_IP >>  $NGINX_CMD  &&
$($NGINX_CMD -s reload)

ps:脚本写的有点LOW。。。

3、计划任务

*/5 * * * * /bin/sh /scripts/blackip.sh >/dev/null 2>&1

4、在http或者server模块引入

include vhost/blacklist.conf ;

重新加载nginx生效!!

查看加入到黑名单配置文件的IP:

略略。。。
deny 117.136.90.104;
deny 223.104.31.205;
deny 117.150.148.213;
deny 36.60.168.148;
deny 183.40.141.112;
......
略略。。。

此时再去nginx的中查看调用接口的情况,超过限定条件被放入黑名单中的IP,在调用短信接口的呃时候返回403了,不在会实际发送短信:

60.180.30.117 - - [09/Mar/2018:17:57:15 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 
60.181.109.10 - - [09/Mar/2018:17:57:15 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 

目前这只能是做为紧急处理方法,更稳妥的办法还是在业务逻辑和安全上去完善!在实际处理的过程当中还是做了很多无用功的,运维路上处处是坑啊,希望这篇文章能够帮到你!

以上是关于nginx限制IP恶意调用接口处理办法的主要内容,如果未能解决你的问题,请参考以下文章

WebApi 接口恶意请求限制

如何禁掉nginx恶意访问ip

网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击

防止恶意攻击短信验证码接口方法

Nginx限制并发连接数

给裸接口加一道防护,避免恶意盗刷和爬取