子账户及STS临时账户调用OSS的常见问题及排查

简介: 账户分为主账户、子账户及STS临时账户,其中主账户有OSS的全部权限,子账户及STS临时账户可以进行细粒度的权限划分控制,授权OSS的部分权限;本文将介绍STS及子账户调用过程中的常见问题及排查;

STS临时账户调用常见的错误码及原因参考:STS常见问题及排查

1)子账户要如何授权只读bucket的权限

为此子用户附加系统授权策略”AliyunOSSReadOnlyAccess”,该权限拥有全部bucket的只读权限;
3

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 权限
4

为角色授权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扮演临时用户。

相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
目录
相关文章
|
Java Maven 数据安全/隐私保护
邮件发送轻松搞定:结合Hutool实现SpringBoot邮件功能
邮件发送轻松搞定:结合Hutool实现SpringBoot邮件功能
983 0
|
11月前
|
存储 缓存 监控
网站性能飞跃:深度优化OSS+CDN+全站加速DCDN的最佳实践
本文深入解析如何通过阿里云OSS、CDN与DCDN的协同优化,构建高性能内容分发体系。从静态资源存储加速到动态请求智能路由,结合缓存策略、协议优化与实时监控,实现网站全链路性能飞跃,助力业务赢得速度竞争。
|
存储 对象存储
【阿里云OSS】You have no right to access this object because of bucket acl.
【阿里云OSS】You have no right to access this object because of bucket acl.
22599 1
【阿里云OSS】You have no right to access this object because of bucket acl.
|
安全 Java 数据安全/隐私保护
APP加固技术及其应用
在移动应用开发过程中,APP加固技术起到了非常重要的作用。APP加固是将apk文件进行混淆加密,以防止别人反编译获取我们的源码和资源文件。目前市场上主流的APP加固公司有三家,分别是梆梆加固、360加固和ipagurd加固。本文将介绍APP加固的概念、加固方案和比较,并探讨APP加固在实际开发中的应用。
|
小程序
java--微信小程序发送模板消息
java--微信小程序发送模板消息
833 0
|
网络协议 Java
elasticsearch7.1 安装启动报错
elasticsearch7.1 安装启动报错
557 1
|
存储 弹性计算 运维
生成自签名私钥和证书
【4月更文挑战第29天】
418 1
|
存储 数据安全/隐私保护 UED
阿里云盘、腾讯云盘与百度网盘:云存储市场的三巨头
阿里云盘、腾讯云盘与百度网盘:云存储市场的三巨头
Pro
|
弹性计算 Linux KVM
自定义镜像 Kali linux
作为一位网安人员,一直想着两个问题。 No.1 做实验时 同一局域网和外网效果不同 No.2 Kali Linux 可以部署云服务嘛,这样更便捷些
Pro
1439 1
自定义镜像 Kali linux