4. 核心原理
Impossible Travel 的判定本质,不是“这次登录看起来可疑”,而是“这次登录在物理上不可能”。它的核心逻辑非常朴素:同一个账号在两次成功登录之间,如果跨越的地理距离,超过了人类在两次登录时间差内所能完成的最大移动距离,那么这两次登录就不可能由同一个真人完成。由此可以推断:至少有一次登录是攻击者伪造的,或者账号凭证已经泄露。
这个判断之所以有效,是因为它把抽象的“异常”转化成了可计算的物理约束。速度 = 距离 ÷ 时间。只要这个速度超过合理上限,就触发告警。难点不在于公式,而在于:距离怎么算、时间怎么取、阈值怎么设、误报怎么压。
一、核心公式与判定逻辑
最基础的判定模型如下:
required_speed = distance(login_A.geo, login_B.geo) / (login_B.time - login_A.time)
if required_speed > max_travel_speed:
trigger_impossible_travel()
其中:
- distance:两次登录地点之间的地理距离,通常用 Haversine 公式计算球面大圆距离。
- time:两次登录的时间差,必须使用同一时区或统一转为 UTC 时间戳。
- max_travel_speed:人类在时间差内可达到的最大移动速度阈值,通常取 800~1000 km/h,接近民航巡航速度。
这里有一个关键工程细节:时间差必须取“后一次登录时间 - 前一次登录时间”,且必须为正。如果时间差为负或为零,说明日志顺序或时间同步有问题,不能直接进入速度计算,而应先做数据清洗。
核心结论:Impossible Travel 不是“距离远就告警”,而是“距离远且时间短到物理上无法完成”才告警。距离和时间必须成对出现,缺一不可。
二、距离计算:Haversine 公式与坐标精度
地理距离不能直接用平面欧几里得距离,因为地球是球面。工程上最常用的是 Haversine 公式:
a = sin²(Δφ/2) + cos φ1 · cos φ2 · sin²(Δλ/2)
c = 2 · atan2(√a, √(1−a))
d = R · c
其中 φ 是纬度,λ 是经度,R 取 6371 km。这个公式在大多数登录场景下精度足够,误差通常在 0.5% 以内。真正影响判定质量的,往往不是公式本身,而是 IP 地理库的精度。
IP 定位通常只能到城市级,部分场景甚至只能到国家或运营商出口。如果两次登录实际发生在同一城市的不同区,但 IP 库解析成了两个相距 30 km 的城市,就会产生虚假距离。因此,工程上常做两件事:
- 对同一城市或同一 metropolitan area 的登录,直接跳过 Impossible Travel 判定。
- 对距离小于某个最小阈值(如 100 km)的登录对,不触发速度计算,避免城市级抖动造成误报。
三、速度阈值设定:从物理上限到业务容忍度
速度阈值是 Impossible Travel 最核心的参数。设得太低,误报爆炸;设得太高,漏报严重。常见阈值区间如下:
| 阈值类型 | 典型取值 | 适用场景 | 风险 |
|---|---|---|---|
| 民航巡航速度 | 800~900 km/h | 普通员工、大多数 SaaS 账号 | 误报率低,但可能漏掉短途快速切换 |
| 保守物理上限 | 1000 km/h | 跨国企业、高频出差人员 | 漏报增加,适合低敏感账号 |
| 严格安全阈值 | 500~600 km/h | 高权限账号、财务、管理员 | 误报明显上升,需配合白名单 |
| 超高速告警 | > 1200 km/h | 几乎确定异常,可直接阻断 | 极少误报,但覆盖范围有限 |
实际生产中,不建议只用一个全局阈值。更合理的做法是分层:
- 基础阈值:900 km/h,用于全量账号初筛。
- 账号画像阈值:对经常出差的账号,放宽到 1000~1100 km/h。
- 权限加权阈值:管理员账号收紧到 600~700 km/h。
- 时间窗口阈值:只比较 24 小时内的登录对,超过 24 小时的距离差异通常不再具备判定意义。
经验法则:阈值不是越严格越好。安全团队应先用 900 km/h 跑两周,统计告警量和真实事件量,再根据误报来源调整。没有数据支撑的阈值调优,本质上是在猜。
四、方法流程:从日志到告警的完整链路
一个可落地的 Impossible Travel 检测流程通常包含以下步骤:
- 采集登录日志:至少包含账号、登录时间、IP、登录结果、User-Agent。
- IP 地理化:将 IP 解析为经纬度、国家、城市、ASN。
- 按账号分组排序:同一账号的登录记录按时间升序排列。
- 相邻登录对计算:对每对相邻成功登录,计算时间差和地理距离。
- 速度判定:若 required_speed 超过阈值,标记为候选异常。
- 上下文过滤:排除 VPN、代理、Tor、企业出口 IP、已知出差白名单。
- 告警与响应:根据风险等级触发 MFA 挑战、会话撤销或人工审核。
其中第 6 步是降低误报的关键。很多 Impossible Travel 告警并不是真的“不可能”,而是因为用户使用了 VPN。例如,用户上午在上海登录,下午通过美国 VPN 节点登录,物理上确实不可能,但业务上完全合理。因此,VPN 识别和代理检测必须作为前置过滤条件。
五、案例场景:一次典型的误报与复盘
某公司安全团队收到一条 Impossible Travel 告警:账号 alice 在 10:00 于上海登录,10:45 于洛杉矶登录,距离约 10,500 km,时间差 45 分钟,计算速度约 14,000 km/h,远超阈值。初步判断为账号泄露。
但复盘后发现:alice 当天并没有出差,也没有异常操作。进一步检查 IP 情报,发现洛杉矶 IP 属于某云服务商的出口节点,而 alice 的公司使用该云服务商的全球加速网络。她的两次登录实际上都来自公司内网,只是出口 IP 被解析到了不同地区。
复盘结论:该告警是典型的“基础设施导致的误报”。修复方式不是调高阈值,而是将该公司使用的云服务商 IP 段加入白名单,并在 IP 地理化阶段优先使用 ASN 和网络归属信息,而不是单纯依赖城市级经纬度。
这个案例说明:Impossible Travel 的判定逻辑虽然简单,但工程落地时必须结合网络拓扑、代理识别和账号行为画像。否则,阈值再精细,也会被基础设施噪声淹没。
六、常见误区与优化方向
- 误区一:只看距离,不看时间。距离远不等于不可能,必须结合时间差。
- 误区二:所有账号用同一阈值。不同角色、不同出差频率的账号,容忍度不同。
- 误区三:忽略登录失败记录。失败登录同样可能暴露攻击者位置,但不应与成功登录混在一起计算速度。
- 误区四:不做时间同步。不同系统时钟偏差会导致时间差为负或异常,必须先统一时区。
- 误区五:把 VPN 当成攻击。VPN 是误报的主要来源之一,必须优先识别。
优化方向可以归纳为三点:第一,建立账号级基线,记录每个账号的常用登录地和移动模式;第二,引入 IP 情报和 ASN 信息,区分住宅 IP、数据中心 IP 和代理 IP;第三,将 Impossible Travel 与其他信号(如新设备、异常时间、敏感操作)组合评分,而不是单独依赖速度阈值做阻断决策。
本章要点:Impossible Travel 的判定核心是“距离 ÷ 时间 > 速度阈值”。距离用 Haversine 计算,时间必须统一时区,阈值建议分层设定并配合 VPN 过滤、账号画像和上下文评分。只有把物理不可能性与业务合理性分开处理,才能在低误报的前提下发现真正的账号泄露。