概述
OSS权限问题指当前用户没有指定操作的权限。本文主要介绍OSS权限相关的常见错误及排查方法。
详细描述
权限常见错误描述
OSS返回的权限相关的错误及原因见下表。
错误 | 原因 | 解决方法 |
ErrorCode: AccessDenied ErrorMessage: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. |
Bucket和Endpoint不符 | AccessDenied.The bucket you are attempting to…错误 |
ErrorCode: AccessDenied |
说明访问OSS的用户没有当前操作的权限。 | AccessDenied.AccessDenied错误 |
ErrorCode: InvalidAccessKeyId |
原因可能是AccessKeyID禁用或不存在。 | InvalidAccessKeyId.The OSS Access Key Id…错误 |
ErrorCode: SignatureDoesNotMatch |
签名不匹配。 | SignatureDoesNotMatch.The request signature we calculated…错误 |
ErrorCode: AccessDenied ErrorMessage: You are forbidden to list buckets. |
无ListBuckets权限 | 如果需要修改权限,可参考基于读写权限ACL的权限控制中的权限列表赋予相应的权限。 |
ErrorCode: AccessDenied ErrorMessage: You do not have write acl permission on this object |
无SetObjectAcl权限 | |
ErrorCode: AccessDenied ErrorMessage: You do not have read acl permission on this object. |
无GetObjectAcl权限 | |
ErrorCode: AccessDenied ErrorMessage: The bucket you access does not belong to you. |
子用户没有Bucket管理的权限(如GetBucketAcl CreateBucket、DeleteBucket SetBucketReferer、 GetBucketReferer等) | 如果需要修改权限,可参考教程示例:使用RAM Policy控制OSS的访问权限修改权限。 |
ErrorCode: AccessDenied ErrorMessage: You have no right to access this object because of bucket acl. |
子用户/临时用户没有访问Object的权限(如putObject getObject、appendObject deleteObject、postObject)等 | |
ErrorCode: AccessDenied ErrorMessage: Access denied by authorizer’s policy. |
临时用户访问无权限,该临时用户角色扮演指定授权策略,该授权策略无权限 | |
ErrorCode: AccessDenied ErrorMessage: You have no right to access this object. |
子用户/临时用户无当前操作权限(如initiateMultipartUpload等) | |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy expired. |
PostObject中Policy无效 | PostObject |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed:["eq", "$Content-Type", "application/octet-stream"] … |
Content-Type限定了,比如请求中Content-Type限定为image/png,而实际与限定不符。 | 设置Content-Type |
权限常见错误问题排查
说明:权限策略的生成推荐使用OSS授权策略生成工具RAM Policy Editor。
如何辨别密钥是主用户或子用户还是临时用户
- 是否是主用户的密钥:需要到控制台查看AccessKeyID是否存在,如果存在说明是主用户。
- 查看子用户的权限,即该子用户的授权策略:在控制台选择 查看子用户的AccessKeyID,并找到对应的子用户;在控制台选择 访问 。
- 查看临时用户的权限,即对应角色的权限:临时用户的AccessKeyID以STS开头比较好辨认,如
"STS.MpsSonrqGM8bGjR6CRKNMoHXe"
。 在控制台选择。
权限检查流程
参考教程示例:使用RAM Policy控制OSS的访问权限,进行以下权限检查。
- 列出需要的权限和资源。
- 检查Action是否有需要的操作。
- 确认Resource是否为需要的操作对象。
- 确认Effect是Allow还是Deny。
- 确认Condition是否正确。
调试步骤
如果检查无法发现错误,进行如下调试。
- 如果有Condition,需先将其删除。
- Effect中删除
Deny
。 - Resource替换为
"Resource": "*"
。 - Action替换为
"Action": "oss:*"
。
更多信息
“AccessDenied.The bucket you are attempting to…”错误
访问OSS出现的详细报错如下。
<Code>AccessDenied</Code>
<Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
原因及解决方法
访问Bucket使用的Endpoint不正确,如果您需要了解Endpoint的详细信息,请参看OSS 基本概念。如果SDK异常抛出如下的异常,或返回如下错误。可参考备注中的内容找到正确的Endpoint。
<Error> <Code>AccessDenied</Code> <Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message> <RequestId>56EA****3EE6</RequestId> <HostId>my-oss-bucket-*****.aliyuncs.com</HostId> <Bucket>my-oss-bucket-***</Bucket> <Endpoint>oss-cn-****.aliyuncs.com</Endpoint> </Error>
注:
- 其中
Endpoint
中的oss-cn-****.aliyuncs.com
就是正确的Endpoint,请使用http://oss-cn-****.aliyuncs.com
或https://oss-cn-****.aliyuncs.com
作为Endpoint访问OSS。- 如果错误中没有
Endpoint
,请登录OSS控制台,在Bucket管理中找到您访问的Bucket,进入Bucket概览页面。OSS域名中可以看到内网和外网域名。- 外网域名是在公网上访问OSS使用的域名,内网域名是指在阿里云内部访问的OSS使用的域名。比如在ECS上访问OSS,可以使用内网域名。
- Endpoint是域名去掉Bucket部分,加上访问协议。例如上图中OSS的公网域名是
oss-****.aliyuncs.com
,它的公网Endpoint是http://oss-cn-****.aliyuncs.com
。类似,内网Endpoint是http://oss-cn-****-internal.aliyuncs.com
。
“AccessDenied.AccessDenied”错误
访问OSS出现的详细报错如下。
<Code>AccessDenied</Code>
<Message>AccessDenied</Message>
原因及解决方法
说明访问OSS的用户没有当前操作的权限。请确认使用的AccessKeyID/AccessKeySecret
是正确的。如果使用的是子帐号或临时账户(STS),请确认当前用户的权限。在访问控制管理控制台单击 用户管理,单击 需要确认权限的用户,单击 查看该用户的权限,确认是否已经赋予当前用户Bucket或Object的操作权限。
“InvalidAccessKeyId.The OSS Access Key Id…”错误
访问OSS出现的详细报错如下。
<Code>InvalidAccessKeyId</Code>
<Message>The OSS Access Key Id you provided does not exist in our records.</Message>
原因及排查方法
原因可能是AccessKeyID禁用或不存在。可参如下排查方法进行排查处理。
- 登录阿里云控制台的AccessKey 管理。
- 确认访问OSS使用的AccessKeyID存在且处于启用状态。
- 如果您的AccessKeyID处于禁用状态,请开启。
- 如果您的AccessKeyID不存在请创建,并使用新的AccessKeyID访问OSS。
“SignatureDoesNotMatch.The request signature we calculated…”错误
访问OSS出现的详细报错如下。
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
排查步骤
- 请检查Endpoint前面没有Bucket,后面没有多余的“/”,前后没有多余的空格。
- 比如下面的Endpoint是不合法的。
- http:// oss-cn-hangzhou.aliyuncs.com
- https:// oss-cn-hangzhou.aliyuncs.com
- http://my-bucket.oss-cn-hangzhou.aliyuncs.com
- http://oss-cn-hangzhou.aliyuncs.com/
- 合法的Endpoint如下。
- http://oss-cn-hangzhou.aliyuncs.com
- 比如下面的Endpoint是不合法的。
- 请确认AccessKeyID与AccessKeySecret正确,确保AccessKeyID与AccessKeySecret前后都没有空格,特别是使用了复制粘贴的情况。
- 请确保BucketName与ObjectKey命名合法有效且符合要求。
- Bucket命名规范:只能包括小写字母、数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
- Object的命名规范:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
- 如果是您自己实现的签名,请使用OSS SDK提供的签名方法。OSS的SDK提供了URL/Header签名的实现,详细请参看授权访问。
- 如果您的环境不适合使用SDK,需要自己实现签名,签名方法请参考用户签名验证,仔细检查每个签名字段。
- 如果您使用了代理,请检查代理服务器是否添加额外的Header。
相关文档
适用于
- 对象存储 OSS