概述
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. |
RAM用户无权访问此Object。 | |
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。
如何确认密钥的正确性
请参见为RAM用户创建访问密钥,确认使用的AccessKeyID/AccessKeySecret
是正确的。
权限检查流程
参考教程示例:使用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
是正确的,详情请参见为RAM用户创建访问密钥。请参见以下操作,确认是否已经赋予当前用户Bucket或Object的操作权限。
- 如果是匿名用户,请通过Bucket Policy授权匿名用户访问目标Bucket。详情请参见添加Bucket授权策略(Bucket Policy)。
- 如果使用的是子账号,请确认RAM用户是否拥有Object相关操作权限。根据使用场景设置不同访问权限的详情,请参见教程示例:使用RAM Policy控制OSS的访问权限。
- 如果是通过STS的授权访问,请参见STS临时授权访问OSS进行排查。
“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