S3对象存储安全

S3Amazon Simple Storage Service 的缩写,最早由 AWS 提出,是一种基于对象的云存储服务。现在各大云厂商(如阿里云 OSS、腾讯云 COS、华为云 OBS)都提供了 兼容 S3 协议 的对象存储服务

S3 的核心结构(概念层)

S3 存储结构:
┌────────────────────────────┐
│ Bucket(桶)               │← 顶级容器,存储所有对象的“云文件夹”
├────────────────────────────┤
│ ┌────────────────────────┐ │
│ │ Object(对象)          │ │← 真正的文件,如图片、视频、日志等
│ │ ├───────┬────────────┤ │
│ │ │ Key   │ 唯一标识路径│ │← 类似文件名或路径名
│ │ ├───────┼────────────┤ │
│ │ │ Data  │ 文件内容    │ │← 文件的真实数据内容
│ │ ├───────┼────────────┤ │
│ │ │Metadata│ 元信息     │ │← 比如 Content-Type、创建时间
│ │ └───────┴────────────┘ │
│ └────────────────────────┘ │
├────────────────────────────┤
│ ……                         │ ← Bucket 中可以有无限个 Object
└────────────────────────────┘

简单来说就是Bucket里有多个Object,Object又由Key,Data,Metadata组成,上面图有点丑,凑合看吧

  • Bucket(桶):每个用户可以创建多个 bucket,是存储空间的逻辑单位。
  • Object(对象):就是你上传的文件(比如 cat.jpg),可以是图片、视频、日志等任何格式。
  • Key:对象的路径名,像是 /images/cat.jpg
  • Data:文件本体,比如图像二进制。
  • Metadata:即元数据,可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找
  • URL 访问:对象默认私有,也可以设为公开或通过临时 URL 访问。

Bucket爆破

当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断

当 Bucket 不存在时有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket

当 Bucket 存在时也会有两种情况,一种是列出 Object,另一种是返回 AccessDenied

这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了

Bucket接管

当某个子域名指向了某个外部服务(如 S3 Bucket),但这个服务 已经被删除或未创建,攻击者就可以在这个服务商平台上创建对应名称,从而接管该子域名的实际控制权

举个简单的例子:

test.example.com指向了一个不存在的Bucket,说明这个Bucket可以接管,同时 Bucket 的名称在页面中也会告诉了我们,可以通过通过 cname 记录判断这是哪家的S3,然后去对应的平台上创建对应名称的Bucket,然后就可以成功接管这个子域名的权限

ps:在腾讯云的对象存储中无法完成以上的操作,因为在腾讯云的对象存储域名中,有一个APPID,这个APPID来自我们的账户信息中

S3任意文件上传

如果对象存储配置不当,比如公共读写,那么就可能造成任意文件上传,如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作

测试思路

# 尝试匿名上传文件
aws s3 cp evil.html s3://target-bucket/ --acl public-read --region us-east-1

或者使用 Burp/脚本构造上传接口测试:

PUT /malware.html HTTP/1.1
Host: victim.s3.amazonaws.com
Content-Type: text/html
Content-Length: 1234

<html><script>alert('xss')</script></html>

Bucket ACL可写

ACL(Access Control List) 是 S3 提供的一种早期权限控制机制,它定义了某个用户/组对 Bucket 或 Object 拥有的权限(例如 READWRITEFULL_CONTROL)。

如果一个 Bucket 的 ACL 设置为对外开放写权限(可写),就意味着任何人都可以向这个 Bucket 上传文件或修改原有对象的权限。

aws s3api put-bucket-acl \
  --bucket victim-bucket-name \
  --grant-write 'uri="http://acs.amazonaws.com/groups/global/AllUsers"'

这个配置意味着所有人(AllUsers)都有写权限

通过官方文档,可以分析出这个策略表示任何人都可以访问、写入当前 Bucket 的 ACL

那么也就是说如果我们把权限修改为 FULL_CONTROL 后,就可以控制这个 Bucket 了,最后修改后的策略如下:

{
    "Owner": {
        "ID": "d24***5"
    },
    "Grants": [
	{
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            }, 
            "Permission": "FULL_CONTROL"
        } 
    ]
}

将该策略写入

aws s3api put-bucket-acl --bucket teamssix --access-control-policy file://acl.json

Object ACL

同理,这个策略和上面的 Bucket ACL 策略一样,表示任何人都可以访问、写入当前 ACL,但是不能读取、写入对象

将权限修改为 FULL_CONTROL 后,Object ACL 策略如下:

{
    "Owner": {
        "ID": "d24***5"
    },
    "Grants": [
	{
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            }, 
            "Permission": "FULL_CONTROL"
        } 
    ]
}

将该策略写入后,就可以读取对象了

aws s3api put-object-acl --bucket teamssix --key flag --access-control-policy file://acl.json

Bucket Object遍历

在 s3 中如果在 Bucket 策略处,设置了 s3:ListBucket 的策略,就会导致 Bucket Object 遍历,将 Key 里的值拼接到目标站点后,就能访问该 Bucket 里相应的对象了

特定的 Bucket 策略配置

S3 支持在策略中添加条件(Condition 字段),例如限制:

  • 请求头(如 User-Agent
  • IP 地址段(aws:SourceIp
  • 请求来源服务(aws:Referer
  • 时间(Date
  • 多重匹配组合(StringLikeBoolIpAddress

只要我们知道并构造满足这些条件的请求,就能访问本来被拒绝的对象

例如下面这个

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "TeamsSixFlagPolicy",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example/flag",
      "Condition": {
        "StringLike": {
          "aws:UserAgent": "TeamsSix"
        }
      }
    }
  ]
}

直接访问example/flag会提示 AccessDenied

但是如果加上对应的ua头,就可以正常访问了

<think>嗯,用户想了解亚马逊S3对象存储服务的介绍和使用指南。这个问题很清晰,属于云计算领域的存储服务咨询。 用户可能是个开发者或运维人员,正在评估云存储方案。从ta直接问"介绍和使用指南"来看,ta需要的是系统性概述而非碎片化信息。考虑到S3是AWS的核心服务,需要重点突出其核心价值:无限扩展性、11个9的持久性、与AWS生态的集成能力。 先梳理服务本质:S3对象存储而非文件存储,这个根本差异会影响使用场景。对象存储适合非结构化数据,每个对象包含数据、元数据和唯一ID。根据引用内容,S3的核心优势在于数据持久性(99.999999999%)和跨区域复制能力。 使用场景方面,引用里提到静态网站托管、数据湖、备份归档这三大经典场景特别值得展开。静态网站托管这个功能很实用,很多用户可能不知道S3可以直接托管前端项目。 技术特性要强调几个关键数字:单对象最大5TB、支持分段上传解决大文件问题、存储分级(特别是冰川存储适合冷数据)。生命周期策略这个自动化功能能帮用户省不少运维成本。 使用指南部分需要结构化:从创建存储桶开始,到权限设置(ACL/IAM策略),再到文件操作。特别注意版本控制和跨区域复制这两个企业级功能的价值。引用里提到的中文资料稀缺确实是个痛点,可以补充些官方文档路径。 最后考虑到用户可能是实操需求,补充了Java SDK示例和成本优化建议。特别是存储类型选择对费用影响很大,需要提醒用户根据访问频率规划。 相关问题设计成进阶路线:从基础概念到具体应用(如静态网站部署),再到与其他云服务的集成,最后是成本控制。这样用户可以根据自身需求选择深入方向。</think>以下是对 Amazon S3 对象存储服务的详细介绍及使用指南,结合核心特性和应用场景: --- ### **一、Amazon S3 核心特性** 1. **对象存储模型** - 数据以对象(Object)形式存储,包含数据本体、元数据和唯一标识符(Key)。 - 对象存储在存储桶(Bucket)中,存储桶需全局唯一命名。 - **数据持久性**:$99.999999999\%$(11个9)[^1][^3]。 2. **无限扩展性** - 支持海量数据存储,单对象最大 $5 \text{TB}$,存储桶数量无上限。 3. **安全机制** - 传输加密(SSL/TLS)和静态加密(SSE-S3/SSE-KMS)。 - 精细化访问控制:桶策略(Bucket Policy)、ACL、IAM 策略[^3][^4]。 4. **成本优化** - **存储分级**: - 标准存储(高频访问) - 智能分层(自动优化冷热数据) - Glacier(归档数据,检索延迟分钟至小时) - **生命周期策略**:自动迁移对象至低成本存储层级或过期删除[^1][^4]。 --- ### **二、核心功能与应用场景** #### **1. 存储桶管理** - **创建存储桶**: ```bash aws s3api create-bucket --bucket my-bucket --region us-east-1 ``` - **权限设置**:禁止公共访问(默认关闭),通过策略开放特定权限[^4]。 #### **2. 数据操作** - **上传/下载对象**: ```bash aws s3 cp local-file.txt s3://my-bucket/path/ # 上传 aws s3 cp s3://my-bucket/path/remote-file.txt ./ # 下载 ``` - **分段上传**:支持大文件分块上传(> $100 \text{MB}$)。 #### **3. 高级功能** | **功能** | **作用** | |------------------|--------------------------------------------------------------------------| | 版本控制 | 保留对象历史版本,防止误删[^3][^4] | | 跨区域复制 (CRR) | 自动复制数据至其他区域,满足合规或灾备需求 | | 静态网站托管 | 直接通过存储桶 URL 托管 HTML/CSS/JS 文件[^4] | #### **4. 典型场景** - **数据湖构建**:作为中央存储层,集成 Athena/Redshift 分析数据。 - **备份与归档**:结合生命周期策略,自动转存至 Glacier 降低成本[^1][^4]。 - **云原生应用**:存储用户上传的图片、视频等非结构化数据。 --- ### **三、使用指南(关键步骤)** 1. **创建存储桶** - 在 AWS 控制台选择 S3 → “创建存储桶” → 输入全局唯一名称。 - 关闭 **“阻止所有公共访问”** 以托管静态网站(需谨慎配置策略)。 2. **上传数据** - 控制台拖拽上传,或使用 AWS CLI/SDK(支持 Java/Python 等)。 3. **设置权限** - **推荐方式**:通过 IAM 策略限制用户访问,而非开放公共读写。 4. **启用版本控制** - 存储桶属性 → “版本控制” → 启用,防止覆盖或误删。 5. **配置生命周期策略** - 示例:30天后将日志文件转为 Glacier 存储: ```json { "Rules": [{ "Status": "Enabled", "Prefix": "logs/", "Transitions": [{ "Days": 30, "StorageClass": "GLACIER" }] }] } ``` --- ### **四、成本优化建议** 1. **选择存储层级** - 频繁访问数据 → 标准存储 - 不常访问 → 智能分层/标准-IA - 归档数据 → Glacier 2. **清理未完成的分段上传** - 生命周期策略自动清理卡住的上传任务。 3. **启用 S3 存储分析** - 识别可转换至低成本的存储对象[^2][^4]。 --- ### **五、Java 操作示例(SDK v2)** ```java // 创建存储桶 S3Client client = S3Client.builder().region(Region.US_EAST_1).build(); CreateBucketRequest request = CreateBucketRequest.builder() .bucket("my-bucket") .build(); client.createBucket(request); // 上传对象 PutObjectRequest putReq = PutObjectRequest.builder() .bucket("my-bucket") .key("data.txt") .build(); client.putObject(putReq, Path.of("local-data.txt")); ``` --- ### **相关问题** 1. **如何通过预签名 URL 安全共享 S3 对象?** 2. **S3 与其他 AWS 服务(如 Lambda、CloudFront)如何集成?** 3. **Glacier 存储的三种检索模式(标准/批量/加速)有何区别?** 4. **S3 存储桶策略与 IAM 策略在权限控制上的最佳实践是什么?** > 提示:深度使用可参考 [AWS S3 开发者指南](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/)。 [^1]: Amazon S3 在可扩展性、数据持久性方面业界领先 [^3]: S3 提供 11 个 9 的数据持久性和全球部署 [^4]: 生命周期管理、版本控制是核心功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值