有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 对象存储 > 故障处理 > 访问 COS 时返回403错误码

故障现象

当 COS API、SDK 上传和下载资源时,返回403错误码。
当使用临时密钥或子账号访问 COS 资源时,返回403错误码。
当修改 COS bucket 配置时,返回403错误码。

故障分析思路

当 COS 请求出现403错误码时,可参考以下流程排查问题原因:
1. 检查请求是否为 CORS 跨域访问请求,失败的跨域请求会返回 "AccessForbidden"
2. 检查请求是否命中存储桶防盗链配置,因防盗链规则引起的 403 错误码,COS 会返回 "You are denied by bucket referer rule"
3. 检查请求是否是匿名请求,向非公有读的对象发起不带签名的请求,会返回 "Access Denied.",如要为存储桶或对象设置公有读,参考 设置访问权限设置对象的访问权限
4. 检查请求密钥和请求签名是否正确。
4.1 当签名未正确使用 SecretId 时,COS 会返回 "InvalidAccessKeyId"
4.2 当本机时间不准,或请求时间超出签名有效期时,COS 会返回 "RequestTimeTooSkewed""Request has expired"
4.3 当生成签名的计算方式存在问题时,COS 会返回 "SignatureDoesNotMatch"
5. 检查发起请求的子账号或临时密钥是否授予了相应访问权限。
5.1 检查子账号的访问权限,未授予资源访问权限的子账号请求(包括资源描述元素错误,例如 APPID 输入错误),会返回 "Access Denied."
5.2 对于使用临时密钥发起的请求,申请临时密钥时填写的策略会限制临时密钥请求的资源范围,详见 临时密钥生成与使用指引
6. 检查所请求对象是否为归档类型或深度归档类型,此类请求 COS 会返回 "InvalidObjectState"

故障定位及处理

Message 为 “Access Denied.”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
需要您执行以下操作:
2. 在左侧导航栏中,选择存储桶列表,进入存储桶管理页面。
3. 找到需要操作的存储桶,单击该存储桶名称,进入存储桶配置页面。
4. 在左侧导航栏中,选择权限管理 > 存储桶访问权限,进入存储桶访问权限管理页面。
5. 在“存储桶访问权限”栏中,检查访问 COS 的账号是否配置了访问权限。
是,请执行下一步。
否,请单击添加用户,为访问 COS 的账号设置所需权限。


6. 检查配置访问权限的账号是否具有所需权限。
是,请执行下一步。
否,请单击编辑,重新设置。
7. 在“Policy权限设置”栏中,检查访问 COS 的账号是否配置了 policy 授权策略。
注意
如果存储桶访问权限为私有读写,且 Policy 权限为匿名访问,那么 Policy 权限的优先级高于存储桶访问权限。
在 Policy 授权策略中,如果同一个子用户同时设置了允许和禁止策略,那么禁止策略的优先级高于允许策略。
在 Policy 授权策略中,“所有用户”策略的优先级低于“指定用户”策略。
是,请执行下一步。
否,请单击添加策略,根据实际签名访问时账号所需权限进行设置。


8. 检查配置 Policy 权限的账号是否具有所需权限。
是,请执行下一步。
否,请单击编辑,重新设置。
9. 检查访问 COS 资源时使用的 q-ak 参数是否为目标桶的所属账号(区分大小写)。
是,请执行下一步。
否,请将 q-ak 参数修改为相应的目标桶所属账号。
10. 检查访问 COS 资源时是否为跨账号访问。
是,请为该账号进行跨账号授权,详细操作请参见 授权跨账号的子账号对指定文件的读写权限
否,请执行下一步。
11. 检查是否使用了临时密钥。
是,请检查申请临时密钥时填写的 action 和 allowPrefix 是否正确。
例如调用 cos.putObject(),但是 action 里并没有填写 name/cos:PutObject,即没有 putObject 权限导致报错 403。
例如操作的 Key 是 1.jpg,但是 allowPrefix 填写的是 test/*(只允许操作 test/* 路径),即没有对应路径的操作权限导致报错 403。
例如所授权的资源是用户 APPID 为1250000000的资源范围,但是资源描述元素(resource)中填写的是1250000001,即没有对应 APPID 的操作权限导致 403。
注意
不同语言的 STS SDK,action 和 allowPrefix 所使用的字段不同,例如 STS Java SDK 使用的是 allowActions 和 allowPrefixes 字段,请注意留意 STS SDK 中的示例。
否,请 联系我们

Message 为 “AccessForbidden”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>AccessForbidden</Message>
需要您执行以下操作:
2. 在左侧导航栏中,选择存储桶列表,进入存储桶管理页面。
3. 找到需要操作的存储桶,单击该存储桶名称,进入存储桶配置页面。
4. 在左侧导航栏中,选择安全管理 > 跨域访问CORS设置,进入跨域访问 CORS 设置页面。
5. 在“跨域访问CORS设置”栏中,检查是否为跨域请求。


是,请执行下一步。
否,请修改规则。
6. 执行以下命令,检查跨域请求配置是否正确。
curl 'http://bucket-appid.cos.ap-guangzhou.myqcloud.com/object' -voa /dev/null -H 'Origin: 跨域访问CORS设置的来源 Origin'
返回如下信息,即表示配置正确。



Message 为 “You are denied by bucket referer rule”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>You are denied by bucket referer rule</Message>
需要您执行以下操作:
2. 在左侧导航栏中,选择存储桶列表,进入存储桶管理页面。
3. 找到需要操作的存储桶,单击该存储桶名称,进入存储桶配置页面。
4. 在左侧导航栏中,选择安全管理 > 防盗链设置,进入防盗链设置页面。
5. 在“防盗链设置”中,检查是否设置了防盗链。


是,请执行下一步。
否,请 联系我们
6. 执行以下命令,检查防盗链设置是否正确。
curl 'http://bucket-appid.cos.ap-guangzhou.myqcloud.com/object' -voa /dev/null -H 'referer: Referer 的值'
返回如下信息,即表示配置正确。



Message 为 “InvalidAccessKeyId”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>InvalidAccessKeyId</Message>
需要您执行以下操作:
1. 检查请求签名中 Authorization 的 q-ak 参数是否填写正确。
是,请执行下一步。
否,请修改 q-ak 参数。密钥的 SecretId 需与 q-ak 参数保持一致,且区分大小写。
2. 前往 API密钥管理,检查 API 密钥是否已启用。


是,请 联系我们
否,请启用该 API 密钥。

Message 为 “InvalidObjectState”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>InvalidObjectState</Message>
需要您执行以下操作:
检查请求的对象是否为归档类型或深度归档类型。
是,请恢复对象,再进行访问。详细操作请参见 POST Object restore
否,请 联系我们

Message 为 “RequestTimeTooSkewed”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>RequestTimeTooSkewed</Message>
需要您执行以下操作:
1. 根据操作系统类型,查看客户端当前时间。
Windows 系统(以 Windwos Server 2012 为例):

> 控制面板 > 时钟、语言和区域 > 设置日期和时间


Linux 系统:执行 date -R 命令。


2. 判断客户端当前时间与服务器的时间是否存有偏差(时间偏差超过15分钟)。
是,请同步时间。
否,请 联系我们

Message 为 “Request has expired”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
产生的可能原因如下:
发起请求的时间超过了签名的有效时间。
本地系统时间和所在时区的时间不一致。
需要您重新设置签名的有效时间,或者同步本地系统时间。若仍无法解决,请 联系我们

Message 为 “SignatureDoesNotMatch”

当您访问 COS 出现如下信息时:
<Code>AccessDenied</Code>
<Message>SignatureDoesNotMatch</Message>
需要您执行以下操作:
检查客户端计算的签名与服务端计算的签名是否一致。
是,请 联系我们
否,请参阅 请求签名 文档,并使用 COS 签名工具 检查自行实现的签名过程。