做网站安全和反爬对抗这些年,我接触过不少第三方防护体系,akamai的SBSD绝对是绕不开的一个话题。准确说,SBSD并不是某个单一功能的名字,而是项目里对akamai侧一套组合防护方案的简称,通常包含Site Shield(源站隐藏)、Bot Manager(爬虫管理)以及ABCK(akamai bot control的动态脚本质询机制),而JA3指纹则是它在TLS握手层做客户端识别的重要依据。这篇文章不从对抗视角去做任何绕过演练,而是纯站在防护者角度,把这套体系的组成逻辑、技术原理、配置思路和常见故障讲透,适合做安全策略、反爬运营、站点架构的同学们参考。
1. SBSD到底是什么:先理清概念和整体架构
1.1 SBSD不是单一产品,而是一套组合防护方案
很多同学第一次看到“SBSD”这个缩写,会下意识去文档里找官方定义,但翻了一圈会发现akamai官方并没有一个条目叫“SBSD”。实际上,这是项目开发和方案设计过程中形成的简称,通常指代Site Shield + Bot Manager + Security相关模块的组合部署模式。简单说,你接入akamai之后,CDN加速只是最基础的一层,SBSD强调的是在CDN之上叠加安全防护能力,让流量在到达源站之前就被过滤、识别和处置。
Site Shield负责隐藏源站IP,它让源站只接收来自akamai边缘节点或特定回源网段的请求,外部用户直接扫源站IP是扫不到的,也无法绕过CDN直接打源。Bot Manager则负责区分真实用户和自动化程序,这里会用到JA3、行为分析、IP信誉、设备指纹等多种信号。ABCK是Bot Manager体系里一个偏前端质询的机制,通过下发的动态JavaScript脚本做环境检测和用户行为验证,然后生成带有标记的cookie或token供后续请求使用。三者叠加,SBSD本质上就是“边缘缓存加速 + 源站隐藏 + 客户端识别 + 动态质询”的一套纵深防御链路。
1.2 流量链路:从用户请求到源站,中间经历哪几层
理解SBSD,最关键的是先画清楚一条请求的完整链路:
用户发起请求后,先经过DNS解析,域名CNAME到akamai的边缘节点。边缘节点根据配置决定是直接命中缓存返回,还是回源获取内容。但如果开启了Site Shield,回源这一步并不会直接连到源站公网IP,而是走akamai内部的回源网络,源站防火墙只需要放行特定网段。回源之前,边缘节点会执行安全策略:先做IP维度的信誉检查,再采集TLS握手信息生成JA3指纹,判断客户端类型;如果请求敏感或存在异常特征,会触发ABCK动态质询,要求浏览器执行脚本、生成一个校验cookie,再放行或拦截。
这个顺序很重要,因为每一层都在筛掉一部分流量。IP信誉在边缘最快,JA3在握手阶段就完成识别,ABCK放在应用层最后兜底。如果你理解了这条链路,后续排查“回源502”“cookie频繁刷新”“私密接口被拉取”这类问题,就能快速定位是哪一层出了问题。
1.3 为什么把TLS指纹和JS质询放在一起看
很多纯前端安全方案喜欢只做JS质询,但因为自动化工具执行JS的能力越来越强,单纯的质询很容易被模拟出来。反过来,如果只靠TLS指纹,又容易被批量改指纹的客户端绕过。SBSD的高明之处在于把多个信号交叉验证:TLS指纹解决“这个客户端用什么方式发起的连接”,ABCK解决“这个客户端环境里是否运行了正常的浏览器上下文”,Site Shield解决“即使前面全被绕过了,源站依然不会被直接找到”。
所以这三个东西不是竞争关系,而是互补关系。理解了它们的定位,你在配置和调优时就不会走偏,不会过度依赖某一个指标做一刀切。
2. JA3指纹:TLS握手中的“身份证”
2.1 JA3是什么,怎么做出来的
JA3是一种对TLS客户端握手信息做标准化哈希的算法。它不分析证书、不解密内容,只看ClientHello消息里的几个关键字段,然后按顺序拼接成一个字符串,再做MD5生成一个固定长度的指纹值。不同客户端、不同操作系统、不同TLS库发出来的ClientHello在字段顺序和取值上有细微差异,这些差异经过哈希后就表现为不同的JA3值。
标准JA3的取值字段包括:TLS版本号、支持的加密套件列表、扩展类型列表、椭圆曲线列表、椭圆曲线格式列表。把这些字段按顺序组合起来,就得到了一个类似“771,4865-4866-4867,0-11-10-35-13-43-45,29-23-24-25,0”这样的字符串。我见过很多同学对这串数字感到头疼,但其实你没必要手工算,用抓包工具或现成的JA3库就能直接生成。
2.2 为什么akamai会采集JA3,它解决什么问题
JA3的价值在于它是TLS层的一个低成本信号。浏览器和常见的自动化网络库在TLS实现上有明显差别,比如curl、python requests、某些快速开发框架发出来的ClientHello特征和Chrome、Firefox完全不同。akamai的边缘节点在握手的瞬间就能算出JA3,然后去和已知客户端指纹库比对,快速判断“这个访问者是不是一个真实的浏览器”。
实际使用中,JA3能解决一个很实际的问题:识别批量低成本自动化请求。比如有人用最简单的HTTP客户端带着你的cookie去刷接口,这种请求在行为上可能和真人差异不大,但TLS指纹直接暴露了它。当然JA3也有局限性,它只能识别客户端类型,不能判断身份,而且现在不少攻击者已经学会了模拟浏览器TLS指纹,所以它更多是作为“嫌疑信号”之一,而不是唯一决策依据。
2.3 实际观测时注意哪些细节
我在配置和排查JA3相关策略时踩过几个坑,这里分享几点经验:
第一,TLS指纹稳定性并没有你想的那么高。同一个浏览器在升级后,加密套件和扩展列表会变化,JA3值会变,所以指纹库需要持续更新。第二,注意ALPN和SNI的影响,不同网站环境可能影响ClientHello里的扩展顺序,同一种浏览器访问不同站点可能指纹不完全一致。第三,移动端App的TLS栈多种多样,指纹分布非常离散,如果你把策略做得太死,容易误伤正常App用户。
提示:在做JA3策略前,先花一周采集自己站点实际流量的指纹分布,看清TOP指纹占多大比例,再决定是否启用拦截。凡是没做过基线统计就直接封指纹的,后面一定会被误杀问题搞得焦头烂额。
3. ABCK脚本:一体化动态质询机制
3.1 ABCK到底是什么,和旧版本的关系
ABCK是akamai bot control体系里的一个关键模块,本质上是边缘节点下发给浏览器的一段动态JavaScript。它的目标不是做功能交互,而是做环境合法性验证。早期akamai也有类似PXL等脚本方案,但ABCK在代码结构、混淆强度、动态更新频率上都做了大幅升级。它会在浏览器里采集一系列环境信息,包括但不限于Canvas渲染特征、WebGL信息、时间行为、鼠标轨迹、Cookie状态、浏览器插件列表等,然后根据这些信息计算出一个结果,写进特定的cookie标记里,后续请求带着这个标记,边缘节点只需验证标记合法性即可判断是否放行。
需要注意,ABCK脚本内容不是固定不变的,它会根据策略动态组合,不同地区、不同时间下发的脚本都可能不一样。这种动态性使得简单复用一个旧脚本是没用的,因为你拿到的那份脚本在下次请求时可能已经失效。
3.2 执行链路拆解:请求-下发-评估-标记
一次完整请求的ABCK质询链路大致是这样的:
第一次请求到达边缘节点,节点查看请求携带的cookie里是否有合法的ABCK标记。如果没有,节点返回一段带脚本的HTML挑战页,浏览器自动执行该脚本。脚本完成采集和计算后,通过特定方式(通常是附加参数或额外的同步/异步请求)把结果上报,边缘节点校验结果。校验通过后,下发标记cookie,浏览器带着这个cookie重新发起原始请求,此时节点放行。
这个过程中有两个容易被忽略的点。一是评估时机:质询不一定要放在整页加载前,akamai也支持对特定API接口单独启用ABCK校验,这就考验策略配置的细致程度。二是标记有效期:cookie不是永久有效的,过期后需要重新执行质询,所以你会看到正常用户每隔一段时间也会出现一次短暂延迟或额外请求,这是预期行为。
3.3 从防护者视角,如何判断质询是否生效
作为防护方,你不需要去逆向ABCK的算法,但你要能判断它到底有没有生效。我的经验是看三类信号:
第一类是响应特征:当ABCK质询触发时,响应里会包含一段较长的动态脚本,并且响应头里会出现与挑战相关的标识字段,而不是直接返回200内容。第二类是cookie特征:用户完成质询后,浏览器里会出现特定的标记cookie,名字一般是固定的前缀加动态串,你可以让测试用户打开开发者工具查看Application面板中的Cookie列表。第三类是流量特征:边缘节点的安全报表中,质询触发次数、质询通过率、恶意请求拦截数都会有明显变化。
注意:我曾见过有人配置完ABCK后只在浏览器里手动测试一次,没注意cookie已经存在就直接返回了,于是以为质询没生效。正确的验证方式是清空所有浏览器数据,开启无痕窗口,打开抓包工具从空cookie状态开始观察完整链路。
4. 防护策略的分层设计与实操要点
4.1 三层策略建议
基于SBSD的组合原理,我建议把防护策略分成三层来设计:
第一层是边缘准入层,用在最前面,重点处理IP信誉、地区策略、TLS指纹异常。这一层的原则是“粗筛”,只拦截那些明显不合理的请求,比如来自黑名单IP段、高频访问、非浏览器TLS特征的请求。第二层是行为分析层,基于请求频率、访问路径、点击行为、Cookie完整性做判断,适合发现那些模拟浏览器外壳、但行为逻辑不自然的自动化程序。第三层是动态质询层,由ABCK承担,只针对前两层标记为“可疑但不确定”的流量下发挑战。
三层策略的好处是降低误伤。如果一上来就对所有流量做ABCK质询,正常用户的首次访问体验会很差;但如果你只对高可疑流量做质询,绝大部分正常用户根本感知不到防护的存在。
4.2 配置ABCK时的阈值和处置动作建议
关于处置动作,akamai策略里一般有观察、质询、拒绝几个级别。我的建议是分阶段上线:
第一阶段全部置为观察,只记录日志不干预,持续一周左右收集基线数据。第二阶段在高风险路径上启用质询,例如登录接口、注册接口、查询接口,观察误伤比例。第三阶段才考虑对特定异常特征启用直接拒绝动作。
阈值设置上,重点关注“质询通过率”。如果通过率长期偏低,可能是策略过严,把部分正常用户也挡在门外了;如果通过率接近100%,则说明策略过于宽松,恶意流量也轻松过关。一个比较健康的通过率区间通常在85%到95%之间,具体要结合业务形态判断。各类爬虫和自动化工具在质询环节会出现明显的执行失败或超时,这才是你应该关注的拦截点。
4.3 前端改造配合
配置SBSD之后,前端代码也需要做一些配合,否则会出现一些莫名其妙的问题。最常见的是Cookie属性设置:如果质询标记cookie被显式设置为httpOnly,前端JavaScript无法读取它,那些依赖前端判断登录状态的逻辑就要调整。另外,如果你的业务有跨子域共享登录态的需求,注意cookie的domain设置要一致,否则ABCK标记和业务cookie互相独立,会导致用户反复被质询。
还有一个容易被忽略的点是混合内容。如果站点某个页面通过https加载了http子资源,浏览器会拦截该请求,而ABCK脚本在部分场景下通过子资源加载来上报数据,一旦被浏览器拦截,质询就永远无法完成,用户表现为“一直转圈但进不去页面”。我在实际项目里遇到过这种问题,排查到最后发现是第三方统计脚本用了http链接,非常隐蔽。
5. 常见问题与排查实录
5.1 问题速查表
| 现象 | 可能原因 | 初步排查方向 |
|---|---|---|
| 回源502/504 | Site Shield回源网段未完全放行 | 检查源站防火墙、安全组白名单 |
| 用户频繁被质询 | Cookie未写入或跨域问题 | 检查前端是否启用第三方Cookie,Cookie Domain设置 |
| 正常用户被拦截 | 策略阈值过严 | 降低直接拒绝级别,改为质询 |
| ABCK脚本加载失败 | 页面存在混合内容或资源被优化工具延迟加载 | 查看浏览器Console的Mixed Content报错 |
| 接口数据仍被拉取 | 接口未纳入ABCK保护范围 | 确认策略匹配规则的Method和Path是否正确 |
| 质询通过率偏低 | 小程序/App客户端无法执行JS | 为API客户端单独配置设备指纹方案 |
| 缓存导致旧脚本被复用 | 边缘节点缓存了旧质询页 | 调整脚本缓存时间,强制刷新 |
这个表是实际排查的一个起点。遇到问题时,我一般会先问几个问题:现象是偶发还是必现?只影响特定地区还是全网?是首次访问还是登录后出现的?这些信息能快速缩小范围。
5.2 调试ABCK质询时的思路
如果你有一个测试账号,最好准备一台干净的浏览器环境来调试。打开开发者工具,切到Network面板,勾选Preserve log,然后清空所有Cookie,手动输入域名访问。重点关注第一个HTML文档请求的响应:是否包含挑战脚本,后续是否有额外的验证请求,验证请求返回了什么状态码,Set-Cookie是否写成功。
一个非常实用的技巧是:在开发者工具Network面板里,右键相关请求,复制为cURL,再看cURL方式访问的结果是否和浏览器一致。如果cURL能直接拿到数据,说明ABCK校验没有覆盖该接口;如果cURL被拦截而浏览器正常,则说明质询链路是通的,问题可能出在你的业务前端没有正确携带cookie。这个小技巧能帮你快速区分“策略没生效”和“策略生效但前端不配合”这两种情况。
5.3 源站隔离和回源配置的坑
Site Shield虽然能隐藏源站IP,但它依赖一个前提:源站只接收来自akamai回源网段的流量。这个网段在白名单配置时一定要把整段都加进去,不能只加当前正在使用的几个节点IP。akamai边缘节点有伸缩机制,流量高峰时会自动扩容,新节点的IP可能不在你的白名单里,来源就被拒了,表现为不定期的502。
另一个坑是回源HOST头。如果你的源站用nginx配置了多个虚拟主机,Site Shield回源时用的HOST头必须是源站上真实存在的域名,否则nginx会返回默认站点的内容或者直接拒绝。很多次我们排查“为啥开了SBSD后源站日志里看不到请求”,最后发现是回源HOST头写错导致请求根本没到达正确的应用容器。
6. 个人经验与总结
我从一个实践者的角度说说这套体系给我最大的感受。akamai SBSD确实不是单一产品,而是组合拳思维的具体体现:边缘层有Site Shield藏源,传输层有JA3做指纹识别,应用层有ABCK做动态质询。理解这套组合逻辑之后,你会发现无论用哪个厂商的防护产品,大多数思路都是相通的,核心始终是识别客户端身份和隔离源站风险。
如果你正在评估或配置类似的体系,我给的建议是不要一上来就追求“全副武装”。先梳理自己的核心资产和风险路径,想清楚哪些接口泄漏会造成实际损失,再把最关键的路径纳入强校验。策略上线时务必先观察后拦截,给团队留出适应和调整的时间。另外,养成保存基线日志的习惯,很多问题在发生之后回头看日志才能定位根因,临时抓包往往来不及。
这整套东西在实际运营里还有很多细节值得慢慢沉淀,后面如果大家感兴趣,我可以再展开聊聊具体某个模块的调优记录。希望这篇文章能给你一些真正能落地的参考。