ECS:非所有者对象用户的只读存储区 ACL 无法下载已上传的对象
摘要: 此知识库从 S3 浏览器中的只读角度解释了非所有者对象用户的存储区访问控制列表 (ACL) 的概念。
症狀
非所有者对象用户已使用存储区 ACL 以只读方式添加到存储区。
在创建存储区 ACL 之前 ,非存储区所有者、对象用户 无法下载 由对象存储区所有者用户上传的对象。
问题流程如下:
- 存储区是在分配对象所有者用户的情况下创建的。
- 一些文件由对象所有者用户上传到存储区。
- 非所有者对象用户已使用存储区 ACL 以只读方式添加到存储区。
- 尝试访问存储区时,非所有者对象用户可以列出和下载新上传的对象,但不能下载在只读存储区 ACL 之前上传的对象。我们可以看到,对象的用户权限不是根据 ECS UI 中的配置通过 S3 浏览器设置的。
非所有者对象用户使用 S3 浏览器单击对象时的错误如下所示:(AccessDenied:拒绝访问):
以下是对象所有者用户 (a_s3user) 和非所有者对象用户 (a_s3test) 的存储区 ACL 设置:
原因
可以在存储区或对象级别设置 S3 权限。ECS 遵循与 AWS S3 相同的原则,具体取决于应用的策略类型。它确定在存储区级别或对象级别允许的作类型。
- 在 ECS 存储区级别授予 READ 和 READ ACL 时,非存储区所有者只能列出存储区中的对象,非存储区所有者无法从存储区下载数据
- 将对象写入存储区时,只有写入对象的用户具有读取权限。为了让其他用户能够读取对象,所有者必须显式地向用户授予权限。
- 要向非存储区所有者授予权限,我们必须使用 S3 存储区策略
下表提供了可以分配的 ACL 权限。适用的权限取决于存储区的类型。
| 前交叉韧带 | 权限 | ||
|---|---|---|---|
| 读取 | 允许用户列出存储区中的对象 | ||
| 读取 ACL | 允许用户读取存储区 ACL | ||
| 写入 | 允许用户创建或更新存储区中的任何对象 | ||
| 写入 ACL。 | 允许用户写入存储区的 ACL | ||
| 执行 | 在作为文件系统访问时设置执行权限 — 当使用 ECS 对象协议访问对象时,此权限无效。 | ||
| 完全控制 | 允许用户读取、写入、读取 ACL 和写入 ACL。
|
||
| 特权写入 | 允许用户在用户没有正常写入权限时对存储区或对象执行写入 — CAS 存储区必需 | ||
| 删除 | 允许用户删除存储区和对象 — CAS 存储区必需 | ||
| 无 | 用户对存储桶没有权限。 |
AWS 支持 多种策略类型。
下表列出了 Amazon S3 在 ACL 中支持的权限集。对象 ACL 和存储区 ACL 的 ACL 权限集是相同的。但是,根据上下文(存储区 ACL 或对象 ACL),这些 ACL 权限授予特定存储区或对象作的权限。该表列出了权限,并描述了它们在对象和存储区上下文中的含义。
| 权限 | 在存储区上授予时 | 在对象上授予时 |
|---|---|---|
READ |
允许被授予者列出存储区中的对象 | 允许被授予者读取对象数据及其元数据 |
WRITE |
允许被授予者创建、覆盖和删除存储区中的任何对象 | 不适用 |
READ_ACP |
允许被授予者读取存储区 ACL | 允许被授予者读取对象 ACL |
WRITE_ACP |
允许被授予者写入适用存储区的 ACL | 允许被授予者写入适用对象的 ACL |
FULL_CONTROL |
允许被授予者对存储区具有 READ、WRITE、READ_ACP 和 WRITE_ACP 权限 | 允许被授予者对对象具有 READ、READ_ACP 和 WRITE_ACP 权限 |
Amazon S3 文档
下表显示了每个 ACL 权限如何映射到相应的访问策略权限。如您所见,访问策略允许的权限比 ACL 多。ACL 主要用于授予基本读/写权限,类似于文件系统权限。有关何时使用 ACL 的更多信息,请参阅使用可用访问策略选项的准则。
| ACL 权限 | 在存储区上授予 ACL 权限时的相应访问策略权限 | 在对象上授予 ACL 权限时的相应访问策略权限 |
|---|---|---|
READ |
s3:ListBucket开始, s3:ListBucketVersions以及 s3:ListBucketMultipartUploads |
s3:GetObject开始, s3:GetObjectVersion以及 s3:GetObjectTorrent |
WRITE |
此外,当被授权者是存储区所有者时,授予 |
不适用 |
READ_ACP |
s3:GetBucketAcl |
s3:GetObjectAcl 和 s3:GetObjectVersionAcl |
WRITE_ACP |
s3:PutBucketAcl |
s3:PutObjectAcl 和 s3:PutObjectVersionAcl |
FULL_CONTROL |
等同于授予 READ开始, WRITE开始, READ_ACP以及 WRITE_ACP ACL 权限 — 因此,此 ACL 权限映射到相应访问策略权限的组合。 |
等同于授予 READ开始, READ_ACP以及 WRITE_ACP ACL 权限。因此,此 ACL 权限映射到相应访问策略权限的组合。 |
解析度
选项 1:
请参阅 ECS 数据访问指南如何使用存储区策略。与允许所有作或不允许任何作的 ACL 不同,访问策略为特定用户或所有用户提供特定作的条件性和精细权限。策略条件可用于为与条件匹配的一系列对象分配权限。这可用于自动将权限分配给新上载的对象。
参考 AWS S3:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html
https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html
https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations.html从 UI —> Manage-Bucket> —> Edit bucket 策略中,在策略编辑器中放置类似于以下内容的内容:
{
"Version": "2012-10-17",
"Id": "Policy1593674317613",
"Statement": [
{
"Action": [
"s3:GetObject"
],
"Resource": "bucket_name/*",
"Effect": "Allow",
"Principal": "read-only_user",
"Sid": "Stmt1593673962638"
}
]
} Where 作:“S3:GetObject”是允许下载对象的作。
其中 效果:“Allow”
where resource“:“bucket_name/*”是存储区名称。
Where Principal“:“read-only_user”是非存储区所有者用户。
选项 2:
将 S3 浏览器与对象所有者结合使用,对于在只读存储区 ACL 之前上传的对象,更改经过身份验证的用户权限,以确保非所有者对象用户可以下载对象:
其他資訊
如果您在通过对象所有者上传对象时遇到问题,并且权限未应用于具有写入访问权限的经过身份验证的用户,请查看知识库文章520711