使用临时令牌访问 OSS 遇到授权问题的分析说明

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 本文针对移动APP开发客户在使用OSS过程中遇到的一个常见的权限错误问题,进行了分析说明,并在说明过程中引用了阿里云官方文档里RAM的部分解释。

在对象存储OSS的访问场景中,有很常见的一种场景是移动应用使用临时安全令牌访问OSS。在这个场景中,有不止一个用户遇到过在配置初始时,测试发现上传下载报错,而这时候检查令牌对应的授权,发现给到的OSS访问授权是没有的问题的。而且错误提示基本都是:"You are not authorized to do this action. You should be authorized by RAM."

针对这个报错,一句话总结解决办法,就是给使用该安全令牌的RAM用户(注意是RAM用户,不是RAM角色)授予权限“AliyunSTSAssumeRoleAccess”。然后就可以正常工作了。

然而这里要指出,这个办法有些简单粗暴,有可能会导致授权放大,使得RAM用户可以得到权限范围更大的令牌。更好的做法,是让RAM用户只能得到特定的令牌。这个文章最后会给出办法。

为了更好的理解导致这个问题的原因和为什么通过这样的授权来解决问题,本文对这里的权限策略逻辑进行了简单梳理,给各位参考。首先把一些基本概念在这里在列一下。

  • RAM(访问控制):使用阿里云服务的客户,一定会使用到阿里云的访问控制(RAM)功能。RAM允许在一个云账号下创建并管理多个身份,并允许给单个身份或一组身份分配不同的权限,从而实现不同用户拥有不同资源访问权限的目的。

针对本文提到的场景,重点说明下RAM用户和RAM角色两个身份。

  • RAM用户:是RAM的一种实体身份类型,有确定的身份ID和身份凭证。RAM用户必须在获得云账号(主账号)的授权后才能登录控制台或使用API操作云账号下的资源。
  • RAM角色:RAM角色是一种虚拟用户,不是实体用户。RAM角色可以被赋予一组权限策略,但没有确定的登录密码或访问密钥。RAM角色需要被一个受信的实体用户(RAM用户)扮演,扮演成功后实体用户将获得RAM角色的安全令牌,使用这个安全令牌就能以角色身份访问被授权的资源。

在RAM角色里,有个概念是角色的令牌。这个令牌是通过阿里云的STS服务来提供的。

  • STS(Security Token Service),是阿里云提供的一种临时访问权限管理服务。通过STS服务,您所授权的身份主体(RAM用户、用户组或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。STS令牌持有者可以通过API或者控制台操作被授权的云资源
  • 角色令牌:是角色身份的一种临时访问密钥。角色身份没有确定的访问密钥,当一个实体用户要使用角色时,必须通过扮演角色来获取对应的角色令牌,然后使用角色令牌来调用阿里云服务API。

所以,扮演角色,就是RAM用户访问STS服务获取临时访问令牌。RAM用户调用STS API AssumeRole可以获得角色的安全令牌,使用安全令牌可以访问云服务API。
pic1

有了以上的逻辑,我们再看文章开始提到的问题就很明白了。

在文章开始的场景中,同一个主账号下,创建了一个RAM用户和一个RAM角色,并给了RAM角色对应的授权(例如OSS的完全控制权限)。当RAM用户去拿这个角色临时令牌的时候,他必须要有权限扮演这个角色,这样他去调用STS AssumeRole,携带角色名称参数时,才不会被STS服务鉴权失败。而“AliyunSTSAssumeRoleAccess”这个授权,给到RAM用户的权限,其实就是允许该RAM用户扮演主账号下的角色。所以,通过文章一开始提到的解决办法,可以解决对应的报错问题。

然而,这里又引发出了一个新问题,假设主账号下有A角色和B角色,其中A角色的权限范围大于B角色(例如A角色具备OSS的完全控制权限,B角色只有OSS的只读权限)。而用户只想授权某个RAM用户扮演B角色,不想过度授权其可以扮演A角色。这个时候,如果赋予RAM用户“AliyunSTSAssumeRoleAccess”可能就无法达到目的。

可以从RAM用户或者RAM角色两个维度来设定细化的策略。

  • RAM用户的角度:比如通过自定义策略,使得该RAM用户只可以扮演指定的RAM角色,而不再使用文章开始的办法,简单的赋予该RAM用户“AliyunSTSAssumeRoleAccess”这样的通用权限。自定义策略示例如下所示:
    {

    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Resource": "acs:ram:*:$accountId:role/$roleName"
        }
    ],
    "Version": "1"

    }

  • RAM角色授权的角度:比如A角色创建时,指定该角色的可信实体为该主账号下的某个或某些特定RAM用户。策略示例如下:
    {

    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "RAM": [
                   "acs:ram::123456789012****:user/ramuser1"
                ]
            }
        }
    ],
    "Version": "1"

    }。

基于自定义策略,限制RAM用户具体可以扮演的RAM角色,可以更细粒度的控制RAM用户的权限范围,将权限限制到最小可用程度,是更推荐的一种安全做法。

最后总结一下:本文针对移动APP开发客户在使用OSS过程中遇到的一个常见的权限错误问题,进行了分析说明,并在说明过程中引用了阿里云官方文档里RAM的部分解释。实际上,阿里云RAM功能非常的丰富,搭配云存储等阿里云产品可以有很多种不同的用法,有兴趣的同学可以好好研究一下。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
7月前
|
JavaScript 对象存储
在阿里云OpenAPI 为什么oss 图片链接, 在浏览器访问直接下载了,不是预览呢?
在阿里云OpenAPI 为什么oss 图片链接, 在浏览器访问直接下载了,不是预览呢?
492 1
|
6天前
|
域名解析 弹性计算 应用服务中间件
基于nginx反向代理实现OSS固定域名IP访问
本文基于阿里云OSS手册:https://help.aliyun.com/zh/oss/use-cases/use-an-ecs-instance-that-runs-centos-to-configure-a-reverse-proxy-for-access-to-oss,继续深入讨论如何利用nginx反向代理,实现固定的IP/域名访问OSS bucket。官方文档能够解决大部分的反向代理固定IP访问oss bucket的场景,但是对于必须使用域名作为endpoint的系统,会出现signatrue鉴权问题。本文继续在官方文档的基础上,将反向代理需要域名作为endpoint的场景补齐方案。
|
2月前
|
弹性计算 开发工具 对象存储
ECS实例通过OSS内网地址访问OSS资源
ECS实例通过OSS内网地址访问OSS资源
48 0
|
2月前
|
存储 域名解析 应用服务中间件
阿里云OSS对象存储,实现内网访问,免流量费用
阿里云OSS对象存储,实现内网访问,免流量费用
462 2
|
3月前
|
域名解析 应用服务中间件 对象存储
解决阿里云oss图片浏览器访问直接下载而不是打开
解决阿里云oss图片浏览器访问直接下载而不是打开
572 0
|
4月前
|
SQL 存储 分布式计算
Hologres实时湖仓能力增强,挑战5分钟加速分析OSS数据
5分钟快速使用Hologres实时湖仓能力,无需移动数据,直接加速读取存储于数据湖OSS上的Hudi、Delta、Paimon等格式类型的数据
|
5月前
|
Serverless 对象存储 数据安全/隐私保护
在阿里云函数计算(FC)中使用云对象存储服务(OSS)时,需要为FC实例授予对OSS资源的访问权限
在阿里云函数计算(FC)中使用云对象存储服务(OSS)时,需要为FC实例授予对OSS资源的访问权限
492 1
|
7月前
|
存储 运维 监控
OSS生命周期管理与访问行为分析实践
认证考试:OSS生命周期管理与访问行为分析实践
|
存储 缓存 边缘计算
最佳实践:使用阿里云CDN加速OSS访问
用户直接访问OSS资源,访问速度会受到OSS的下行带宽以及Bucket地域的限制。如果通过CDN来访问OSS资源,带宽上限更高,并且可以将OSS的资源缓存至就近的CDN节点,通过CDN节点进行分发,访问速度更快,且费用更低。如果采用动静分离的网站架构,就能够解决海量用户访问的性能瓶颈问题。
4522 0
最佳实践:使用阿里云CDN加速OSS访问
|
15天前
|
分布式计算 大数据 MaxCompute
MaxCompute产品使用合集之使用pyodps读取OSS(阿里云对象存储)中的文件的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。

相关产品

  • 对象存储