文章目录
- 前言
- [1. 块存储/文件存储/对象存储](#1. 块存储/文件存储/对象存储)
- [2. 权限管理](#2. 权限管理)
- [3. 上传文件到OSS](#3. 上传文件到OSS)
- [4. AK/SK泄露](#4. AK/SK泄露)
-
- [4.1 后端生成签名](#4.1 后端生成签名)
- [4.2 前端生成签名](#4.2 前端生成签名)
- 参考
前言
经常会听说什么oss存储桶漏洞、什么key泄露,要怎么怎么挖......ak/sk和oss是绑定地吗?为什么ak/sk泄露可以接管应用的对象存储空间?本文将捋清楚这些概念及其运作原理
- 什么是对象存储
- 什么是AK/SK
- 什么时候会发生AK/SK泄露
1. 块存储/文件存储/对象存储
提到存储,脑海中浮现的就是电脑里的硬盘。硬盘的读写,都是以块为单位的,这是由其物理构造决定的。无论什么存储架构,实际的数据落盘,都是把数据写到磁盘的块里。我们把硬盘看作一个线性的块数组,最原始的,我们直接向硬盘中输送LBA(逻辑块地址)+数据,这就是块存储。
很明显,我们需要将硬盘中的所有块管理起来,包括标记块的状态(空闲/占用)、块的分配、回收、合并等,我们把这些数据结构和算法,称之为块管理器。
以文件这一概念为抽象单位的块管理器,向上提供"文件、目录"等语义概念,向下将用户看到的文件路径转换为底层块设备的读写,这就是文件存储。我们通常说的格式化硬盘,就是将块管理器/文件系统要用到的数据结构写入磁盘,操作系统使用对应的块管理器(文件系统)读写磁盘。
以对象这一概念为抽象单位的块管理器,向上提供桶/存储空间 (bucket)、object等抽象概念,向下将对象ID映射到LBA,这就是对象存储。我们一般把基于对象的块管理器称为对象存储引擎。对象存储一般作为云服务的形式提供给用户,具体的比如阿里云的对象存储OSS。
以上就是按数据访问模型对存储架构进行的分类:
- 块存储是最原始的,只提供 LBA 读写,没有块管理器。
- 文件存储在块存储之上增加了文件系统层,将文件访问映射为 LBA。
- 对象存储在块存储(或裸盘)之上增加了对象存储引擎,将对象访问映射为 LBA。

2. 权限管理
想要读写文件,首先要具备相应权限。通常我们作为用户首先要登录到操作系统,完成身份认证,即告诉了操作系统我是谁。当我们想要把C:\Windows\System32这个文件夹删除的时候,会提示失败,这是访问控制在告诉我们没有权限。
云计算中的计算、网络、存储,都作为一种资源服务,供我们按需购买使用。就像我们本地使用计算机读写文件一样,访问云存储服务也需要经过认证和授权。关于阿里云中的资源访问管理(RAM),详情就请查看阿里云的官方文档。这里摘取一些基本概念,以支撑本文要阐述的AK原理。
身份是在云环境中访问资源和执行操作的实体,也是权限的承载主体。云环境中主要有两种身份类型:人员身份和程序身份。
RAM提供RAM用户、RAM用户组和RAM角色三种身份类型。其中,RAM用户组是用于归类和管理RAM用户的集合。RAM用户和RAM角色既可用于人员身份,也可用于程序身份。

#AccessKey的工作原理
AccessKey ID和AccessKey Secret由访问控制(RAM)根据算法生成,阿里云对其存储及传输均进行加密。
当程序使用AK发起请求时,请求会携带AccessKey ID以及使用AccessKey Secret加密请求内容生成的签名。阿里云收到请求后,会对其进行身份验证及请求合法性校验。关于阿里云所采用的具体签名机制,请参见V3版本请求体&签名机制。
3. 上传文件到OSS
传统的WebApp,是将文件上传到Web服务器,再由后端处理,如下图:

有了云存储服务这个第三者,可选择的方案或者说文件数据流向可以是:
- 前端表单数据发送给后端,后端生成签名上传到OSS,即和传统后端处理一样。
- 后端生成签名,前端页面通过Ajax获取签名,表单数据直传到OSS。
- 前端生成签名(通过JavaScript),表单数据直传到OSS。

4. AK/SK泄露
为了减轻后端的运行压力,开发者都会选择在前端(浏览器)直传数据到OSS。
4.1 后端生成签名
这是正确的方案,AK/SK存储在后端,用于生成访问OSS的签名,前端页面通过一个Ajax获取签名。比如访问 "www.example.com" 页面,后续会有类似/api/getOssToken的Ajax请求获取签名,如下图。也有可能在上传时出发Ajax请求,这要触发上传并观察关键请求。

4.2 前端生成签名
要通过前端的Javascript生成OSS的API调用签名,AK/SK就必须硬编码在前端,即产生所谓的AK/SK泄露 ,即代表这个WebApp的RAM用户用于访问OSS的访问密钥泄露。这种漏洞场景多见于App、小程序。
参考
1\] [面向云资源的身份权限管理-访问控制-阿里云](https://help.aliyun.com/zh/ram/product-overview/what-is-ram) \[2\] [AccessKey工作原理](https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair) \[3\] [由OSS AccessKey泄露引发的思考](https://cloud.tencent.com/developer/article/1530778) \[4\] [deepseek](https://chat.deepseek.com/)