STS Python_SDK授权临时用户读写OSS资源

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 这里将手动定义 授权策略(Policy),将 授权策略 授权给 角色也可授权给RAM子账号,这里不作展示 ,然后子账号(RAM account)通过 扮演角色方法 获取 角色 的 安全令牌即临时身份 对 资源 进行操作.RAM 用户 可以使用 API 扮演 RAM 角色。当 RAM 用户被授予 AliyunSTSAssumeRoleAccess 权限策略 之后,可以使用其访问密钥调用 STS API AssumeRole 接口,以获取某个角色的 安全令牌临时身份,从而使用安全令牌访问资源。

STS Python_SDK授权临时用户读写OSS资源

名词解释

RAM (Resource Access Management)STS(Security Token Service)是阿里云提供的权限管理系统
RAM主要的作用是控制账号系统的权限。您可以使用RAM在主账号的权限范围内创建子用户,给不同的子用户分配不同的权限从而达到授权管理的目的。STS是一个安全凭证(Token)的管理系统。您可以使用STS来完成对于临时用户的访问授权。

  • 子账号(RAM account):从阿里云的主账号中创建出来的子账号,在创建的时候可以分配独立的密码和权限,每个子账号拥有自己AccessKey,可以和阿里云主账号一样正常的完成有权限的操作。一般来说,这里的子账号可以理解为具有某种权限的用户,可以被认为是一个具有某些权限的操作发起者。
  • 角色(Role):表示某种操作权限的虚拟概念,但是没有独立的登录密码和AccessKey。
    说明 子账号可以扮演角色,扮演角色时候的权限是该角色自身的权限。
  • 授权策略(Policy):用来定义权限的规则,比如允许用户读取或写入某些资源。
  • 资源(Resource):代表用户可访问的云资源,比如OSS所有的Bucket、OSS的某个Bucket,或OSS的某个Bucket下面的某个Object等。
  • 扮演角色(Assume role)扮演角色是实体用户获取角色身份的安全令牌的 方法。一个实体用户调用STS API AssumeRole可以获得角色的安全令牌,使用安全令牌可以访问云服务API。

这里将手动定义 授权策略(Policy),将 授权策略 授权给 角色 ,然后子账号(RAM account)通过 扮演角色_方法 _获取 角色安全令牌 对 资源 进行操作.
RAM 用户 可以使用 API 扮演 RAM 角色。当 RAM 用户被授予 AliyunSTSAssumeRoleAccess 权限策略 之后,可以使用其访问密钥调用 STS API AssumeRole 接口,以获取某个角色的 安全令牌,从而使用安全令牌访问资源。

新建用户,角色,授权策略

新建RAM用户

  1. 登录 RAM 控制台
  2. 在左侧导航栏的人员管理菜单下,单击用户
  3. 单击新建用户,输入登录名称和显示名称。
    说明 单击添加用户,可一次性创建多个 RAM 用户。
  4. 访问方式区域下,选择控制台密码登录编程访问

    • 控制台密码登录:可以完成对登录安全的基本设置,包括自动生成或自定义登录密码、是否要求下次登录时重置密码以及是否要求开启多因素认证。
    • 编程访问:将会自动为 RAM 用户创建访问密钥(AccessKey)。RAM 用户可以通过 API 或其他开发工具访问阿里云。
  5. 说明 为了保障账号安全,建议仅为 RAM 用户选择一种登录方式。避免 RAM 用户离开组织后仍可以通过访问密钥访问阿里云资源。
  6. 单击确认

授权RAM用户AssumeRole接口权限

  1. 登录 RAM 控制台
  2. 在左侧导航栏的人员管理菜单下,单击用户
  3. 在用户列表中找到刚才创建的用户,单击列表【操作】栏下的【添加权限】
  4. 在弹出对话框中的【系统权限策略】搜索并添加 _AliyunSTSAssumeRoleAccess_
  5. 单击确认

新建自定义权限策略test_policy

  1. 登录 RAM 控制台
  2. 在左侧导航栏的权限管理菜单下,单击权限策略管理
  3. 单击新建权限策略
  4. 填写策略名称和备注。
  5. 配置模式选择可视化配置脚本配置

    • 若选择可视化配置:单击添加授权语句,根据界面提示,对权限效力、操作名称和资源等进行配置。
    • 若选择脚本配置,请参考语法结构编辑策略内容。
  6. 单击确认

下面为OSS所有权限语法示例

{
    "Statement": [
        {
            "Action": "oss:*",
            "Effect": "Allow",
            "Resource": "*"
        }
    ],
    "Version": "1"
}
AI 代码解读

新建角色testRole

注:这里角色有三种类型,创建可信实体为阿里云账号的RAM角色
  1. 云账号登录RAM控制台
  2. 在左侧导航栏,单击RAM角色管理
  3. 单击新建RAM角色
  4. 选择可信实体类型为阿里云账号,单击下一步
  5. 输入角色名称备注
  6. 选择云账号后,单击完成

将自定义权限策略授权给角色

  1. 登录 RAM 控制台
  2. 在左侧导航栏的权限管理菜单下,单击授权
  3. 单击新增授权
  4. 被授权主体区域下,输入 RAM 角色名称后,单击需要授权的 RAM 角色。
  5. 在左侧权限策略名称列表下,单击需要授予 RAM 角色的权限策略。
    说明 在右侧区域框,选择某条策略并单击 ×,可撤销该策略。
  6. 单击确定

完成授权后可在角色管理中查看授权详情
image.png

注:这里策略主体类型有两种,权限策略也可直接授权给用户    

image.png

通过STS完成临时授权

STS基本概念

阿里云临时安全令牌(Security Token Service,STS)是阿里云提供的一种临时访问权限管理服务。

  • RAM角色(RAM role)一种虚拟的RAM用户。RAM角色的全局资源描述符(Role ARN)Role ARN是角色的全局资源描述符(Aliyun Resource Name,简称ARN),用来指定具体角色。每个角色都有一个唯一的全局资源描述符。格式:acs:ram::$accountID:role/$roleName
  • 可信实体(Trusted entity)角色的可信实体是指可以扮演角色的实体用户身份。创建角色时必须指定可信实体,角色只能被受信的主体扮演。可信实体可以是受信的阿里云账号、受信的阿里云服务或身份提供商。
  • 扮演角色(Assume role)扮演角色是实体用户获取角色身份的安全令牌的方法。一个实体用户调用STS API AssumeRole可以获得角色的安全令牌,使用安全令牌可以访问云服务API。

:这里需要区分下RAM角色与扮演角色的区别,可信实体 通过 扮演角色 _方法__  _获取 RAM角色 的安全令牌

扮演角色的API接口概览

STS提供API调用接口每个请求都需要指定如下信息:

  • 要执行的操作:Action参数。
  • 每个操作接口都需要包含的公共请求参数。
  • 操作接口所特有的请求参数。

调用AssumeRole接口获取一个临时身份。参考API

  • RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。
  • RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。
  • Policy表示的是在扮演角色的时候额外加上的一个权限限制。此参数可以限制生成的STS token的权限,若不指定则返回的token拥有指定角色的所有权限。
  • DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。
  • id和secret表示的是需要扮演角色的子账号的AccessKey。

AssumeRole接口请求示例

https://sts.aliyuncs.com?Action=AssumeRole
&RoleArn=acs:ram::123456789012****:role/adminrole
&RoleSessionName=alice
&DurationSeconds=3600
&Policy=<url_encoded_policy>
&<公共请求参数>
AI 代码解读

AssumeRole接口返回格式(json)

{
    "Credentials": {
        "AccessKeyId": "STS.L4aBSCSJVMuKg5U1****",
        "AccessKeySecret": "wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pK****",
        "Expiration": "2015-04-09T11:52:19Z",
        "SecurityToken": "********"
    },
    "AssumedRoleUser": {
        "arn": "acs:sts::123456789012****:assumed-role/AdminRole/alice",
        "AssumedRoleUserId":"34458433936495****:alice"
        },
    "RequestId": "6894B13B-6D71-4EF5-88FA-F32781734A7F"
}
AI 代码解读

通过STS_SDK完成角色扮演

这里将通过官方提供的SDK模块进行具体的角色扮演

 安装相关SDK包

pip install oss2
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-sts
sts sdk github 地址

 获取临时身份信息

# 在控制台将 AliyunSTSAssumeRoleAccess 权限授权给子用户testRole,testRole操作AssumeRole接口,获取临时身份
def fetch_sts_info(access_key_id, access_key_secret, sts_role_arn):
    """子用户角色扮演获取临时身份的信息
    :param access_key_id: 子用户的 access key id
    :param access_key_secret: 子用户的 access key secret
    :param sts_role_arn: STS角色的Arn
    :return StsInfo 返回临时身份信息对象
    """
    # 配置要访问的STS endpoint
    REGIONID = 'cn-hongkong'
    ENDPOINT = 'sts.cn-hongkong.aliyuncs.com'
    region_provider.add_endpoint('Sts', REGIONID, ENDPOINT)

    clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hongkong')
    request = AssumeRoleRequest.AssumeRoleRequest()

    #request.set_accept_format('json')
    #指定角色ARN
    request.set_RoleArn(sts_role_arn)
    #设置会话名称,审计服务使用此名称区分调用者
    request.set_RoleSessionName('oss-python-sdk-example')
    #发起请求,并得到response
    response = clt.do_action_with_exception(request)
    #格式化输出返回结果,将字符串结果转化为字典类型
    i = json.loads(oss2.to_unicode(response))
    #实例化StsInfo类,并将通过sts获取的临时身份信息存入
    global StsInfo
    StsInfo = StsInfo()
    StsInfo.access_key_id = i['Credentials']['AccessKeyId']
    StsInfo.access_key_secret = i['Credentials']['AccessKeySecret']
    StsInfo.security_token = i['Credentials']['SecurityToken']
    StsInfo.request_id = i['RequestId']
    StsInfo.expiration = oss2.utils.to_unixtime(i['Credentials']['Expiration'], '%Y-%m-%dT%H:%M:%SZ')

    #返回StsInfo对象
    return StsInfo
    
AI 代码解读

将临时身份信息存入json文件

根据需求,可将临时身份信息存储到json文件中,等到临时身份过期后再重新请求,避免重复请求,造成临时身份泛滥,引发资源匮乏与安全隐患

def save_info():
    #存储临时身份信息
    with open('StsInfo.json','w',encoding='utf-8') as f:
        data = {'sts_key_id':StsInfo.access_key_id,'sts_key_secret':StsInfo.access_key_secret,'sts_secrity_token':StsInfo.security_token,'sts_expire_date':StsInfo.expiration,'sts_reques_id':StsInfo.request_id}
        json.dump(data,f,ensure_ascii=False)
        f.close
        
def open_info():
    #读取临时身份信息
    with open('./StsInfo.json','r',encoding='utf-8') as f:
        global STSINFO
        STSINFO = json.load(f)
        return STSINFO
AI 代码解读

通过临时身份操作Bucket资源

def buck_put_object():
    #打印验证临时身份信息
    print(StsInfo)
    print('key id:',StsInfo.access_key_id)
    print("key_secret:",StsInfo.access_key_secret)
    print("secrity_token:",StsInfo.security_token)
    print("request_id:",StsInfo.request_id)
    print("expiration:",StsInfo.expiration)
    
    #实例化Bucket对象,并上传字符串
    auth = oss2.StsAuth(StsInfo.access_key_id, StsInfo.access_key_secret, StsInfo.security_token)
    bucket = oss2.Bucket(auth,endpoint,'fralychen')
    result = bucket.put_object('fralychen','good good study day day up')
AI 代码解读

全部代码

# -*- conding:utf-8 -*-
import json
import os

import oss2

from aliyunsdkcore import client
from aliyunsdkcore.profile import region_provider
from aliyunsdksts.request.v20150401 import AssumeRoleRequest

##定义一些变量
access_key_id = 'LTAI4FoMe6umpCSFQdEC9neg' 
access_key_secret = 'jgEvtFOqIAGqKZve7zMvg8dJhSZv9J'
bucket_name = 'fralychen'
endpoint = 'oss-cn-hongkong.aliyuncs.com'
sts_role_arn = 'acs:ram::1149877324567510:role/testrole'



# 确认上面的参数都填写正确了
for param in (access_key_id, access_key_secret, bucket_name, endpoint, sts_role_arn):
    assert '<' not in param, '请设置参数:' + param

#创建StsToken类方便用来存储临时身份信息
class StsInfo(object):
    """AssumeRole返回的临时身份信息
    :param str access_key_id: 临时身份的access key id
    :param str access_key_secret: 临时身份的access key secret
    :param int expiration: 过期时间,UNIX时间,自1970年1月1日UTC零点的秒数
    :param str security_token: 临时身份Token
    :param str request_id: 请求ID
    """
    def __init__(self):
        self.access_key_id = ''
        self.access_key_secret = ''
        self.expiration = 0
        self.security_token = ''
        self.request_id = ''

# 在控制台将 AliyunSTSAssumeRoleAccess 权限授权给RAM子用户之后才能通过RAM用户获取临时身份信息
def fetch_sts_info(access_key_id, access_key_secret, sts_role_arn):
    """子用户角色扮演获取临时身份的信息
    :param access_key_id: 子用户的 access key id
    :param access_key_secret: 子用户的 access key secret
    :param sts_role_arn: STS角色的Arn
    :return StsInfo 返回临时身份信息对象
    """
    # 配置要访问的STS endpoint
    _REGIONID = 'cn-hongkong'
    _ENDPOINT = 'sts.cn-hongkong.aliyuncs.com'
    region_provider.add_endpoint('Sts', _REGIONID, _ENDPOINT)

    clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hongkong')
    request = AssumeRoleRequest.AssumeRoleRequest()

    #request.set_accept_format('json')
    #指定角色ARN
    request.set_RoleArn(sts_role_arn)
    #设置会话名称,审计服务使用此名称区分调用者
    request.set_RoleSessionName('oss-python-sdk-example')
    #设置临时身份过期时间
    request.set_DurationSeconds(DurationSeconds)
    #发起请求,并得到response
    response = clt.do_action_with_exception(request)
    #格式化输出返回结果,将字符串结果转化为字典类型
    i = json.loads(oss2.to_unicode(response))
    #实例化StsInfo类并将临时身份信息存入对象
    global StsInfo
    StsInfo = StsInfo()
    StsInfo.access_key_id = i['Credentials']['AccessKeyId']
    StsInfo.access_key_secret = i['Credentials']['AccessKeySecret']
    StsInfo.security_token = i['Credentials']['SecurityToken']
    StsInfo.request_id = i['RequestId']
    StsInfo.expiration = oss2.utils.to_unixtime(i['Credentials']['Expiration'], '%Y-%m-%dT%H:%M:%SZ')
    

    #存储临时身份信息
    save_info()


#使用sts授权的临时身份上传文件到bucket
def buck_put_object(sts_key_id, sts_key_secret, sts_secrity_token):
    """上传字符串到资源
    :param sts_key_id: 临时身份的 access key id
    :param sts_key_secret: 临时身份的 access key secret
    :param sts_secrity_token: 临时身份的 secrity token
    :retu
    """ 
    #实例化Bucket对象,并上传字符串
    auth = oss2.StsAuth(sts_key_id, sts_key_secret, sts_secrity_token)
    bucket = oss2.Bucket(auth,endpoint,'fralychen')
    result = bucket.put_object('fralychen','good good study day day up')

#根据需求,可将临时身份信息存储到json文件中,等到临时身份过期后再重新请求,避免重复请求,用户泛滥
def save_info():
    #存储临时身份信息
    with open('StsInfo.json','w',encoding='utf-8') as f:
        data = {'sts_key_id':StsInfo.access_key_id,'sts_key_secret':StsInfo.access_key_secret,'sts_secrity_token':StsInfo.security_token,'sts_expire_date':StsInfo.expiration,'sts_reques_id':StsInfo.request_id}
        json.dump(data,f,ensure_ascii=False)
        f.close


def open_info():
    #读取临时身份信息
    with open('./StsInfo.json','r',encoding='utf-8') as f:
        global STSINFO
        STSINFO = json.load(f)
        return STSINFO


#定义临时身份过期时间
DurationSeconds = 900

try:
    open_info()
except IOError:
    print("Error: 没有用户信息文件或文件读取失败")
    print("初始化身份信息,临时身份信息存储中....")
    fetch_sts_info(access_key_id, access_key_secret, sts_role_arn)
    print("临时身份信息存储完毕,当前目录下StsInfo.json")
else:
    if oss2.utils.http_to_unixtime(oss2.utils.http_date()) + DurationSeconds > STSINFO["sts_expire_date"]:
        buck_put_object(sts_key_id = STSINFO["sts_key_id"],sts_key_secret = STSINFO["sts_key_secret"], sts_secrity_token = STSINFO["sts_secrity_token"])
        print("上传成功,good_lucky")
    else:
        print("更新临时用户信息,请稍后")
        fetch_sts_info(access_key_id, access_key_secret, sts_role_arn)
        buck_put_object(sts_key_id = STSINFO["sts_key_id"],sts_key_secret = STSINFO["sts_key_secret"], sts_secrity_token = STSINFO["sts_secrity_token"])
        print("上传成功,good_lucky")
AI 代码解读

join US

未标题-1.png

image.png
暴走小二官方群,欢迎来躁

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
打赏
0
0
0
0
3
分享
相关文章
oss跨域资源共享(CORS Configuration)
oss跨域资源共享(CORS Configuration)
858 4
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
114 0
云效产品使用常见问题之账号授权就能对当前主账号下所有 OSS 进行读写权限如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1487 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
对象存储OSS-Python设置代理访问请求
通过 Python SDK 配置 nginx 代理地址请求阿里云 OSS 存储桶服务。示例代码展示了如何使用 RAM 账号进行身份验证,并通过代理下载指定对象到本地文件。
116 15
DataWorks产品使用合集之多个业务流程上传同名资源到同一个OSS(对象存储服务)URL,会产生什么问题
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
250 9

热门文章

最新文章

  • 1
    阿里云对象存储OSS收费标准,存储、流量和请求等多个计费项
    29
  • 2
    利用阿里云OSS(对象存储服务)快速搭建私人网盘
    25
  • 3
    轻量消息队列(原 MNS)订阅 OSS 事件实践
    7
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    10
  • 5
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    34
  • 6
    【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
    5
  • 7
    Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
    171
  • 8
    金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
    54
  • 9
    【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
    40
  • 10
    Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
    33
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等