WEB安全
00-HTTP协议
01-前端基础【HTML】
02-前端基础【CSS】
03-后端基础【PHP速通】
04-后端基础【PHP面向对象】
05-MySQL基础操作
06-前后端联动【代码练习】
07-SQL注入
08-SQL注入 Labs
09-跨站脚本攻击【XSS】
09-XSS Labs
10-CSRF
11-SSRF
12-XML 外部实体注入【XXE】
13-代码执行漏洞
14-命令执行漏洞
15-文件包含漏洞
16-文件上传漏洞
17-反序列化漏洞
18-业务逻辑漏洞
19-未授权访问漏洞集合
20-跨源资源共享【CORS】
21-SSTI模板注入
22-并发漏洞
23-点击劫持【Clickjacking 】
24-请求走私
25-路径遍历
26-访问控制
27-身份验证漏洞
28-WebSocket
29-Web缓存中毒
30-HTTP 主机头攻击
31-信息泄露漏洞
32-原型污染
33-API概述
34-API分类类型
35-API交换格式
36-API身份验证
37-API常见漏洞
38-crAPI靶场
39-JWT
40-DVGA靶场
41-服务器端参数污染
42-API Labs
43-OAuth Labs
44-GraphQL API Labs
45-JWT Labs
46-小程序抓包
47-云存储
48-对象存储OSS
49-存储桶
50-存储桶漏洞
51-STS访问OSS
-
+
51-STS访问OSS
浏览
1
阿里云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就可以进行接管。
毛林
2026年11月15日 18:27
转发文档
收藏文档
上一篇
下一篇
评论(0)
登录
后可发表评论
还没有评论,来抢沙发~
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
还没有评论,来抢沙发~