"叮------"手机突然震动,一条短信弹出:"流量告警!您的账户在一天内产生了数百GB的异常流量!"
心跳瞬间加速,几百GB?这怎么可能?我的服务器明明只服务于一个小项目,怎么会在短短一天内被刷出如此夸张的流量?

更让我震惊的是,当我搜索一下,发现这并不是个例------类似的异常流量事件,竟然在七牛云平台上频频发生!

盗刷到底有什么好处?
这种盗刷行为背后隐藏着一个巨大的利益链条:有人利用云平台的流量计费机制恶意刷取或劫持流量牟取暴利,当然也有恶意攻击,而像我这样的普通用户,竟然成了他们的"提款机"!
当然经过控制已经掉下去了,这里来主要来看看控制的方法。当然七牛云官网也有相应的提醒让大家开启"访问控制"。

下面来具体看看:

IP黑白名单【推荐】
这种方法比较简单、快速。通过七牛:
管理控制台->CDN->统计分析->日志分析->TOP URL/IP 找到 top 前几的 ip 看看它的流量非常大就直接给加到黑名单。
这里可以看到单个 IP 流量和请求数 top 100 的数据。把前面几个异常 ip 设置到黑名单。
- 按流量 top 100

- 按请求数 top 100

还可以按地区运营商来看

设置黑名单,支持 IP 网段的设置
CDN控制台->域名管理->配置-> IP黑白名单配置

p.s.
IPv4网段:支持以下三种格式:
/8
:例如192.0.0.0/8
,表示192.0.0.0
到192.255.255.255
。/16
:例如192.168.0.0/16
,表示192.168.0.0
到192.168.255.255
。/24
:例如192.168.1.0/24
,表示192.168.1.0
到192.168.1.255
另外你如果要看详细的日志,可以通过日志下载,下载详细一点的日志。
管理控制台->CDN->统计分析->日志下载

Referer 防盗链【推荐】
七牛云的 Referer 防盗链 是一种常见的防盗链机制,用于限制资源的访问来源,防止资源被非法引用或盗用。通过配置 Referer 防盗链,可以确保只有指定的域名或来源才能访问资源,从而保护流量和数据安全。

具体来说就是你的资源挂载在你的官网,正常从官网下载会带 Referer 头信息,一般通过链接或程序直接下载的一般不会带这个头信息。当然这也只能过滤掉不少流量,当然对方也是可以设置Referer 头信息。

注意:
1、 黑白名单生效时间为 1 小时,不过一般好像改了就有效果了
2、注意 www.abc.com 与 abc.com 得配置两条规则
时间戳防盗链
时间戳防盗链可以通过对时间有关的字符串进行签名,将时间、签名信息通过一定的方式传递给 CDN 边缘节点服务器进行鉴权,从而正确响应合法请求、拒绝非法请求。相比于 referer 防盗链,时间戳防盗链的安全性更强。

上面是官方提供的步骤图(一看这图还有点难懂),针对官网挂载个下载资源包的场景大概是这样的步骤:

就是增加了后台系统这部分,把原始地址通过签名规则生成相应带签名的下载地址,这样这个地址就带了时效性,过期就失效了。

签名原理,具体的可以看七牛的官方文档

示例代码:
python
#! /usr/bin/env python
#coding:utf-8
from hashlib import md5
import urllib
import sys
import time
from urlparse import urlparse, parse_qs
import traceback
import uuid
import base64
def url_encode(s):
return urllib.quote(s.decode(sys.stdin.encoding).encode("utf8"), safe="/")
def to_deadline(rang):
return int(time.time()) + rang
def t16(t):
return hex(t)[2:].lower() # 16 进制小写形式
def summd5(str):
m = md5()
m.update(str)
return m.hexdigest()
def sign(key, t, path):
a = key + url_encode(path) + t
print("S: " + a)
sign_s = summd5(a).lower()
sign_part = "sign=" + sign_s + "&t=" + t
return sign_part
def sign_url(key, t, p_url):
url = urllib.unquote(p_url)
up = urlparse(url)
path = up.path
sign_part = sign(key, t, path)
p_query = up.query
if p_query:
query_part = "?" + p_query + "&"+ sign_part
else:
query_part = "?" + sign_part
return up.scheme + "://" + up.netloc + url_encode(path) + query_part
def printurl_encode_help():
print '''
def signt_help():
print
print "./signt.py time <key> <url> <t,eg: 3600>"
print "./signt.py deadline <key> <url> <deadline>"
print "./signt.py check <key> <signed_url>"
print "./signt.py show <t, eg: 55bb9b80>"
print "./signt.py genkey"
print "\n"
print '''
print "\n"
printurl_encode_help()
def sign_time(key, url, rang):
print("range: " + str(rang))
deadline = to_deadline(rang)
sign_deadline(key, url, deadline)
def sign_deadline(key, url, deadline):
print("\nkey: " + key)
print("\nurl: " + url)
print("\ndeadline: " + t16(deadline) + ", " + str(deadline) + ", " + time.ctime(deadline))
print
t = t16(deadline)
signed_url = sign_url(key, t, url)
print "\nsigned_url:"
print signed_url
print
# signed_url 是正确 url_encode 编码后签出的 url
# 见 url_encode 方法注释
def sign_check(key, signed_url):
print "\n 要求: 待检测的 url 是正确 url_encode 编码后签出的 url"
printurl_encode_help()
u = urlparse(signed_url)
t = parse_qs(u.query)["t"][0]
sign_s = summd5(key + u.path + t).lower()
print
print("deadline: " + str(int(t, 16)) + " , " + time.ctime(int(t, 16)))
print(sign_s)
print(parse_qs(u.query)["sign"][0] == sign_s)
def show_t(t):
i_t = int(t, 16)
s_t = time.ctime(i_t)
print(t + " : " + str(i_t) + " : " + s_t)
# 仅用于测试
def gen_key():
print base64.urlsafe_b64encode(str(uuid.uuid4()))[:40].lower()
try:
type = sys.argv[1]
if type == "time":
sign_time(sys.argv[2], sys.argv[3], int(sys.argv[4]))
elif type == "deadline":
sign_deadline(sys.argv[2], sys.argv[3], int(sys.argv[4]))
elif type == "check":
sign_check(sys.argv[2], sys.argv[3])
elif type == "show":
show_t(sys.argv[2])
elif type == "genkey":
gen_key()
else:
signt_help()
except Exception as e:
print traceback.format_exc()
signt_help()
回源鉴权
七牛云的回源鉴权 是一种高级安全机制,用于在用户请求资源时,将请求转发到源站进行鉴权验证。只有通过鉴权的请求才会返回资源内容,否则返回403错误。

- 使用回源鉴权功能,每次请求都要鉴权,访问量大时,需考虑鉴权服务器的压力和访问性能。
- 回源鉴权与时间戳防盗链功能不能同时开启。
总结
对以上几种访问控制的总结:

一般来说自己网站的资源包会直接把下载链接挂在网站上,如果资源包被别人恶意盗刷。比如每天 24 小时不间断狂下载,这样对服务器流量消耗非常大。
来算个账:
100MB × 24小时 × 60分钟 × 60 秒 = 8,640,000MB = 8,437GB = 8T
别看 100M 的文件小,如果这么下载这量算下来要花上几百上千元了。当然这哥们没这么丧心病狂的刷,是个随机时间大概在 1~3 分钟左右刷 1 次,算下来 24 小时60 分钟100MB=1T,这里是按最小间隔 1 分钟,所以应该是每天小于 1T 的流量和统计的 600GB 也能对的上。
如果遇到丧心病狂的哥们,所以掌握及时阻止的方法非常有必要。
1、被盗刷后,先做好这几步:
- 第一步:通过日志查到 ip,再加入黑名单(比较多时可能增加 ip 段)
- 第二步:设置 qps,这个开个工单找客服(这个要注意他们的上班时间客服是 7*24 小时,对应的技术员不一定在,及时找他们)
- 第三步:设置Referer 防盗链
一般来说设置好这 3 步就差不多了,如果有研发能力就可以使用时间戳防盗链或回源鉴权来实现(时间戳防盗链与回源鉴权它们是互斥的只能二选一)。
另外就是可以配置几个告警通知,让你提前知道被盗刷,提前做好应对。
2、高级防盗
高级防盗刷就可以把官网几种访问控制配置(时间戳防盗链与回源鉴权)。
以下是官方文档的入口:
developer.qiniu.com/fusion/4960...
3、盗刷动机
恶意竞争: 某些竞争对手可能通过盗刷流量来增加对方的运营成本,尤其是在对方依赖CDN服务的情况下。通过大量刷取流量,可以让对方支付高额的CDN费用,甚至导致服务中断。
DDoS攻击: 盗刷流量有时也可能是DDoS(分布式拒绝服务)攻击的一部分,目的是通过大量请求让服务器过载,导致正常用户无法访问。
技术测试或挑战: 有些黑客或技术爱好者可能出于技术挑战的目的,尝试突破CDN的安全防护机制,盗刷流量以证明自己的技术能力。成功盗刷流量可能被视为一种"成就",尤其是在黑客社区中,这种行为可能被用来炫耀或展示自己的技术水平。
数据窃取: 盗刷流量有时可能是为了获取存储在CDN中的敏感数据,如图片、视频或其他资源。通过大量下载,攻击者可以快速获取大量数据,尤其是当这些数据未加密或未设置严格的访问控制时。
我是栈江湖,如果你喜欢此文章,不要忘记点赞+关注!