故障现象
当 COS API、SDK 上传和下载资源时,返回403错误码。
当使用临时密钥或子账号访问 COS 资源时,返回403错误码。
当修改 COS bucket 配置时,返回403错误码。
故障分析思路
当 COS 请求出现403错误码时,可参考以下流程排查问题原因:
1. 检查请求是否为 CORS 跨域访问请求,失败的跨域请求会返回 "AccessForbidden"。
2. 检查请求是否命中存储桶防盗链配置,因防盗链规则引起的 403 错误码,COS 会返回 "You are denied by bucket referer rule"。
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>
需要您执行以下操作:
1. 登录 对象存储控制台。
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>
需要您执行以下操作:
1. 登录 对象存储控制台。
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>
需要您执行以下操作:
1. 登录 对象存储控制台。
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 系统(以 Windows 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>
需要您执行以下操作:
检查客户端计算的签名与服务端计算的签名是否一致。
是,请 联系我们。