打算出一个系列文章,分几篇讲解 AWS 的安全问题,本篇先介绍 Amazon S3 基本概念,并且搭建一个实验环境。
近年来云平台上的数据泄漏经常发生,其中经常听到的就是 aws s3 数据泄漏,今天就来详细介绍此漏洞的形成原因、怎样复现漏洞及修复建议。
Amazon S3 全称 Amazon Simple Storage Service 是互联网存储解决方案。该服务旨在降低开发人员进行网络规模级计算的难度。
Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络。此服务旨在为开发人员带来最大化的规模效益。
简单来说,Amazon S3 就是亚马逊提供的云存储服务,开发人员可以上传文件到 Amazon S3 上进行管理。同时,还可以在Amazon S3 上托管静态网站。
Amazon S3 上面存储文件有很多好处,它的计费方式是按文件大小来计费的,也就是用多少容量就收多少钱,十分经济。它容量是无限的,不会出现硬盘容量不够需要扩容等问题。
我们先来了解下一些基本概念,先放上一个图帮助理解下面的概念,图中是一个桶,桶里面装着对象。
存储桶(bucket)
存储桶是 Amazon S3 中用于存储对象的容器。每个对象都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的对象存储在 johnsmith 存储桶中,则可使用 URL http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 对该对象进行寻址。
对象(object)
对象是 Amazon S3 中存储的基本实体。对象由对象数据和元数据组成。数据部分对 Amazon S3 不透明。元数据是一组描述对象的名称-值对。其中包括一些默认元数据 (如上次修改日期) 和标准 HTTP 元数据 (如 Content-Type)。您还可以在存储对象时指定自定义元数据。
简单来说,对象由数据和元数据组成,其中数据是文件内容,元数据是一些信息,如创建时间、权限信息和对象拥有者信息等。
区域
您可以选择一个地理区域供 Amazon S3 存储您创建的存储桶。您可以选择一个区域,以便优化延迟、尽可能降低成本或满足法规要求。在某一区域存储的对象将一直留在该区域,除非您特意将其传输到另一区域。例如,在 欧洲(爱尔兰) 区域存储的对象将一直留在该区域。
区域这个概念还是要关注下,在不同区域创建的存储桶,其URL访问方式是不一样的,比如在 ap-northeast-1 创建了名为 johnsmith 的存储桶,并且在上面上传了一个名名为 index.html 的文件,则访问方式为(前提是该文件是公开的):
https://johnsmith.s3-ap-northeast-1.amazonaws.com/index.html
小结
Amazon S3 用存储桶来存储对象,对象中的数据就是文件。要使用 aws 云存储服务就需要创建一个存储桶,然后才能上传文件到云上去使用。
我们先搭建一个实验环境,然后开始测试 Amazon S3 错误配置的问题。
先创建一个 aws 账号,创建账号时,需要绑定一张***,所以要准备一张***。
https://amazonaws-china.com/cn/console/
注册会后,会扣除***的一美元,用来验证***是否可用,一周后会自动退款。然后我们会获得一年的免费体验套餐,用来体验各种 aws 服务,也就是说,在一年内我们可以免费创建和使用存储桶。
https://console.aws.amazon.com/console/home
这里是使用根用户登录,也就是用我们注册的邮箱和密码登录:
登录控制台后,在搜索框里输入 s3 , 然后点击进入 s3 控制台
接下来创建一个存储桶,直接在 s3 控制台上点击创建存储桶
存储桶的名称必须符合DNS命名规范,这一点主要是因为可能通过URL来访问,所以需要符合DNS命令规范。
设置权限这里默认是阻止公有访问的,所以默认是安全的,而 s3 的配置错误会导致存储桶的公有访问,这里后面会介绍到,直接点下一步。
如下图所示,成功创建了名为 timeshatter 的存储桶了,并且存储桶默认不是公有的。
可以看到,上传的文件可以通过红框中的URL来访问。直接访问该URL会出现 403 拒绝访问。
如果点击打开按钮,会携带个token来打开,这样相当于授权访问,可以打开文件。
接下来安装 aws cli 工具来访问创建的存储桶。
AWS Command Line Interface (AWS CLI) 是一种开源工具,让您能够在命令行 Shell 中使用命令与 AWS 服务进行交互。仅需最少的配置,您就可以从常用终端程序中的命令提示符开始使用基于浏览器的 AWS 管理控制台提供的相同功能。
如果在 kali 上,可以直接通过 apt 工具安装
mac 上如果安装了 brew ,也可以通过以下命令安装
如果您已经有 pip 和支持的 Python 版本,则可以使用以下命令安装 AWS CLI:如果您安装了 Python 3+ 版本,建议您使用 pip3 命令。
pip3 install awscli --upgrade --user
现在可以尝试下用未认证的用户访问下新创建的存储桶,命令如下:
aws s3 ls s3://timeshatter --no-sign-request
其中的 s3 用于指定访问的是 s3 服务, ls 参数用于列出存储桶中的目录,类似 linux 上的 ls , s3://timeshatter 是指访问名为 timeshatter 的存储桶。
--no-sign-request 参数指定该请求不进行认证,也就是在未登录的情况下发出此请求,或者说未授权的情况下发送请求。
从下图可以看到,对于不是公开访问的存储桶,我们是无法列出存储桶里面的内容的,因为 aws s3 有严格的权限控制。
接下来,我们来设置下 aws cli 的认证信息。点击账号 - 我的安全凭证
接着会进入 aws 的 iam 管理界面,这里主要是管理账号有关资源的,会出现以下提醒,直接点 Continue 就行了,这是个安全问题,后面的文章再讨论。
创建完后,你可以点击显示访问密钥,或者下载密钥文件,注意,访问密钥需要妥善保管,不要发送给其它人,否则其它人在获取你的密钥后,可以完全访问你的 aws 资源。
获取访问密钥后,通过以下命令配置 aws cli 的认证信息。
aws configure --profile timeshatter
其中的 --profile 参数指定该认证信息的名字,随便填个有意义的名字就行,一般输入用户名。
接下来按要求把访问 ID 和私有访问密钥复制进去就行,后面的区域和格式可以不填
配置完后,我们再次使用 ls 命令来列出存储桶的内容,使用 --profile 指定使用的认证信息。
由于是使用自己的 aws 根账号的访问密钥来请求存储桶,所以可以拥有列出存储桶内容的权限。
aws s3 cp test.txt s3://timeshatter/ --profile timeshatter
aws s3 cp s3://timeshatter/test.txt test.txt --profile timeshatter
同步存储桶上的所有文件,这条命令会把存储桶上的所有文件同步到本地,执行这条命令时,要先创建一个文件夹专门用于存放这个存储桶,然后cd到该文件夹来运行命令,其中的 . 代表当前路径,也可以指定绝对路径。
aws s3 sync s3://timeshatter/ . --profile timeshatter
aws s3 rm s3://timeshatter/test.txt --profile timeshatter
目前,我们已经了解完了基本概念以及实验环境的搭建,下一篇文章会介绍 aws s3 的错误配置问题以及漏洞利用。
本文作者:timeshatter
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/127503.html
文章来源: https://www.secpulse.com/archives/127503.html
如有侵权请联系:admin#unsafe.sh