STS临时账户调用常见的错误码及原因参考:STS常见问题及排查
1)子账户要如何授权只读bucket的权限
为此子用户附加系统授权策略”AliyunOSSReadOnlyAccess”,该权限拥有全部bucket的只读权限;
2)子账户只读单个bucket的policy如何编写
如果您需要授权一个子用户(例如,代表您的某个应用程序)通过 OSS SDK 或 OSS CMD 列出并读取一个 Bucket 中的资源,那么您需要创建一条自定义授权策略来完成。
假设您的 Bucket 名称为 “myphotos”,那么创建的授权策略样例如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListObjects",
"Resource": "acs:oss:*:*:myphotos"
},
{
"Effect": "Allow",
"Action": "oss:Get*",
"Resource": [
"acs:oss:*:*:myphotos",
"acs:oss:*:*:myphotos/*"
]
}
]
}
如果您希望被授权的子用户能够通过 OSS 控制台/客户端进行操作,那么授权策略中还需要添加 GetBucketAcl 以及 GetObjectAcl 权限(控制台为了操作体验的优化需要额外调用 OSS 的部分 API)。目前控制台的policy定义只能实现能看到所有的bucket但是只对授权的bucket有权限,允许子用户通过 OSS 控制台操作的授权策略样例如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListBuckets",
"Resource": "acs:oss:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetBucketAcl"
],
"Resource": "acs:oss:*:*:myphotos"
},
{
"Effect": "Allow",
"Action": [
"oss:Get*"
],
"Resource": [
"acs:oss:*:*:myphotos",
"acs:oss:*:*:myphotos/*"
]
}
]
}
3)子账户拥有单个bucket的全部权限,policy如何编写
如果您需要授权一个子用户(例如,代表您的某个应用程序)通过 OSS SDK 或 OSS CMD 管理Bucket 中的资源,那么您需要创建一条自定义授权策略来完成。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:myphotos",
"acs:oss:*:*:myphotos/*"
]
}
]
}
如果您希望被授权的子用户能够通过 OSS 控制台/客户端进行操作,那么得为policy授权listbucket权限;策略如下
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListBuckets",
"Resource": "acs:oss:*:*:*"
},
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:myphotos",
"acs:oss:*:*:myphotos/*"
]
}
]
}
4)子账户拥有单个bucket下某个目录的权限,策略如何编写
如果是sdk /API 调用,那么授权如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:gsdata-img1/gsdata/*"
]
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:gsdata-img1"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"gsdata/*"
]
}
}
}
]
}
如果想实现控制台/客户端工具调用,只能看到bucket某个目录下的资源,并且只有对应目录的权限,其他目录没权限,也不能看到其他目录,目前实现不了,只能实现能看到其父目录下的所有资源及目录,但其他没权限的目录不能进入,资源也不能获取,策略如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListBuckets",
"oss:GetBucketAcl"
],
"Resource": [
"acs:oss:*:*:*"
]
},
{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:gsdata-img1/gsdata/*"
]
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:gsdata-img1"
],
"Condition": {
"StringLike": {
"oss:Delimiter": "/",
"oss:Prefix": [
"",
“gsdata/*”
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:gsdata-img1"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"gsdata/*"
]
}
}
}
]
}
5)子账户及STS账户的业务场景是什么
看1.子账户及STS临时账户的业务场景 的介绍
6)STS临时账户生成后,如何调用操作OSS的资源
通过SDK传入STS临时账户的ak,sk,token 来进行初始化client,进行相关接口的调用
JAVA sdk 初始化:授权访问
PYTHON SDK初始化:授权访问
Android SDK初始化:初始化
IOS SDK初始化:初始化
.NET SDK初始化:授权访问
PHP SDK初始化:授权访问
JS WEB SDK初始化:使用STS
C SDK初始化:授权访问
7)STS请求获取报错NoPermission
I) 就报错而言是没权限
II)为子账户授权AliyunSTSAssumeRoleAccess 权限
为角色授权oss的全部权限,再生成临时账户看看是否正常
III)还是异常,工单反馈下子账户的accesskeyid 及对应的报错信息,密码不用反馈
8)STS调用OSS报错InvalidAccessKeyId
STS调用报错如下:
<Error>
<Code>InvalidAccessKeyId</Code> <Message>The OSS Access Key Id you provided does not exist in our records.</Message> <RequestId>5A2F6CE3295E55B2D7360E0F</RequestId> <HostId>*******.oss-cn-beijing.aliyuncs.com</HostId> <OSSAccessKeyId>STS.lTAI53kJu28QUJJt</OSSAccessKeyId>
</Error>
I ) 排查初始化client是否有传入STS的accesskey ID 密码及token,参考《6)STS临时账户生成后,如何调用操作OSS的资源》进行初始化client
II ) 排查STS临时账户是否过期,STS临时账户存在过期时间,最长3600秒过期,尝试重新生成STS临时账户进行操作object看看是否正常
9)STS临时账户调用报错AccessDenied
报错信息如下:
<Error> <Code>AccessDenied</Code> <Message>You have no right to access this object because of bucket acl.</Message> <RequestId>5A2F894D99C1BD4157DB52E1</RequestId> <HostId>record-image-server.oss-cn-beijing.aliyuncs.com</HostId>
</Error>
I) 该报错为临时账户没有对应操作的权限
II) 排查创建STS临时账户的子账户是否有授权AliyunSTSAssumeRoleAccess 权限或者扮演对应角色的权限,为子账户授权AliyunSTSAssumeRoleAccess 权限测试
III) 排查创建STS临时账户的角色,是否有授权对应bucket对应接口的权限,为角色授权AliyunOSSFullAccess权限测试
IV 排查创建STS临时账户时传入的policy是否有对应bucket对应接口的权限,设置policy为OSSFULL权限看看是否正常;
{
"Statement": [
{
"Action": "oss:*",
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
10)STS临时账户调用OSS报错Access denied by authorizer's policy
I):AssumeRole的子用户没有权限,请给子用户授予AliyunSTSAssumeRoleAccess系统授权策略。请在 访问控制 > 用户管理 > 授权 > 可选授权策略名称 中给子用户授权 AliyunSTSAssumeRoleAccess。
II):申请角色扮演的子用户的云账号ID与角色的“受信云账号ID”不符,请角色创建者确认并修改。子用户的云账号ID,即创建子用户的主用户的ID;角色的云账号ID,即创建角色的主用户的云账号ID。请在如下位置确认修改: 访问控制 > 角色管理 > 管理 > 角色详细 > 编辑基本信息 中确认修改。
III):角色的类型错误,如果角色的类型分为“用户角色”和“服务角色”,服务角色不能使用AssumeRole扮演临时用户。