菜单
Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)

访问控制列表 (ACL) 概述

Amazon S3 访问控制列表 (ACL) 使您可以管理对存储桶和对象的访问权限。每个存储桶和对象都有一个作为子资源而附加的 ACL。它定义了哪些 AWS 账户或组将被授予访问权限以及访问的类型。收到针对某个资源的请求后,Amazon S3 将检查相应的 ACL 以验证请求者是否拥有所需的访问权限。

创建存储桶或对象时,Amazon S3 将创建一个默认 ACL 以授予资源拥有者对资源的完全控制权限。这显示在下面的示例存储桶 ACL 中 (默认对象 ACL 具有相同的结构):

Copy
<?xml version="1.0" encoding="UTF-8"?> <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>*** Owner-Canonical-User-ID ***</ID> <DisplayName>owner-display-name</DisplayName> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Canonical User"> <ID>*** Owner-Canonical-User-ID ***</ID> <DisplayName>display-name</DisplayName> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> </AccessControlList> </AccessControlPolicy>

示例 ACL 包含一个 Owner 元素,该元素通过 AWS 账户的规范用户 ID (一个长字符串,例如 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be) 标识所有者。Grant 元素将识别被授权者 (AWS 账户或预定义的组) 和所授予的权限。此默认的 ACL 拥有一个适用于所有者的 Grant 元素。您可以通过添加 Grant 元素授予权限,每个授权都将识别被授权者和权限。

注意

ACL 可以拥有最多 100 个授权。

谁是被授权者?

被授权者可以是 AWS 账户或某个预定义的 Amazon S3 组。您可以使用电子邮件地址或规范用户 ID 向 AWS 账户授予权限。但是,如果您在授权请求中提供电子邮件地址,Amazon S3 将为该账户查找规范用户 ID 并将它添加到 ACL。生成的 ACL 将始终包含 AWS 账户的规范用户 ID,而不是 AWS 账户的电子邮件地址。

重要

您无法使用电子邮件地址为在 2014 年 12 月 8 日以后创建的任何 AWS 区域指定被授权者。以下区域是在 2014 年 12 月 8 日以后创建的:美国东部(俄亥俄州)、加拿大 (中部)、亚太地区(孟买)、亚太区域(首尔)、欧洲(法兰克福)、欧洲 (伦敦)、中国(北京) 和 AWS GovCloud (US)。

警告

当您需要向其他 AWS 账户授权访问您的资源时,注意 AWS 账户可以向其账户下的用户授予权限。这称为跨账户访问。有关使用跨账户访问的信息,请参阅 IAM 用户指南 中的创建角色以向 IAM 用户委派权限

查找 AWS 账户的规范用户 ID

规范用户 ID 与您的 AWS 账户关联。有关如何查找您的账户的规范用户 ID 的信息,请参阅查找账户的规范用户 ID

您也可以通过读取 AWS 账户有权访问的存储桶或对象的 ACL,查找 AWS 账户的规范用户 ID。如果某个 AWS 账户通过授权请求被授予了许可,ACL 中将新增一个授权条目和 AWS 账户的规范用户 ID。

Amazon S3 预定义的组

Amazon S3 拥有一系列预定义的组。将账户访问权限授予某个组时,您可以指定我们的一个 URI,而不是规范用户 ID。我们提供以下预定义的组:

  • 经身份验证的用户组 – 由 http://acs.amazonaws.com/groups/global/AuthenticatedUsers 表示。

    该组代表了所有的 AWS 账户。该组的访问许可允许任何 AWS 账户访问资源。但是,所有的请求必须是已签名的 (经身份验证)。

    警告

    在您为 Authenticated Users 组授予访问权限后,世界上的任何经过身份验证的 AWS 用户都可以访问您的资源。

  • 所有的用户组 – 由 http://acs.amazonaws.com/groups/global/AllUsers 表示。

    授予此组的访问权限将允许世界上的任何人访问资源。请求可以是已签名的 (经身份验证),也可以是未签名的 (匿名)。未签名的请求将省略请求中的 Authentication 标头。

    警告

    强烈建议您绝不要向 All Users 组授予 WRITEWRITE_ACPFULL_CONTROL 权限。例如,WRITE 权限将允许任何人在您的存储桶中存储对象,而您需要为其付费。它还会允许其他人删除您可能希望保留的对象。有关这些权限的详细信息,请参阅下一节我能授予哪些许可?

  • 日志传输组 – 由 http://acs.amazonaws.com/groups/s3/LogDelivery 表示。

    存储桶上的 WRITE 许可使该组可以将服务器访问日志 (参阅 服务器访问日志记录) 写入存储桶。

注意

使用 ACL 时,被授权者可以是 AWS 账户或是某个预定义的 Amazon S3 组。但是,被授权者不能是 IAM 用户。有关 IAM 中 AWS 用户和许可的更多信息,请参阅使用 AWS Identity and Access Management

我能授予哪些许可?

下表列出了 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 许可

警告

在授予对您的 S3 存储桶和对象的访问权限时应谨慎使用。例如,授予对存储桶的 WRITE 权限将允许被授权者创建、覆盖和删除存储桶中的任何对象。我们强烈建议您在授予权限之前通读整个访问控制列表 (ACL) 概述部分。

ACL 权限和访问策略权限的映射

如先前表中所示,相比于在访问策略中可设置的权限数目 (请参阅在策略中指定权限),ACL 仅允许授予有限数量的权限。其中每个权限允许一个或多个 Amazon S3 操作。

下表显示每个 ACL 权限如何映射到相应的访问策略权限。正如您所见,与 ACL 相比,访问策略允许的权限更多。您可以将 ACL 主要用于授予基本的读/写权限 (类似于文件系统权限)。有关何时使用 ACL 的更多信息,请参阅有关使用可用访问策略选项的准则

ACL 权限 当在存储桶上授予 ACL 权限时的相应访问策略 当在对象上授予 ACL 权限时的相应访问策略
READ s3:ListBuckets3:ListBucketVersionss3:ListBucketMultipartUploads s3:GetObjects3:GetObjectVersions3:GetObjectTorrent
WRITE

s3:PutObjects3:DeleteObject

此外,如果被授权者是存储桶拥有者,使用存储桶 ACL 来授予 WRITE 许可将允许对该存储桶中的任意版本执行 s3:DeleteObjectVersion 操作。

不适用
READ_ACP s3:GetBucketAcl s3:GetObjectAcls3:GetObjectVersionAcl
WRITE_ACP s3:PutBucketAcl s3:PutObjectAcls3:PutObjectVersionAcl
FULL_CONTROL 等同于授予 READWRITEREAD_ACPWRITE_ACP ACL 权限。因此,此 ACL 权限将映射到相应访问策略权限的组合。 等同于授予 READREAD_ACPWRITE_ACP ACL 权限。因此,此 ACL 权限将映射到相应访问策略权限的组合。

示例 ACL

下面的存储桶上的示例 ACL 可识别资源所有者和一系列的授权。格式是 Amazon S3 REST API 中的 ACL 的 XML 表示形式。存储桶拥有者拥有资源的 FULL_CONTROL。此外,ACL 演示了如何将某个资源的权限授予两个 AWS 账户、规范用户 ID 如何识别权限,以及上一节讨论的两个预定义 Amazon S3 组。

Copy
<?xml version="1.0" encoding="UTF-8"?> <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>Owner-canonical-user-ID</ID> <DisplayName>display-name</DisplayName> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"> <ID>Owner-canonical-user-ID</ID> <DisplayName>display-name</DisplayName> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"> <ID>user1-canonical-user-ID</ID> <DisplayName>display-name</DisplayName> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"> <ID>user2-canonical-user-ID</ID> <DisplayName>display-name</DisplayName> </Grantee> <Permission>READ</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> </Grantee> <Permission>READ</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> </AccessControlList> </AccessControlPolicy>

标准 ACL

Amazon S3 支持一系列预定义的授权,称为标准 ACL。每个标准 ACL 都有一组预定义的被授权者和许可。下表列出了一系列标准 ACL 和相关联的预定义授权。

标准 ACL 适用于 添加到 ACL 的权限
private 存储桶和对象 所有者将获得 FULL_CONTROL。其他人没有访问权限 (默认)。
public-read 存储桶和对象 所有者将获得 FULL_CONTROLAllUsers 组 (参阅 谁是被授权者?) 将获得 READ 访问权限。
public-read-write 存储桶和对象 所有者将获得 FULL_CONTROLAllUsers 组将获得 READWRITE 访问权限。通常不建议在存储桶上授予该权限。
aws-exec-read 存储桶和对象 所有者将获得 FULL_CONTROL。Amazon EC2 从 Amazon S3 获取对 GET Amazon 系统映像 (AMI) 捆绑的 READ 访问权限。
authenticated-read 存储桶和对象 所有者将获得 FULL_CONTROLAuthenticatedUsers 组将获得 READ 访问权限。
bucket-owner-read 对象 对象所有者将获得 FULL_CONTROL。存储桶拥有者将获得 READ 访问权限。如果您在创建存储桶时指定此标准 ACL,Amazon S3 将忽略它。
bucket-owner-full-control 对象 对象所有者和存储桶拥有者均可获得对对象的 FULL_CONTROL。如果您在创建存储桶时指定此标准 ACL,Amazon S3 将忽略它。
log-delivery-write 存储桶 LogDelivery 组将获得针对存储桶的 WRITEREAD_ACP 许可。有关日志的更多信息,请参阅 (服务器访问日志记录)。

注意

您可以在请求中仅指定这些标准 ACL 中的一个。

您可以使用 x-amz-acl 请求标头在请求中指定标准的 ACL。当 Amazon S3 收到包含标准 ACL 的请求时,它会向资源的 ACL 添加预定义的授权。

如何指定 ACL

Amazon S3 API 使您可以在创建存储桶或对象时设置 ACL。Amazon S3 还提供 API 以在现有存储桶或对象上设置 ACL。这些 API 提供了以下方法来设置 ACL:

  • 使用请求标头设置 ACL – 发送创建资源 (存储桶或对象) 的请求时,您可以使用请求标头设置 ACL。使用这些标头时,您可以指定一个标准 ACL 或者显式指定授权 (显式识别被授权者和许可)。

  • 使用请求正文设置 ACL – 当您发送在现有资源上设置 ACL 的请求时,您可以在请求标头或正文中设置 ACL。

有关更多信息,请参阅 管理 ACL