使用RAM授权的方式操作(上传/下载等)阿里云对象存储OSS(含完整步骤和代码)

参考官方文档: Python授权访问 、 降低因账号密码泄露带来的未授权访问风险RAM Policy权限策略常见示例

背景:阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维。创建RAM用户后,您可以控制这些RAM用户对资源的操作权限。当您的企业存在多用户协同操作资源的场景时,可以让您避免与其他用户共享阿里云账号密钥,按需为用户分配最小权限,从而降低企业的信息安全风险。

一、创建RAM用户

1,在RAM访问控制中身份管理-->用户中单击创建用户来创建一个新的用户

记得勾选OpenAPI调用访问(之后会用到)

 2,在单击确定后就可以获取到AccessKey ID和AccessKey Secret

 3,使用STS进行临时授权:在创建好的用户列表后点击添加权限,对用户添加AliyunSTSAssumeRoleAccess系统策略

 

二、创建RAM用色

1,单击用色-->创建角色-->阿里云账号  直接下一步即可

在如下图中填写角色名称完成即可

三、创建权限策略并添加到角色中

1,单击左侧 权限管理-->权限策略-->脚本编辑  添加获取和上传的权限策略(将examplebucket替换成你的bucket名即可)

{
    "Version": "1",
    "Statement": [
     {
           "Effect": "Allow",
           "Action": [
             "oss:PutObject",
             "oss:GetObject"
           ],
           "Resource": [
             "acs:oss:*:*:examplebucket",
             "acs:oss:*:*:examplebucket/*"
           ]
     }
    ]
}

该策略赋予角色向目标存储空间examplebucket执行简单上传(oss:PutObject)和下载文件(oss:GetObject)的权限

2,然后点击继续编辑基本信息,填写权限策略的名称后确定即可完成创建

 3,对之前创建的角色添加权限策略

 

 四、生成临时访问凭证

from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
import json
import oss2

# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'endpoint'
# 填写步骤1创建的RAM用户AccessKey。
access_key_id = 'access_key_id'
access_key_secret = 'access_key_secret'
# role_Arn填写步骤3获取的角色ARN,例如acs:ram::175708322470****:role/ramtest。
role_arn = 'role_arn '

# 创建权限策略。
# 仅允许对examplebucket执行上传(PutObject)和下载(GetObject)操作。
policy_text = '{"Version": "1", "Statement": [{"Action": ["oss:PutObject","oss:GetObject"], "Effect": "Allow", "Resource": ["acs:oss:*:*:examplebucket/*"]}]}'

clt = client.AcsClient(access_key_id, access_key_secret, 'cn-shanghai')
request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type('https')
request.add_query_param('RoleArn', role_arn)
# 指定自定义角色会话名称,用来区分不同的令牌,例如填写为sessiontest。
request.add_query_param('RoleSessionName', 'sessiontest')
# 指定临时访问凭证有效时间单位为秒,最小值为900,最大值为3600。
request.add_query_param('DurationSeconds', '3000')
# 如果policy为空,则RAM用户默认获得该角色下所有权限。如果有特殊权限控制要求,请参考上述policy_text设置。
request.add_query_param('Policy', policy_text)
request.set_accept_format('JSON')

body = clt.do_action_with_exception(request)

# 使用RAM用户的AccessKey ID和AccessKey Secret向STS申请临时访问凭证。
token = json.loads(oss2.to_unicode(body))
# 打印STS返回的临时访问密钥(AccessKey ID和AccessKey Secret)、安全令牌(SecurityToken)以及临时访问凭证过期时间(Expiration)。
print('AccessKeyId: '+token['Credentials']['AccessKeyId'])
print('AccessKeySecret: '+token['Credentials']['AccessKeySecret'])
print('SecurityToken: '+token['Credentials']['SecurityToken'])
print('Expiration: '+token['Credentials']['Expiration'])

1,请替换代码中的以下变量

  1. endpoint,获取方式:到阿里云对象存储OSSbucket列表中点击bucket名称选择概览,在访问端口-->访问外网就能看endpoint地址
  2. access_key_id和access_key_secret,获取方式:在之前创建用户完成时就有AccessKey ID和AccessKey Secret直接复制即可。或在左侧用户-->点击之前创建的用户名称,再创建一个AccessKey也可以获取AccessKey ID和AccessKey Secret
  3. role_arn,获取方式:在角色列表中点击刚刚创建的角色,即可直接复制ARN
  4. examplebucket这个变量,获取方式:在阿里云对象存储OSS中获取创建的bucket名称

六、使用临时访问凭证上传文件

import oss2

# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'oss-cn-shanghai.aliyuncs.com'
# 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
sts_access_key_id = 'sts_access_key_id'
sts_access_key_secret = 'sts_access_key_secret'
# 填写Bucket名称。
bucket_name = 'bucket_name'
# 填写Object完整路径和字符串。Object完整路径中不能包含Bucket名称。
object_name = 'E:/demo/head_image.png'
# 从STS服务获取的安全令牌(SecurityToken)。
security_token = 'security_token '

# 使用临时访问凭证中的认证信息初始化StsAuth实例。
auth = oss2.StsAuth(sts_access_key_id,
                    sts_access_key_secret,
                    security_token)

# 使用StsAuth实例初始化存储空间。
bucket = oss2.Bucket(auth, endpoint, bucket_name)

with open(object_name, 'rb') as f:

# 上传Object。
    result = bucket.put_object('head_image.png', f)
print(result.status)

1,使用 《四、生成临时访问凭证》返回的 AccessKeyId,AccessKeySecret,SecurityToken分别替换上面代码中的变量sts_access_key_idsts_access_key_secretsecurity_token即可。bucket_name 替换为自己创建的bucket名称

七、下载文件

import oss2

# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'yourEndpoint'
# 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
# 填写Bucket名称,例如examplebucket。
bucket_name = 'examplebucket'
# 填写Object完整路径和字符串。Object完整路径中不能包含Bucket名称。
object_name = 'exampleobject.txt'
# 从STS服务获取的安全令牌(SecurityToken)。
security_token = 'yourSecurityToken'

# 使用临时访问凭证中的认证信息初始化StsAuth实例。
auth = oss2.StsAuth(sts_access_key_id,
                    sts_access_key_secret,
                    security_token)

# 使用StsAuth实例初始化存储空间。
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 下载Object。
read_obj = bucket.get_object(object_name)
print(read_obj.read())

结束~~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湿透剪自布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值