云安全
云安全概述
阿里云概述
亚马逊AWS概述
云计算导论
云计算概述
云计算的关键技术
虚拟化
分布式文件系统
云存储
数据处理
并行计算
OpenStack
容器
Kubernetes概述
Serverless
Hadoop
云原生
云数据中心
微服务
对象存储OSS
云存储
对象存储
对象文件(Object)
存储桶(存储空间)
通过外网访问OSS
存储桶漏洞
STS访问OSS
权限与访问控制
访问控制
Bucket&RAM Policy
预签名
Docker
01docker概述
02docker安装
03目录结构
04基础操作
05底层原理【理论】
06底层原理【实践】
07DockerFile
08容器反查Dockerfile
09Docker 逃逸
-
+
首页
STS访问OSS
阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。 通过STS服务,可以为用户生成临时访问凭证,使其在有效期内访问受策略限制的OSS资源。超过有效期后,凭证自动失效,无法继续访问OSS资源,确保了访问控制的灵活性和时效性。 在典型的服务端和客户端架构下,常见的文件上传方式是服务端代理上传:客户端将文件上传到业务服务器,然后业务服务器将文件上传到OSS。 在这个过程中,一份数据需要在网络上传输两次,会造成网络资源的浪费,增加服务端的资源开销。为了解决这一问题,您可以在客户端直连OSS来完成文件上传,无需经过业务服务器中转。  ## 概述 服务端通过STS临时访问凭证授权客户端上传文件到OSS的过程如下。  客户端向业务服务器请求临时访问凭证。 业务服务器使用STS SDK调用AssumeRole接口,获取临时访问凭证。 STS生成并返回临时访问凭证给业务服务器。 业务服务器返回临时访问凭证给客户端。 客户端使用OSS SDK通过该临时访问凭证上传文件到OSS。 OSS返回成功响应给客户端。 ## 场景 某电商企业A把海量商品数据存放在阿里云OSS中。供应商企业B需要定期向A的OSS上传数据,并通过自己的系统与企业A的阿里云资源对接。 对于信息安全方面,企业A有如下需求: - **数据安全**:企业A不希望将固定访问密钥(AccessKey)泄露给企业B,以免核心数据被非法获取和滥用。 - **权限控制**:企业A希望暂时仅赋予企业B上传权限,后续再根据需求对权限进行动态调整,以实现对权限的精准控制。 - **权限管理**:面对企业B以及后续的其他合作伙伴,企业A希望能够灵活地为每个合作伙伴或临时需求生成相应的凭证,而无需不断管理和配置固定的访问密钥(AccessKey)权限。 - **限时访问控制**:企业A希望根据企业B的具体需求,限制其对数据访问的有效时间。到期后,企业B将自动失去访问权限,从而实现对数据交互时效性的严格控制。 ## 方案 企业A通过临时访问凭证授权企业B安全地将文件上传到OSS。  企业A需首先创建RAM用户和RAM角色,并完成相关授权操作。之后,企业B向企业A申请临时访问凭证,企业A调用AssumeRole接口获取STS临时访问凭证,然后将其传递给企业B。企业B拿到该凭证后,即可将数据上传至企业A的OSS中。 ## 颁发临时访问凭证 详细步骤,查阅阿里云官网地址: https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss#bbc3800d00ebt > 创建RAM用户:  复制访问密钥  | 名称 | 密钥值 | | ---------------- | ------------------------------ | | AccessKey ID | LTAI5tMXTAUNKCBqQaYDUVir | | AccessKey Secret | 6vx0wiUe05oTWncHkWXImxg89w10oM | > 为RAM用户授予请求AssumeRole的权限。   > 创建RAM角色。  复制ARN值: ```txt acs:ram::1384724003449845:role/ststest ``` > 为RAM角色授予上传文件权限。 通过脚本编辑权限策略。 ```json { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] } ``` 字段说明: ```bash Version # 版本号 Statement # 权限声明集合 Effect # 权限的效果, Allow:允许执行Action中定义的操作;Deny:拒绝执行Action中定义的操作(即 “拦截” 操作),且Deny 优先级高于 Allow Action # 操作权限 Action是数组类型,支持填写多个操作(用逗号分隔,如["oss:PutObject", "oss:GetObject"])。 Resource # 作用资源 acs 阿里云资源的固定前缀(Aliyun Cloud Service),所有资源 ARN 均以此开头。 oss 资源所属的产品标识(此处为对象存储 OSS)。 第一个* 资源所在的地域(如cn-hangzhou、cn-beijing),*表示 “所有地域”。 第二个* 资源所属的阿里云主账号 UID(即主账号的 16 位数字 ID),*表示 “当前主账号”(实际使用中建议替换为具体 UID,更安全)。 examplebucket OSS的Bucket 名称(需替换为你实际的 Bucket 名,如my-oss-bucket-2024) /* Bucket 下的资源路径 ```  > 为RAM角色STSTest授予自定义权限策略。   > 使用RAM用户扮演RAM角色获取临时访问凭证。 为角色授予上传文件的权限后,RAM用户需要通过扮演角色来获取临时访问凭证。 临时访问凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间(Expiration)。 参考脚本:https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss#bb9be3f5f80ar 将脚本copy到本地,然后填写对应的密钥即可获取STS。  ```txt AccessKeyId: STS.NZ5L46yXTxG7DMBYimbUgr6Wm AccessKeySecret: 4ddPedXpXJvFgJpsXCCxqdFB5AbaK8TsnNrbn1VR8Huy SecurityToken: CAISvAJ1q6Ft5B2yfSjIr5mAB46ClId1z4XcRmvzvWk4btpLnfP8jzz2IHhMfnZhAOwXsfQ1m2xV7fwflqN0UIRZXlDYYNBstmDRRNNUONivgde8yJBZor/HcDHhJnyW9cvWZPqDP7G5U/yxalfCuzZuyL/hD1uLVECkNpv74vwOLK5gPG+CYCFBGc1dKyZ7tcYeLgGxD/u2NQPwiWeiZygB+CgE0DgvtfvlnpXEsUaC3Q2ml9V4/dqhfsKWCOB3J4p6XtuP2+h7S7HMyiY46WIRrP8s0/0dpWaY7ovCXwQKuUicXPHI6cFiNxNp+xeLgSTAfpIW/NwPWYy7/+yfo34lthEOiiVMcIvpBkeQrS8VkhKdoaq6WhKDm5nEXZL+uGhHOhlQTyhhGOECSWQdZ1FSDF+TRMCpkOAoVYX+I8DtGoABoWwExuU9X0UqKLEt/I9jqXsSW17YNsg7VpCeUcUPCZI09cULdR57YuIcLZM7jnS+pK/i56lCdwNX+f7AGFs07kNd2oueXPtbJmL32DCHZVPZDTcrOGkfgLoIHROhvTQpNyveiFZbn8hILP40tnkWYtOsRybB/aiuK2FZtn4zabcgAA== Expiration: 2025-10-12T06:24:23Z ``` ## 使用临时访问凭证上传文件到OSS https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss#bbc3800d00ebt 以python为例子 ```python import alibabacloud_oss_v2 as oss def main(): # 请填写步骤1.5生成的临时访问密钥AccessKey ID、AccessKey Secret和SecurityToken,而非RAM用户的身份凭证信息 # 请注意区分STS服务获取的AccessKey ID是以STS开头 sts_access_key_id = 'STS.NZ5L46yXTxG7DMBYimbUgr6Wm' sts_access_key_secret = '4ddPedXpXJvFgJpsXCCxqdFB5AbaK8TsnNrbn1VR8Huy' # 填写获取的STS安全令牌(SecurityToken) sts_security_token = 'CAISvAJ1q6Ft5B2yfSjIr5mAB46ClId1z4XcRmvzvWk4btpLnfP8jzz2IHhMfnZhAOwXsfQ1m2xV7fwflqN0UIRZXlDYYNBstmDRRNNUONivgde8yJBZor/HcDHhJnyW9cvWZPqDP7G5U/yxalfCuzZuyL/hD1uLVECkNpv74vwOLK5gPG+CYCFBGc1dKyZ7tcYeLgGxD/u2NQPwiWeiZygB+CgE0DgvtfvlnpXEsUaC3Q2ml9V4/dqhfsKWCOB3J4p6XtuP2+h7S7HMyiY46WIRrP8s0/0dpWaY7ovCXwQKuUicXPHI6cFiNxNp+xeLgSTAfpIW/NwPWYy7/+yfo34lthEOiiVMcIvpBkeQrS8VkhKdoaq6WhKDm5nEXZL+uGhHOhlQTyhhGOECSWQdZ1FSDF+TRMCpkOAoVYX+I8DtGoABoWwExuU9X0UqKLEt/I9jqXsSW17YNsg7VpCeUcUPCZI09cULdR57YuIcLZM7jnS+pK/i56lCdwNX+f7AGFs07kNd2oueXPtbJmL32DCHZVPZDTcrOGkfgLoIHROhvTQpNyveiFZbn8hILP40tnkWYtOsRybB/aiuK2FZtn4zabcgAA==' # 创建静态凭证提供者,显式设置临时访问密钥AccessKey ID和AccessKey Secret,以及STS安全令牌 credentials_provider = oss.credentials.StaticCredentialsProvider( access_key_id=sts_access_key_id, access_key_secret=sts_access_key_secret, security_token=sts_security_token, ) # 加载SDK的默认配置,并设置凭证提供者 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = 'cn-beijing' # 使用配置好的信息创建OSS客户端 client = oss.Client(cfg) # 待上传本地文件路径 例如 D:\\localpath\\exampletest.txt local_file_path = 'S:\\123.txt' with open(local_file_path, 'rb') as file: data = file.read() # 执行上传对象的请求,将本地文件exampletest.txt上传至examplebucket,指定存储空间名称、对象名称和上传文件 result = client.put_object(oss.PutObjectRequest( # Bucket名称 bucket='maolintest', # 上传到Bucket中的对象名称 key='exampletest.txt', body=data, )) # 输出请求的结果状态码、请求ID、内容MD5、ETag、CRC64校验码和版本ID,用于检查请求是否成功 print(f'status code: {result.status_code},' f' request id: {result.request_id},' f' content md5: {result.content_md5},' f' etag: {result.etag},' f' hash crc64: {result.hash_crc64},' f' version id: {result.version_id},' ) # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数 ``` ```python status code: 200 ```   ## 安全风险 如果攻击者拿到sts_access_key_id、sts_access_key_secret、sts_security_token就可以进行接管。
毛林
2025年10月12日 14:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码