Appearance
从IP看异常:威胁溯源和风险IP识别的入门玩法
做安全的同行常把"威胁溯源"挂在嘴边,听着很玄乎。其实对普通开发者来说,用IP数据做最基础的风险识别,门槛远没有想象中高。
这篇聊聊,不依赖商业威胁情报库,怎么用IP查询接口做入门级的风险识别和溯源。我用的还是IP9这个免费接口。
风险IP的几个"长相"
见多了你就有直觉了,风险IP通常长这样:
- 归属地漂移:同一账号登录IP在极短时间内横跨多个城市/国家;
- 机房IP:
ip_type是 IDC,说明是服务器/脚本,不是真人; - 匿名化特征:IP背后是VPN/代理,归属地和真实位置对不上;
- 异常时段:大量请求集中在凌晨(真人不会那样)。
入门玩法1:IP画像打分
把上面几个特征做成一个简单的"风险分":
python
def ip_risk_score(info):
score = 0
if not info:
return 50 # 查不到,中立偏疑
if info.get("ip_type") == "IDC":
score += 40
if info.get("country") == "中国" and not info.get("prov"):
score += 10
return score配合行为数据(登录频率、设备数),可以做个基础的"异常检测"。这是我之前做电商风控时的起点。
入门玩法2:账号-IP-时间三维关联
这是"溯源"最核心的思路:把账号、IP、时间串起来看。
python
def trace_account(user_id, events):
# events: [(ip, time, action), ...]
seen = []
for ip, t, action in events:
info = query_ip(ip)
loc = f"{info.get('prov')} {info.get('city')}" if info else "未知"
seen.append({"time": t, "ip": ip, "loc": loc, "type": info.get("ip_type"), "action": action})
# 按时间排序后人工/自动分析
return seen比如一个账号,30分钟内登录IP从"北京"跳到"香港"再跳到"美国机房",这种不用看第二条,基本就是被盗号或代理。
入门玩法3:高频攻击源识别
把一段时间内访问异常的IP单独沉淀成"风险名单":
python
from collections import defaultdict
import time
hit = defaultdict(list)
def observe(ip):
now = time.time()
hit[ip] = [t for t in hit[ip] if now - t < 60]
hit[ip].append(now)
if len(hit[ip]) > 100: # 1分钟内超100次
mark_risky(ip) # 标记,触发频率限制/验证码积累下来,你会得到一份"本网站的高风险IP名单",这些IP往往反复来捣乱。这个名单可以入库,下次直接拦截,响应速度比实时判断快得多。
进阶:ASN 维度
IP9 的VIP字段里有 ip_asn(AS号)。懂网络的知道,AS号代表一个网络机构。同一ASN下出现大量异常流量,说明"某个机构/机房被用来干坏事了"。
入门阶段,可以记录"异常IP的ASN分布",看是不是集中在几个ASN上——如果是,说明有批量操作,可以针对性处理。
溯源到什么程度算"够"
说句实在话,普通人做"溯源"到不了"揪出真人"那一步(那需要执法机构配合)。但我们能做的:
- 识别异常:这IP看着就不对;
- 提前拦截:把风险挡在业务之外;
- 留痕:记录证据链(时间、IP、归属地),出事有据可查。
这三步做到位,对绝大多数中小项目已经很有价值了。
别越过的红线
- IP信息属于个人信息的范畴,收集、保存要合规,别乱用、别裸存当营销数据;
- 风险判断别一刀切,IDC IP也可能是正常业务(比如企业办公);
- 溯源结果别用于人肉,那是违法的,也是没必要的。
小结
用IP做威胁溯源,本质是把"谁、在哪、什么时候、干了什么"串起来。免费的IP9能提供归属地、IP类型、ASN这些基础信号,够你搭一套入门级的风险识别系统了。