设置访问网站的权限 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

设置访问网站的权限

将存储桶配置为静态网站时,如果希望网站成为公有网站,则可以授予公有读取访问权限。要使存储桶公开可读,您必须禁用存储桶的阻止公有访问设置并编写一条授予公有读取访问权限的存储桶策略。如果存储桶包含并非由存储桶拥有者拥有的对象,您可能还需要添加对象访问控制列表 (ACL),以便向所有人授予读取访问权限。

如果您不想禁用存储桶的阻止公共访问设置,但仍希望将自己的网站公开,则可以创建 Amazon CloudFront 分配来为静态网站提供服务。有关更多信息,请参阅 Amazon Route 53 开发人员指南中的使用 Amazon CloudFront 分配以服务静态网站

注意

在网站终端节点上,如果用户请求了不存在的对象,则 Amazon S3 将返回 HTTP 响应代码 404 (Not Found)。如果该对象存在,但您尚未授予对对象的读取权限,则网站终端节点将返回 HTTP 响应代码 403 (Access Denied)。用户可以使用该响应代码推断特定对象是否存在。如果您不需要此行为,则不应启用对存储桶的网站支持。

步骤 1:编辑 S3 阻止公有访问设置

如果要将现有存储桶配置为具有公有访问权限的静态网站,您必须编辑该存储桶的阻止公有访问设置。您可能还必须编辑账户级别的阻止公有访问设置。Amazon S3 会应用限制性最强的存储桶级别和账户级别的阻止公有访问设置的组合。

例如,如果您允许对存储桶进行公有访问,但阻止账户级别的所有公有访问权限,则 Amazon S3 将继续阻止对存储桶进行公有访问。在这种情况下,您将必须编辑存储桶级别和账户级别的阻止公有访问设置。有关更多信息,请参阅 阻止对您的 Amazon S3 存储的公有访问

默认情况下,Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站,您可以使用以下步骤编辑您的阻止公有访问设置。

警告

在完成此步骤之前,请查看 阻止对您的 Amazon S3 存储的公有访问,以确保您了解并接受允许进行公有访问所涉及的风险。当您关闭阻止公有访问设置以使您的存储桶变为公有时,Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 请选择已配置为静态网站的存储桶的名称。

  3. 请选择权限

  4. 阻止公有访问(存储桶设置)下,请选择编辑

  5. 清除阻止所有公有访问,然后选择保存更改

    警告

    在完成此步骤之前,请查看 阻止对您的 Amazon S3 存储的公有访问,以确保您了解并接受允许进行公有访问所涉及的风险。当您关闭阻止公有访问设置以使您的存储桶变为公有时,Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

    Amazon S3 关闭了您的存储桶的阻止公有访问设置。要创建公有静态网站,您可能还必须编辑账户的阻止公有访问设置,然后再添加存储桶策略。如果当前已打开账户的阻止公有访问设置,您将在 Block public access (bucket settings) (阻止公有访问(存储桶设置)) 下看到一条备注。

步骤 2:添加存储桶策略

要使存储桶中的对象公开可读,您必须编写一条向所有人授予 s3:GetObject 权限的存储桶策略。

在编辑 S3 阻止公有访问设置后,您可以添加存储桶策略以授予对存储桶的公有读取访问权限。当您授予公有读取访问权限时,Internet 上的任何人都可以访问您的存储桶。

重要

下面的策略仅供举例说明,仍允许完全访问您存储桶的内容。在继续执行此步骤之前,请查看如何保护 Amazon S3 存储桶中的文件?,以确保您了解保护 S3 存储桶中文件的最佳实践以及授予公有访问权限所涉及的风险。

  1. 存储桶 下,请选择存储桶的名称。

  2. 选择权限

  3. 存储桶策略下,请选择编辑

  4. 要授予对网站的公有读取访问权限,请复制以下存储桶策略,将其粘贴到存储桶策略编辑器中。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::Bucket-Name/*" ] } ] }
  5. Resource 更新为您的存储桶名称。

    在上述示例存储桶策略中,Bucket-Name 是存储桶名称的占位符。要将此存储桶策略用于您自己的存储桶,您必须更新此名称以匹配您的存储桶名称。

  6. 选择保存更改

    此时将显示一条消息,指示存储桶策略已成功添加。

    如果您看到显示 Policy has invalid resource 的错误,请确认存储桶策略中的存储桶名称与您的存储桶名称匹配。有关添加存储桶策略的信息,请参阅如何添加 S3 存储桶策略?

    如果您收到错误消息且无法保存存储桶策略,请检查您的账户和存储桶的阻止公有访问设置以确认您允许对存储桶进行公有访问。

对象访问控制列表

您可以使用存储桶策略来授予对对象的公共读取权限。但是,存储桶策略仅适用于存储桶拥有者所拥有的对象。如果存储桶包含并非由存储桶拥有者拥有的对象,则存储桶拥有者应使用对象访问控制列表 (ACL) 授予对这些对象的公有 READ 权限。

预设情况下,当另一个 Amazon Web Services 账户 将对象上载到您的 S3 存储桶,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用对象所有权来更改此原定设置行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM policy、S3 存储桶策略、虚拟私有云(VPC)端点策略和 Amazon Organizations 服务控制策略(SCP)。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在需要单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 Amazon Web Services 账户 上载的对象维护存储桶。作为存储桶拥有者,您拥有存储桶中的所有对象,并可以使用策略管理对它们的访问。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

重要

如果您的存储桶使用存储桶拥有者强制执行的 S3 对象所有权设置,则必须使用策略授予对存储桶及其中对象的访问权限。设置 ACL 或更新 ACL 的请求失败并返回 AccessControlListNotSupported 错误代码。我们仍然支持读取 ACL 的请求。

要使用 ACL 使对象公开可读,您可以向 AllUsers 组授予 READ 权限,如以下授权元素所示。可以将此授权元素添加到对象 ACL 中。有关管理 ACL 的信息,请参阅 访问控制列表 (ACL) 概述

<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>