访问控制排障指南

更新时间:
复制 MD 格式

当访问CDN加速资源返回403错误,或域名出现流量异常、疑似被恶意盗刷时,请按照本文的症状分类定位原因并处理。本文仅收录排障类问题,配置与咨询类问题请参见访问控制常见问题

症状速查

通过curl -v或浏览器开发者工具查看响应头中的X-Tengine-Error字段,对照下表快速定位原因:

X-Tengine-Error

原因

排查章节

denied by req auth: no url arg auth_key

URL鉴权:未携带鉴权参数

URL鉴权导致的403

denied by req auth: expired timestamp

URL鉴权:鉴权过期

URL鉴权导致的403

denied by req auth: invalid md5hash

URL鉴权:签名计算错误

URL鉴权导致的403

denied by Referer ACL

Referer黑白名单拦截

Referer黑白名单导致的403

denied by IP ACL = blacklist

IP命中黑名单

IP黑白名单导致的403

denied by IP ACL = not in whitelist

IP不在白名单

IP黑白名单导致的403

black ua

UA命中黑名单

UA黑白名单导致的403

not in white ua

UA不在白名单

UA黑白名单导致的403

无此字段,且X-CacheMISS

源站返回的403

源站返回的403

说明:如果响应头中存在X-Tengine-Error但值不在上表中,或域名开启了远程鉴权功能,请参见远程鉴权导致的403

如何判断403CDN返回的还是源站返回的?

访问加速资源返回403时,先判断403的来源,再按对应症状族排查:

  • 在浏览器开发者工具或curl -v命令中查看响应头。如果响应头中包含X-Tengine-Error字段,说明403CDN节点返回,根据该字段的错误信息对照上方速查表定位原因,请参见URL鉴权导致的403Referer黑白名单导致的403CDN其他访问控制导致的403

  • 如果响应头中不包含X-Tengine-Error字段,请通过修改本地hosts文件将加速域名指向源站IP,直接访问源站验证。如果源站同样返回403,说明是源站自身的访问控制策略拦截了请求,请参见源站返回的403。源站侧通用排查方法另请参见回源排障指南

URL鉴权导致的403

开启URL鉴权功能后,如果请求未携带鉴权参数或鉴权参数无效,CDN会返回403。通过响应头中的X-Tengine-Error: denied by req auth信息判断具体原因。

说明:URL鉴权仅控制访问权限,鉴权结果不影响CDN的缓存行为。鉴权通过后,CDN节点会去除URL中的鉴权参数(如auth_key),使用原始URL作为缓存标识(Cache Key),不同用户针对同一资源生成的不同鉴权URL命中同一份缓存。鉴权过期仅导致后续新请求被拦截返回403,不会使已缓存的资源失效。

报错denied by req auth: no url arg auth_key(未携带鉴权参数)

  • 问题原因:CDN开启了URL鉴权,但实际访问的URL中没有携带鉴权参数。

  • 解决方案:如果您需要使用鉴权功能,请按照URL鉴权配置为请求生成并携带正确的鉴权参数。如果您不需要鉴权功能,登录CDN控制台关闭该域名的URL鉴权即可。

报错denied by req auth: expired timestamp(鉴权过期)

  • 问题原因:URL携带了鉴权参数,但鉴权参数中的时间戳已过期。鉴权URL的有效期由您配置的有效时长决定,超过有效时长后鉴权失效。

  • 解决方案:请参见URL鉴权配置重新生成鉴权URL。如果您的业务页面加载时间较长,可以适当延长鉴权有效时长。

报错denied by req auth: invalid md5hash(鉴权计算错误)

  • 问题原因:鉴权参数的MD5值计算不正确,通常是鉴权代码的签名算法与CDN鉴权方式的要求不一致导致。

  • 解决方案:建议先使用CDN控制台的地址生成器生成鉴权URL,与您自己的鉴权代码生成的URL逐字段对比,定位签名差异。各鉴权方式的签名算法说明请参见鉴权方式A说明,鉴权代码示例请参见鉴权代码示例

Referer黑白名单导致的403

配置Referer黑白名单后,如果请求的Referer与规则不匹配,CDN会返回403,响应头中的错误信息为X-Tengine-Error: denied by Referer ACL。您可以使用curl -e "<Referer值>" <加速资源URL>命令模拟携带指定Referer的请求进行验证。

携带Referer的请求被拦截(denied by Referer ACL)

  • 问题原因:请求携带的Referer不在白名单内,或命中了黑名单。常见于黑白名单白名单配置遗漏了实际引用资源的站点域名。

  • 诊断方法:在CDN控制台查看该加速域名的Referer黑白名单配置,判断被拦截请求的Referer是否匹配规则。也可以通过下载CDN日志找到对应访问记录的Referer头。

  • 解决方案:将被拦截的Referer加入白名单(或从黑名单移除)。配置方法请参见配置Referer黑/白名单

Referer的请求被拦截(直接访问URL返回403)

  • 问题原因:以下场景的请求不携带Referer(即空Referer):通过浏览器地址栏直接访问资源URL;在APP或客户端程序中构造请求未设置Referer头;HTTPS页面引用HTTP资源时浏览器根据默认Referrer-Policy不发送Referer;页面显式设置了Referrer-Policy: no-referrer;使用curl、wget等命令行工具默认不携带Referer。如果Referer黑白名单配置未勾选允许通过浏览器地址栏直接访问资源URL,空Referer请求会被拦截。

  • 解决方案:如果业务需要允许空Referer访问,在Referer黑白名单配置中勾选允许通过浏览器地址栏直接访问资源URL;如果是为了防范空Referer盗刷而有意拦截,请勿放开,并参见流量异常与恶意盗刷配置更精细的防护策略。配置方法请参见配置Referer黑/白名单

CDN其他访问控制导致的403

IP黑白名单导致的403

配置IP黑/白名单后,如果客户端IP命中黑名单或不在白名单内,CDN节点拒绝请求并返回403。响应头X-Tengine-Error: denied by IP ACL = blacklist表示命中IP黑名单,X-Tengine-Error: denied by IP ACL = not in whitelist表示不在IP白名单内。

  • 诊断方法:先确认客户端的真实公网IP(可通过curl ifconfig.mecurl myip.ipip.net查询)。如果请求经过了代理或负载均衡,CDN获取的客户端IP可能是代理IP而非终端用户IP,需确认CDN节点实际识别到的客户端IP。在CDN控制台查看该域名的IP黑/白名单配置,确认该IP是否匹配规则。

  • 解决方案:先确认拦截是否符合预期。如需放行该IP,在CDN控制台的域名管理中单击目标域名对应的管理,在左侧导航栏单击访问控制,在IP黑/白名单区域调整规则。配置方法请参见配置IP黑/白名单。如果IP黑名单中的IP仍可访问资源,请参见为什么IP黑名单中的IP仍可访问资源?

UA黑白名单导致的403

配置UA黑/白名单后,如果请求头中的User-Agent命中UA黑名单或不在UA白名单内,CDN节点拒绝请求并返回403。响应头X-Tengine-Error: black ua表示命中UA黑名单,X-Tengine-Error: not in white ua表示不在UA白名单内。

  • 诊断方法:通过curl -v <加速资源URL>查看请求实际发出的User-Agent值,或在浏览器开发者工具的请求头中查看。在CDN控制台查看该域名的UA黑/白名单规则,确认是否匹配。注意UA黑白名单支持通配符匹配,检查是否被通配规则意外命中。

  • 解决方案:先确认拦截是否符合预期。如需放行,在CDN控制台的域名管理中单击目标域名对应的管理,在左侧导航栏单击访问控制,在UA黑/白名单页签下调整规则。配置方法请参见配置UA黑白名单

远程鉴权导致的403

开启远程鉴权后,CDN节点会将请求转发给您指定的鉴权服务器验证,以下两种情况会拦截请求并返回403:

  • 鉴权服务器返回了配置中定义的鉴权失败状态码(例如403),CDN判定鉴权失败,拒绝用户请求。

  • 鉴权超时(CDN节点与鉴权服务器的交互未在配置的超时时长内完成),且鉴权超时之后的动作配置为拒绝

  • 诊断方法:如果403不属于上述URL鉴权、Referer、IP ACL、UA ACL中的任何一种(响应头中的X-Tengine-Error值均不匹配),且域名开启了远程鉴权功能,则应优先排查远程鉴权。在CDN控制台查看该域名远程鉴权配置的鉴权失败状态码鉴权超时配置鉴权超时之后的动作,再结合鉴权服务器的访问日志,确认鉴权服务器实际返回的状态码以及是否存在超时。

  • 解决方案:如果拦截不符合预期,请调整鉴权服务器的验证逻辑或鉴权失败状态码配置;如果鉴权频繁超时,请排查鉴权服务器性能(超时时长最长可设置为3000毫秒),或结合业务风险评估将鉴权超时之后的动作调整为通过。配置方法请参见配置远程鉴权

源站返回的403

如果响应头中不包含X-Tengine-Error字段,且X-CacheMISS,说明CDN未命中缓存、请求回源后由源站返回了403。此时需要排查源站自身的访问控制策略。

源站为OSS时的403(AccessDenied等报错)

403OSS源站返回,常见报错有三种:

  • 报错You have no right to access this object because of bucket acl:源Bucket为私有读权限,CDN回源请求未通过OSS鉴权。建议在CDN控制台开启OSS私有Bucket回源授权。配置方法请参见OSS私有Bucket回源

  • 报错You are denied by bucket referer policy:Bucket设置了Referer黑白名单,CDN回源请求的Referer不符合Bucket黑白名单规则。在OSS控制台检查Bucket黑白名单设置,允许CDN回源请求访问(例如允许空Referer,或将CDN回源时携带的Referer加入白名单)。

  • 报错You are forbidden to list buckets:同时开启了CDN私有Bucket回源与OSS静态网站托管,两个功能存在冲突。需关闭其中一个:关闭CDN私有Bucket回源授权,或关闭OSS静态网站托管功能。冲突说明请参见CDN回源OSS私有Bucket功能与OSS静态网站托管功能的默认首页配置冲突

回源HOST或其他源站策略导致的403

  • 问题原因:CDN回源时,回源HOST决定了回源请求访问源站IP地址上的哪个站点。如果回源HOST配置错误,可能匹配到源站上未提供服务或有访问限制的站点,导致源站返回403。此外,源站自身的防火墙规则、WAF策略或应用层访问控制也可能拦截CDN的回源请求。

  • 诊断方法:通过绑定hosts的方式将加速域名指向源站IP,直接访问源站验证是否也返回403。检查CDN控制台中的回源HOST配置,确认其指向源站上实际提供服务的站点。

  • 解决方案:修正回源HOST配置,确保回源HOST指向源站上实际提供服务的站点。如果源站有防火墙或WAF拦截了CDN回源请求,将CDN回源IP段加入源站白名单。源站侧通用排查方法请参见回源排障指南

流量异常与恶意盗刷

域名被恶意攻击或流量被恶意盗刷,会产生突发高带宽或大流量,主要带来两类风险:

  • 域名被切入沙箱:阿里云CDN是公共加速服务,默认不提供抗攻击能力。当域名遭受攻击时,CDN系统有权根据业务情况与攻击影响程度将域名切入沙箱,防止影响其他用户的加速服务。攻击较严重时,同账户下的其他域名也可能被切入沙箱,并限制账号下的新域名接入。域名进入沙箱后,CDN不再保证服务质量。关于沙箱的详细说明,请见沙箱说明

  • 恶意访问带来高额账单:攻击与盗刷行为实际消耗了CDN带宽资源,产生的流量带宽费用由您自行承担,极易出现高额账单,甚至导致账户欠费停机。关于延停服务、费用控制等,请见高额账单风险警示

如何确认域名是否遭受盗刷或攻击?

通过以下方式初步确认:

  • 登录CDN控制台,在监控报表中查看域名的带宽和流量趋势,观察是否存在非业务时段的异常峰值。

  • 下载域名的CDN访问日志,分析访问来源的IP分布、Referer分布和UA分布,识别是否存在高频访问的异常IP段、异常Referer来源或爬虫类UA。

  • 云监控中检查是否已触发带宽或流量报警。

如何防护和处理?

建议提前做好防护:通过报警设置功能配置带宽峰值和下行流量的报警规则,达到阈值时及时收到通知;根据攻击特征配置IP黑名单、Referer黑名单、UA黑名单或URL鉴权等访问控制策略进行拦截。针对盗刷场景的拦截方案请参见防范流量盗刷最佳实践

如果域名已被切入沙箱,需等待攻击流量消退后提交工单申请解除沙箱。为避免再次触发,建议在解除前配置好访问控制策略。