四大存储对象攻防
攻防矩阵
该矩阵从前期侦查、初始访问、执行、权限提升、权限维持、防御绕过、信息收集、横向移动和影响这九个维度展开,分别研究了每个维度下,云服务可能面临的威胁。
| 前期侦查 | 初始访问 | 执行 | 权限提升 | 权限维持 | 防御绕过 | 信息收集 | 横向移动 | 影响 |
|---|---|---|---|---|---|---|---|---|
| API 密钥泄露 | Bucket 公开访问 | 通过控制台执行 | 利用应用程序提权 | 在存储对象中植入后门 | 关闭安全监控服务 | 用户账号数据泄露 | 窃取云凭证横向移动 | Bucket 接管 |
| 控制台账号密码泄露 | 特定的访问配置策略 | 利用云厂商命令行工具执行 | Bucket 策略可写 | 写入用户数据 | 在监控区域外攻击 | 对象存储敏感数据泄露 | 窃取用户账号攻击其他应用 | 任意文件上传覆盖 |
| 临时访问凭证泄露 | 元数据服务未授权访问 | 使用云API执行 | Object ACL 可写 | 在云函数中添加后门 | 停止日志记录 | 目标源代码信息 | 通过控制台横向移动 | 敏感数据泄露 |
| 访问密码泄露 | 云控制台非法登录 | 写入用户数据执行 | Bucket ACL 可写 | 在自定义镜像库中导入后门镜像 | 日志清理 | 共享快照 | 使用实例账号爆破 | 破坏存储数据 |
| SDK 泄露 | 账号劫持 | 使用对象存储工具执行 | 通过访问管理提权 | 创建访问密钥 | 通过代理访问 | 元数据 | 使用用户账号攻击其他应用 | 植入后门 |
| 前端代码泄露 | 恶意的镜像 | 利用后门文件执行 | 创建高权限角色 | 在 RAM 中创建辅助账号 | 云服务访问密钥 | PostgreSQL 数据库 SSRF | 拒绝服务 | |
| 共享快照 | 网络钓鱼 | 利用应用程序执行 | 利用服务自身漏洞进行提权 | 利用远控软件 | 用户数据 | 子域名接管 | ||
| 应用程序漏洞 | 利用 SSH、RDP 服务登录到实例执行命令 | 低权限下收集到数据库里的高权限访问凭证信息 | 控制台修改或添加数据库账户密码 | 获取配置文件中的应用凭证 | 资源劫持 | |||
| 服务弱口令 | 利用远程命令执行漏洞执行 | 在 RAM 中将低权限用户分配高权限策略 | 命令行修改或添加数据库账户密码 | 获取实例网段信息 | 窃取项目源码 | |||
| 密码访问 | 利用 SDK 执行 | 共享快照 | 数据库连接历史记录 | 窃取用户数据 | ||||
| 密钥访问 | 数据库连接工具 | 数据库其他用户账号密码 | 篡改数据 | |||||
| 数据库中的敏感信息 | 加密勒索 | |||||||
| 警告通知邮箱 | 恶意公开共享 | |||||||
| 性能详情 | 恶意修改安全组 | |||||||
| MSSQL 读取实例文件 | 恶意释放弹性IP | |||||||
| 流日志 | 恶意修改防火墙策略 | |||||||
| 安全组配置信息 | LB 中的 HTTP 请求走私攻击 | |||||||
| RAM 用户角色权限信息 | Bucket 爆破 | |||||||
| Bucket Object 遍历 |
OSS对象存储
对象存储(OSS)中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:Key、Data 和 Metadata。
Bucket
存储空间(Bucket)是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间。
- 存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
- 存储空间内部的对象数目没有限制。
命名规则
同一阿里云账号在同一地域内创建的Bucket总数不能超过100个。Bucket创建后,其名称无法修改。Bucket命名规则如下:
- Bucket名称在OSS范围内必须全局唯一。
- 只能包括小写字母、数字和短划线(-)。
- 必须以小写字母或者数字开头和结尾。
- 长度为3~63个字符。
命名示例
Bucket名称的正确示例如下:
- examplebucket1
- test-bucket-2021
- aliyun-oss-bucket
Object
对象(Object)是 OSS 存储数据的基本单元,也被称为 OSS 的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的 Key 来标识。
例如:
https://hxsecurityteam.oss-cn-beijing.aliyuncs.com/AAccTest.png
Bucket:hxsecurityteam
地区:oss-cn-beijing
Key:AAccTest.png
对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找。Data 就是存储的数据本体。
对象存储利用方法
STS服务给其他用户颁发一个临时访问凭证。该用户可使用临时访问凭证在规定时间内访问您的OSS资源。
临时访问凭证无需透露您的长期密钥,使您的OSS资源访问更加安全。
利用工具
alicloud-tools
GitHub地址:https://github.com/iiiusky/alicloud-tools
方法一
ak+sk+sts使用命令:
1
AliCloud-Tools.exe --sak --ssk --sts --token ecs --list --runner
方法二
OSS Browser
GitHub地址:https://github.com/aliyun/oss-browser
Bucket权限配置错误-公开访问
在创建Bucket桶时,默认是private的权限
在此时如果选择公有读的话
情况1(配置读写权限为公有读或公共读写)
可以直接访问对应的KEY路径
1
https://hxsecurityteam.oss-cn-beijing.aliyuncs.com/AAccTest.png
但是无法列出对象
情况2(配置读写权限为公有读或公共读写+在Bucket授权策略中设置ListObject)
这样再当我们访问存储桶域名的时候就会发现,已经把我们存储桶的东西列出来了
Bucket桶爆破
当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。
当对于阿里云OSS 不存在有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket
InvalidBucketName:表示存储桶的名称不符合规范,属于无效的存储桶名称
NoSuchBucket:表示没有这个存储桶
当存储桶存在时,则会返回以下两种情况
返回存储桶的内容
AccessDenied:访问被拒绝,权限不足。
这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了。
特定的Bucket策略配置
如果管理员设置了某些IP,UA才可以请求该存储桶
此时错误的配置了GetBucketPolicy
可导致攻击者获取策略配置
可以看到我们此时是没有权限访问该存储桶的
我们尝试使用aliyun的cli获取policy
我们可以看到,需要符合UserAgent为UzJu才可以访问
Bucket Object遍历
如果设置了ListObject,这将会导致Bucket桶被遍历
可通过访问Key,来下载该文件
任意文件上传与覆盖
如果在配置存储桶时,管理员错误的将存储桶权限,配置为可写,这将会导致攻击者可上传任意文件到存储桶中,或覆盖已经存在的文件
如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。
AccessKeyId,SecretAccessKey泄露
如果目标的 AccessKeyId、SecretAccessKey 泄露,那么就能获取到目标对象存储的所有权限
1、通过GitHub等开源平台中的源代码可发现存在泄露的Key
2、通过反编译APK,找到敏感信息
3、在目标网站源代码中找到(Js等)
Bucket接管
本质属于悬空 DNS(子域名接管),原业务把存储桶删了,但 DNS 解析记录没删掉。
在阿里云下,当 Bucket 显示 NoSuchBucket 说明是可以接管的,如果显示 AccessDenied 则不行。
假设有以下一种情况,管理员通过域名解析并绑定了一个存储桶,但是管理员将存储桶删除后,没有将域名解析的CNAME删除,这时会访问域名就会出现上面的情况,NoSuchBucket。
利用条件:
DNS 配置:域名 CNAME 指向 OSS 的域名
业务自定义域名做了 CNAME 解析,指向阿里云 OSS 端点:xxx.oss‑region.aliyuncs.com
例如:
shturl.cc/I9yy CNAME test.oss‑cn‑beijing.aliyuncs.com
2.原 Bucket 已经被删除,DNS 记录没有删除
业务方删除了 OSS 存储桶,但是没有清理 DNS 的 CNAME 记录
访问域名返回报错:NoSuchBucketThe specified bucket does not exist.
3.攻击者在同一个地域创建同名 Bucket**
Bucket 名称在阿里云全局唯一;
必须地域完全一致(原桶是 cn‑beijing,攻击者也必须在北京地域创建同名桶);
Bucket 策略配置可写
当我们访问存储桶的时候,会提示我们已经被policy拦截
查看策略
如果此时配置了存储桶的oss:PutBucketPolicy,就可以更改Deny为Allow即可访问
随后使用PUT方法上传
随后我们再使用GET查看策略
此时我们可以正常看到存储桶中的对象了
修改策略导致网站瘫痪
当策略可写的时候,除了上面的将可原本不可访问的数据设置为可访问从而获得敏感数据外,如果目标网站引用了某个 s3 上的资源文件,而且我们可以对该策略进行读写的话,也可以将原本可访问的资源权限设置为不可访问,这样就会导致网站瘫痪了。
我们只需要将获取该对象的权限修改为Deny,该网站既无法在获取图片,JS等信息了
实战案例
阿里云存储桶劫持(Bucket 接管)
此时可以看到访问该域名显示NoSuchBucket,那么只需要去阿里云存储桶重新创建一个与HostID一样的存储桶名称即可
随后只需要上传文件,就可以让该域名显示我们上传的任意文件
COS对象存储
其实云存储桶都差不多,不过都有一些差别
Bucket 公开访问
腾讯云存储桶的访问权限默认为私有读写权限,且存储桶名称会带上一串时间戳:
这个时间戳其实就是用户自己的 APPID 值
账户中的访问策略包括用户组策略、用户策略、存储桶访问控制列表(ACL)和存储桶策略(Policy)等不同的策略类型。当腾讯云 COS 收到请求时,首先会确认请求者身份,并验证请求者是否拥有相关权限。验证的过程包括检查用户策略、存储桶访问策略和基于资源的访问控制列表,对请求进行鉴权。
Bucket Object 遍历
如果策略中允许了Object的List操作,则在目标资源范围下,会将所有的Bucket Object显示出来,这时,Key值可以理解为文件的目录,通过拼接可获取对应的文件:
在腾讯云的访问策略体系中,如果存储桶访问权限为私有读写,且 Policy 权限为匿名访问,那么 Policy 权限的优先级高于存储桶访问权限。
如果控制台配置了Policy权限,默认是对所有用户生效,并且允许所有操作,这时即使存储桶访问权限配置为私有读写,匿名用户也可通过遍历Bucket Object,获取对应的文件。
Bucket 爆破
同OSS对象存储
Bucket 接管(不存在)
由于Bucket 接管是由于管理人员未删除指向该服务的DNS记录,攻击者创建同名Bucket进而让受害域名解析所造成的,关键在于攻击者是否可创建同名Bucket
而腾讯云有特定的存储桶命名格式
1
<bucketname>-<appid>+cos.ap-nanjing.myqcloud.com
appid是在控制台用时间戳随机生成的,因此无法创建同名Bucket,故不存在Bucket 接管问题
任意文件上传与覆盖
由于Bucket不支持重复命名,所以当匿名用户拥有写入权限时,可通过任意文件上传对原有文件进行覆盖,通过PUT请求可上传和覆盖任意文件
用户身份凭证(签名)泄露
通过 RESTful API 对对象存储(Cloud Object Storage,COS)可以发起 HTTP 匿名请求或 HTTP 签名请求。
匿名请求一般用于需要公开访问的场景,例如托管静态网站;
绝大部分场景都需要通过签名请求完成。 签名请求相比匿名请求,多携带了一个签名值,签名是基于密钥(SecretId/SecretKey)和请求信息加密生成的字符串。SDK 会自动计算签名,您只需要在初始化用户信息时设置好密钥,无需关心签名的计算;对于通过 RESTful API 发起的请求,需要按照签名算法计算签名并添加到请求中。
在开发过程中可能有如下几处操作失误会导致SecretId/SecretKey泄露,获取到SecretId/SecretKey相当于拥有了对应用户的权限,从而操控Bucket
1.Github中配置文件中泄露凭证
2.小程序\APP反编译源码中泄露凭证
3.第三方组件配置不当导致泄露凭证,常见场景:/actuator/heapdump堆转储文件泄露SecretId/SecretKey
4.错误使用SDK泄露凭证
常见场景:代码调试时不是从服务器端获取签名字符串,而是从客户端获取硬编码的签名字符串
Bucket ACL 可读/写
列出Bucket Object提示无权访问:
查看Bucket的ACL配置,发现有http://cam.qcloud.com/groups/global/AllUsers下有FULL_CONTROL权限
1
2
3
4
GET /?acl HTTP/1.1
Host: <BucketName-APPID>.cos.<Region>.myqcloud.com
Date: GMT Date
Authorization: Auth String
官方文档中有对ACL权限配置参数的说明:https://cloud.tencent.com/document/product/436/30752#.E6.93.8D.E4.BD.9C-permission
FULL_CONTROL代表匿名用户有完全控制权限,于是在通过PUT ACL写入策略,将存储桶的访问权限配置为公有读写:
OSS与COS对比
| 项目 | 腾讯云 COS | 阿里云 OSS |
|---|---|---|
| 密钥对 | SecretId / SecretKey | AccessKeyId / AccessKeySecret |
| 命名 | 含时间戳 | 不含时间戳 |
| 账号权限系统 | CAM | RAM |
| 鉴权顺序 | CAM 策略 → Bucket → Object | RAM → BucketPolicy → Object |
| 典型生态场景 | 微信小程序、视频号 | 电商、阿里云大数据 |
AWS S3 对象存储
对象存储(Object-Based Storage),也可以叫做面向对象的存储,现在也有不少厂商直接把它叫做云存储。
说到对象存储就不得不提 Amazon,Amazon S3 (Simple Storage Service) 简单存储服务,是 Amazon 的公开云存储服务,与之对应的协议被称为 S3 协议,目前 S3 协议已经被视为公认的行业标准协议,因此目前国内主流的对象存储厂商基本上都会支持 S3 协议。
操作使用 Amazon S3 的方式也有很多,主要有以下几种:
- AWS 控制台操作
- AWS 命令行工具操作
- AWS SDK 操作
- REST API 操作,通过 REST API,可以使用 HTTP 请求创建、提取和删除存储桶和对象。
Bucket 公开访问
在 Bucket 的 ACL 处,可以选择允许那些人访问
如果设置为所有人可列出对象,那么只要知道 URL 链接就能访问
对于设置为私有的情况下,则需要有签名信息才能访问,例如 https://teamssix.s3.ap-northeast-2.amazonaws.com/flag?response-content-disposition=xxx&X-Amz-Security-Token=xxx&X-Amz-Algorithm=xxx&X-Amz-Date=xxx&X-Amz-SignedHeaders=xxx&X-Amz-Expires=xxx&X-Amz-Credential=xxx&X-Amz-Signature=xxx
Bucket 爆破
同OSS对象存储
Bucket Object 遍历
在 s3 中如果在 Bucket 策略处,设置了 s3:ListBucket 的策略,就会导致 Bucket Object 遍历
在使用 MinIO 的时候,如果 Bucket 设置为公开,那么打开目标站点默认就会列出 Bucket 里所有的 Key
将 Key 里的值拼接到目标站点后,就能访问该 Bucket 里相应的对象了
任意文件上传与覆盖
如果对象存储配置不当,比如公共读写,那么可能就会造成任意文件上传与文件覆盖。
如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。
AccessKeyId、SecretAccessKey 泄露
同OSS对象存储
Bucket 接管
假如在进行渗透时,发现目标的一个子域显示如下内容
通过页面特征,可以判断出这是一个 Amazon 的 S3,而且页面显示 NoSuchBucket,说明这个 Bucket 可以接管的,同时 Bucket 的名称在页面中也告诉了我们,为 test.teamssix.com
那么我们就直接在 AWS 控制台里创建一个名称为 test.teamssix.com 的 Bucket 就可以接管了
创建完 Bucket 后,再次访问发现就显示 AccessDenied 了,说明该 Bucket 已经被我们接管了。
成功接管了这个子域名的权限
Bucket ACL 可写
列出目标 Bucket 提示被拒绝
查看目标 Bucket ACL 策略发现是可读的,且策略如下
1
aws s3api get-bucket-acl --bucket teamssix
查询官方文档,内容如下:
通过官方文档,可以分析出这个策略表示任何人都可以访问、写入当前 Bucket 的 ACL
那么也就是说如果我们把权限修改为 FULL_CONTROL 后,就可以控制这个 Bucket 了,最后修改后的策略如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"Owner": {
"ID": "d24***5"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AllUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
将该策略写入
1
aws s3api put-bucket-acl --bucket teamssix --access-control-policy file://acl.json
再次尝试,发现就可以列出对象了
Object ACL 可写
读取 Object 时提示被禁止
查看目标 Object 策略发现是可读的,且内容如下:
1
aws s3api get-object-acl --bucket teamssix --key flag
这个策略和上面的 Bucket ACL 策略一样,表示任何人都可以访问、写入当前 ACL,但是不能读取、写入对象
将权限修改为 FULL_CONTROL 后,Object ACL 策略如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"Owner": {
"ID": "d24***5"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AllUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
将该策略写入后,就可以读取对象了
1
aws s3api put-object-acl --bucket teamssix --key flag --access-control-policy file://acl.json
特定的 Bucket 策略配置
加上对应的 User-Agent 时,就可以正常访问了
Bucket 策略可写
修改策略获得敏感文件
现有以下 Bucket 策略
可以看到根据当前配置,我们可以对 Bucket 策略进行读写,但如果想读取 s3://teamssix/flag 是被禁止的
因为当前策略允许我们写入 Bucket 策略,因此可以将策略里原来的 Deny 改为 Allow,这样就能访问到原来无法访问的内容了。
修改后的策略如下:
这里将第 20 行由原来的 Deny 改成了 Allow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketPolicy",
"s3:PutBucketPolicy"
],
"Resource": [
"arn:aws:s3:::teamssix"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::teamssix/flag"
]
}
]
}
修改网站引用的 s3 资源进行钓鱼
例如这样的一个页面
查看源代码可以看到引用了 s3 上的资源
查看 Bucket 策略,发现该 s3 的 Bucket 策略是可读可写的
这时我们可以修改 Bucket 的静态文件,使用户输入账号密码的时候,将账号密码传到我们的服务器上
当用户输入账号密码时,我们的服务器就会收到请求了
修改 Bucket 策略为 Deny 使业务瘫痪
如果目标网站引用了某个 s3 上的资源文件,而且我们可以对该策略进行读写的话,也可以将原本可访问的资源权限设置为不可访问,这样就会导致网站瘫痪了。
Bucket ACL vs Bucket Policy
一句话核心差异
- ACL:简单粗粒度权限表,老式机制,只控制「谁」对桶拥有基础读写权限,支持的权限类型很少。
- Bucket Policy:JSON 格式的强大策略语言,现代推荐方案,可以做细粒度条件控制(来源 IP、请求时间、http 协议、对象前缀等)。
| 对比项 | Bucket ACL(桶访问控制列表) | Bucket Policy(桶策略) |
|---|---|---|
| 格式 | 简单键值列表,预定义的权限集合 | JSON Policy 文档,遵循 IAM 策略语法 |
| 控制主体 | AWS 账号、Canonical 用户 ID、预定义组(AuthenticatedUsers、AllUsers 匿名) | Principal 可以写:账号、IAM 用户、匿名、服务账号、外部跨账号 AWS 账号 |
| 能控制的权限 | 只有少数基础权限:读桶、写桶、读 ACL、写 ACL;不能控制对象内部操作的细粒度动作 | 完整 S3 全部动作:s3:GetObject、s3:PutObject、s3:DeleteObject等上百种动作;支持条件判断 |
| 条件能力 | ❌没有条件判断,不能限制 IP、Referer、时间、前缀 | ✅支持 Condition 条件:IP 白名单、Referer、HTTPS 强制、对象前缀、时间限制 |
| 作用范围 | 作用于 Bucket 本身;也有 Object ACL 针对单个文件 | 作用于 Bucket,也可以限定桶内特定对象前缀(比如images/*) |
| 匿名访问 | 可以开启 AllUsers(全网匿名) | 可以通过 Principal:”*” 开启匿名访问 |
| 大小限制 | 很小 | Policy 最大 20KB |
| 最佳实践 | AWS 官方不推荐优先使用 ACL,复杂场景用 Bucket Policy | 生产环境首选,企业标准做法 |
华为云 OBS 对象存储
其实华为云和其他云的攻防利用方式大同小异
Bucket劫持
华为云bucket劫持和阿里云的差不多,注意的是华为云在删除掉自己的bucket后30分钟后才可重新注册相同名称的bucket
https://console.huaweicloud.com/console/?region=af-south-1#/obs/manager/buckets 进入华为云的对象存储服务、桶列表、创建桶
Bucket爆破
同OSS对象存储
Access Key Id、Secret Access Key泄漏
同OSS对象存储
特定的bucket策略配置
同OSS对象存储
任意文件上传(无法解析)
上传html等后缀的文件无法解析,直接下载
但是其存在分享功能,分享出来的文件是可以解析的
但是分享有时间限制
从上图中可以看到,分享的链接只保持1分钟到18小时
文件覆盖
下面是华为云官方文档介绍,是可以覆盖掉对象
Bucket Object 遍历
如上图,如果设置为公共读或者公共读写就会导致object遍历(设置公共的时候会有提示,问题有可能会出现在复制桶策略上)
可拼接key来下载文件
Bucket ACL配置错误
如果错误配置了对匿名用户的ACL访问权限,就会造成匿名用户修改Bucket ACL策略,遍历存储桶 实际上只需要给匿名用户配置ACL写入权限即可,但是在请求时需要用户的ID,暂时知道读取权限可以获取用户ID,其他地方应该也可以获取到用户ID;这里为了方便也给予了读取权限
首先我们正常访问一下
Access Denied,没有权限,我们看一下ACL策略 https://hxsecurity.obs.cn-north-4.myhuaweicloud.com/?acl
修改此处的Permission为FULL_CONTROL
拥有了桶访问权限的读取和写入权限,验证下,重新访问
核心鉴权优先级(重点)华为云
总原则:显式 Deny > Allow > 默认拒绝 Default Deny
- 桶策略的显式 Deny 优先级最高:只要桶策略命中
Effect:Deny,不管 ACL 开了什么 Allow,直接拒绝访问。 - 没有任何显式 Deny 时:桶策略 Allow、ACL Allow 两者是叠加关系,任意一个给 Allow 就允许。
- ACL 的 Allow不能对抗桶策略 Deny;ACL 能力很弱,只能做粗粒度账号授权,不支持 IP、Referer、条件判断。
- 完整鉴权链路:
IAM身份策略 → 桶Policy → 桶ACL → 对象ACL,每一层只要出现显式 Deny,直接拒绝。
| 场景 | 结果 |
|---|---|
| 桶策略 Deny 某用户 GetObject;ACL 给该用户读对象 | 拒绝,Deny 优先 |
| 桶策略无配置;ACL 给用户读对象 | 允许 |
| 桶策略 Allow;ACL 无授权 | 允许 |
| 桶策略、ACL 都没有 Allow | 默认拒绝 |
参考文献:
https://cloudsec.huoxian.cn/docs/articles


































































