文章目录前言1. 块存储/文件存储/对象存储2. 权限管理3. 上传文件到OSS4. AK/SK泄露4.1 后端生成签名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] 面向云资源的身份权限管理-访问控制-阿里云[2] AccessKey工作原理[3] 由OSS AccessKey泄露引发的思考[4] deepseek