一、场景:
App开发时,欲使用对象存储服务保存APP的终端用户数据,并希望通过直连的方式直接访问对象存储服务;并且希望给某些用户授予特定的访问权限,以限制对资源的访问能力。在此场景下,您可以使用对象存储AssumeRole接口,基于返回的临时证书,在您设置的有效期内即可访问对象存储服务。
二、优点:
1.便利性。不需要App端服务器来进行数据中转,而是通过直连的方式直连对象存储服务;
2.安全性。此临时证书是基于限制策略的访问,具有良好的安全性;
3.易控性。设置特定到期时间,便于风险控制。
三、流程
1.App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
2.App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(Token)。
3.STS返回给App服务器一个临时访问凭证,包括一个安全令牌(Token)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
4.App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证,便于后续的资源访问。
5.App客户端使用本地缓存的临时访问凭证去请求对象存储 API。对象存储服务端收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
四、使用临时授权信息访问对象存储服务
此文仅提供python访问方式:
import boto3
import datetime
from botocore.client import Config
s3_sign_vers = "s3"
s3 = boto3.client(
service_name='s3',
aws_access_key_id="xxx",
aws_secret_access_key="yyy",
aws_session_token="zzz",
endpoint_url='<zos_endpoint>', config=Config(signature_version=s3_sign_vers),
verify=False,
use_ssl=False
)
with open('tmp.txt', 'rb') as test_file:
content = test_file.read()
response = s3.put_object(ACL='private', Bucket='bucket1', Body=content, Key='key1')
response1 = s3.head_object(Bucket="bucket1", Key="key1")
response2 = s3.put_object(ACL='private', Bucket='bucket2', Body='', Key='key2')
print(response1)
print(response2)