参考官方文档: 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,请替换代码中的以下变量
- endpoint,获取方式:到阿里云对象存储OSSbucket列表中点击bucket名称选择概览,在访问端口-->访问外网就能看endpoint地址
- access_key_id和access_key_secret,获取方式:在之前创建用户完成时就有AccessKey ID和AccessKey Secret直接复制即可。或在左侧用户-->点击之前创建的用户名称,再创建一个AccessKey也可以获取AccessKey ID和AccessKey Secret
- role_arn,获取方式:在角色列表中点击刚刚创建的角色,即可直接复制ARN
- 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_id,sts_access_key_secret,security_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())
结束~~~