存储桶策略示例 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

存储桶策略示例

使用 Amazon S3 存储桶策略,您可以保护对存储桶中对象的访问,这样,只有具有适当权限的用户才能访问它们。您甚至可以阻止没有适当权限的经过身份验证的用户访问您的 Amazon S3 资源。

本节介绍关于存储桶策略的典型使用案例的示例。这些示例策略将 DOC-EXAMPLE-BUCKET 用作资源值。要测试这些策略,您需要将 user input placeholders 替换为您自己的信息(例如存储桶名称)。

要授予或拒绝对一组对象的权限,可以在 Amazon资源名称(ARN)和其他值中使用通配符(*)。例如,您可以控制对以通用前缀或以给定扩展名结尾的对象组的访问,例如 .html

有关 Amazon Identity and Access Management(IAM)策略语言的更多信息,请参阅Amazon S3 中的策略和权限

注意

使用 Amazon S3 控制台测试权限时,您必须授予控制台所需的其他权限(s3:ListAllMyBucketss3:GetBucketLocations3:ListBucket)。有关向用户授予权限并使用控制台测试这些权限的示例演练,请参阅使用用户策略控制对存储桶的访问

用于创建存储桶策略的其他资源

向匿名用户授予只读权限

您可以使用策略设置向公共匿名用户授予访问权限,如果您要将存储桶配置为静态网站,这将非常有用。这要求您为存储桶禁用屏蔽公共访问权限。有关更多信息以及如何执行此操作,请参阅设置访问网站的权限。要了解如何出于相同的目的设置更严格的策略,请参阅如何授予对 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)(屏蔽公共访问权限(存储桶设置))下看到一条备注。

需要加密

要求对写入存储桶的所有对象使用 SSE-KMS

以下示例策略要求写入存储桶的每个对象都通过使用 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)进行加密。如果对象未使用 SSE-KMS 进行加密,则请求将被拒绝。

{ "Version": "2012-10-17", "Id": "PutObjPolicy", "Statement": [{ "Sid": "DenyObjectsThatAreNotSSEKMS", "Principal": "*", "Effect": "Deny", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "Null": { "s3:x-amz-server-side-encryption-aws-kms-key-id": "true" } } }] }

要求对写入存储桶的所有对象使用具有特定 Amazon KMS key 的 SSE-KMS

如果未使用特定的 KMS 密钥 ID 通过 SSE-KMS 加密任何对象,则以下示例策略会拒绝将此类对象写入存储桶。即使使用每请求标头或存储桶默认加密通过 SSE-KMS 加密对象,但如果尚未使用指定的 KMS 密钥加密对象,则无法将其写入存储桶。确保将本示例中使用的 KMS 密钥 ARN 替换为您自己的 KMS 密钥 ARN。

{ "Version": "2012-10-17", "Id": "PutObjPolicy", "Statement": [{ "Sid": "DenyObjectsThatAreNotSSEKMSWithSpecificKey", "Principal": "*", "Effect": "Deny", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "ArnNotEqualsIfExists": { "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-2:111122223333:key/01234567-89ab-cdef-0123-456789abcdef" } } }] }

使用标准 ACL 管理存储桶

授予多个账户上载对象或设置对象 ACL 以进行公有访问的权限

以下示例策略向多个 Amazon Web Services 账户授予 s3:PutObjects3:PutObjectAcl 权限,并要求针对这些操作的任何请求都必须包含 public-read 标准访问控制列表(ACL)。有关更多信息,请参阅 Amazon S3 操作Amazon S3 条件键示例

警告

public-read 标准 ACL 允许世界上的任何人查看您存储桶中的对象。在授予对 Amazon S3 存储桶的匿名访问权限或禁用屏蔽公共访问权限设置时,请小心谨慎。如果您授予匿名访问权限,那么世界上的任何人都可以访问您的存储桶。我们建议您永远不要授予对 Amazon S3 存储桶的匿名访问权限,除非您明确需要,如使用静态网站托管时。如果您想为静态网站托管启用屏蔽公共访问权限设置,请参阅教程:在 Amazon S3 上配置静态网站

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPublicReadCannedAcl", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root", "arn:aws:iam::444455556666:root" ] }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": { "s3:x-amz-acl": [ "public-read" ] } } } ] }

在授予上载对象的跨账户权限的同时,确保存储桶拥有者拥有完全控制权

以下示例说明如何允许另一个 Amazon Web Services 账户将对象上载到存储桶,同时确保您完全控制上载的对象。此策略向特定 Amazon Web Services 账户(111122223333)授予上载对象的能力,但仅当该账户在上载时包含 bucket-owner-full-control 标准 ACL 时才能上载对象。该策略中的 StringEquals 条件指定 s3:x-amz-acl 条件键以表示标准 ACL 要求。有关更多信息,请参阅Amazon S3 条件键示例

{ "Version":"2012-10-17", "Statement":[ { "Sid":"PolicyForAllowUploadWithACL", "Effect":"Allow", "Principal":{"AWS":"111122223333"}, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": {"s3:x-amz-acl":"bucket-owner-full-control"} } } ] }

使用对象标记管理对象访问权限

允许用户仅读取具有特定标签键和值的对象

以下权限策略限制用户只能读取具有 environment: production 标签键和值的对象。该策略使用 s3:ExistingObjectTag 条件键来指定标签键和值。

{ "Version":"2012-10-17", "Statement":[ { "Principal":{ "AWS":"arn:aws:iam::111122223333:role/JohnDoe" }, "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition":{ "StringEquals":{ "s3:ExistingObjectTag/environment":"production" } } } ] }

限制用户可以添加哪些对象标签键

以下示例策略将向用户授予执行 s3:PutObjectTagging 操作的权限,这使用户可以将标签添加到现有对象。条件使用 s3:RequestObjectTagKeys 条件键指定允许的标签键,例如 OwnerCreationDate。有关更多信息,请参阅《IAM 用户指南》中的创建测试多个键值的条件

该策略确保在请求中指定的每个标签键都是授权的标签键。条件中的 ForAnyValue 限定符确保请求中必须至少存在指定的值之一。

{ "Version": "2012-10-17", "Statement": [ {"Principal":{"AWS":[ "arn:aws:iam::111122223333:role/JohnDoe" ] }, "Effect": "Allow", "Action": [ "s3:PutObjectTagging" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": {"ForAnyValue:StringEquals": {"s3:RequestObjectTagKeys": [ "Owner", "CreationDate" ] } } } ] }

在允许用户添加对象标签时需要特定的标签键和值

以下示例策略将向用户授予执行 s3:PutObjectTagging 操作的权限,这使用户可以将标签添加到现有对象。条件要求用户包含值设置为 X 的特定标签键(Project)。

{ "Version": "2012-10-17", "Statement": [ {"Principal":{"AWS":[ "arn:aws:iam::111122223333:user/JohnDoe" ] }, "Effect": "Allow", "Action": [ "s3:PutObjectTagging" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": {"StringEquals": {"s3:RequestObjectTag/Project": "X" } } } ] }

允许用户仅添加具有特定对象标签键和值的对象

以下示例策略向用户授予执行 s3:PutObject 操作的权限,以便他们可以向存储桶添加对象。但是,Condition 语句限制了上载的对象上允许的标签键和值。在此示例中,用户只可以将具有特定标签键(Department)(值设置为 Finance)的对象添加到存储桶。

{ "Version": "2012-10-17", "Statement": [{ "Principal":{ "AWS":[ "arn:aws:iam::111122223333:user/JohnDoe" ] }, "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "StringEquals": { "s3:RequestObjectTag/Department": "Finance" } } }] }

使用全局条件键管理对象访问权限

全局条件键是带有 aws 前缀的条件键。Amazon Web Services 可以支持全局条件键或包含服务前缀的服务特定键。您可以使用 JSON 策略的 Condition 元素将请求中的键与您在策略中指定的键值进行比较。

限制只能访问 Amazon S3 服务器访问日志传输

在下面的示例存储桶策略中,aws:SourceArn 全局条件键用于比较资源的 Amazon资源名称(ARN),从而使用在策略中指定的 ARN 发出服务对服务请求。aws:SourceArn 全局条件键用于防止 Amazon S3 服务在服务之间执行事务时被用作混淆代理人。只有 Amazon S3 服务才能将对象添加到 Amazon S3 存储桶。

此示例存储桶策略仅向日志服务主体(logging.s3.amazonaws.com)授予 s3:PutObject 权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjectS3ServerAccessLogsPolicy", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET-logs/*", "Condition": { "StringEquals": { "aws:SourceAccount": "111111111111" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::EXAMPLE-SOURCE-BUCKET" } } }, { "Sid": "RestrictToS3ServerAccessLogs", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET-logs/*", "Condition": { "ForAllValues:StringNotEquals": { "aws:PrincipalServiceNamesList": "logging.s3.amazonaws.com" } } } ] }

仅允许访问您的组织

如果您希望要求访问资源的所有 IAM 主体都来自组织中的 Amazon Web Services 账户(包括 Amazon Organizations 管理账户),则可以使用 aws:PrincipalOrgID 全局条件键。

要授予或限制此类访问权限,请在存储桶策略中定义 aws:PrincipalOrgID 条件并将值设置为您的组织 ID。组织 ID 用于控制对存储桶的访问权限。当您使用 aws:PrincipalOrgID 条件时,存储桶策略中的权限也将应用于添加到组织的所有新账户。

以下是一个基于资源的存储桶策略的示例,您可以使用该策略向组织中的特定 IAM 主体授予对存储桶的直接访问权限。通过向您的存储桶策略添加 aws:PrincipalOrgID 全局条件键,主体账户现在必须在您的组织中才能访问资源。即使您在授予访问权限时意外指定了错误的账户,aws:PrincipalOrgID 全局条件键也可以起到额外保护作用。当在策略中使用该全局键时,此策略防止指定组织之外的所有主体访问 S3 存储桶。只有来自所列组织中账户的主体才能获得对资源的访问权限。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowGetObject", "Principal": { "AWS": "*" }, "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": { "aws:PrincipalOrgID": ["o-aa111bb222"] } } }] }

根据特定 IP 地址管理访问权限

限制特定 IP 地址的访问权限

以下示例拒绝所有用户对指定存储桶中的对象执行任何 Amazon S3 操作,除非请求来自指定的 IP 地址范围。

注意

在限制对特定 IP 地址的访问时,请务必还要指定哪些 VPC 端点、VPC 源 IP 地址或外部 IP 地址可以访问 S3 存储桶。否则,如果您的策略拒绝所有用户在没有适当权限的情况下对存储桶中的对象执行任何 S3 操作,则您可能会失去对存储桶的访问权限。

此策略的 Condition 语句确定允许的互联网协议版本 4(IPv4)IP 地址范围为 192.0.2.0/24

Condition 块使用 NotIpAddress 条件和 aws:SourceIp 条件键(这是 Amazon 范围的条件键)。aws:SourceIp 条件键只能用于公有 IP 地址范围。有关这些条件键的更多信息,请参阅 Amazon S3 条件键示例aws:SourceIp IPv4 值使用标准 CIDR 表示法。有关更多信息,请参阅 IAM 用户指南中的 IAM JSON 策略元素参考

警告

在使用此策略之前,将此示例中的 192.0.2.0/24 IP 地址范围替换为适合您的使用案例的值。否则,您将失去访问存储桶的能力。

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "NotIpAddress": { "aws:SourceIp": "192.0.2.0/24" } } } ] }

同时允许 IPv4 和 IPv6 地址

在您开始使用 IPv6 地址时,建议您使用您的 IPv6 地址范围以及现有的 IPv4 范围来更新组织的所有策略。这样做将有助于确保这些策略在您过渡到 IPv6 时继续有效。

以下示例存储桶策略说明如何结合使用 IPv4 和 IPv6 地址范围来覆盖组织的所有有效 IP 地址。该示例策略将允许对示例 IP 地址 192.0.2.12001:DB8:1234:5678::1 的访问,而拒绝对地址 203.0.113.12001:DB8:1234:5678:ABCD::1 的访问。

aws:SourceIp 条件键只能用于公有 IP 地址范围。aws:SourceIp 的 IPv6 值必须采用标准的 CIDR 格式。对于 IPv6,我们支持使用 :: 表示 0 范围(例如,2001:DB8:1234:5678::/64)。有关更多信息,请参阅 IAM 用户指南中的 IP 地址条件运算符

警告

在使用此策略之前,将此示例中的 IP 地址范围替换为适合您的使用案例的值。否则,您可能会失去访问存储桶的能力。

{ "Id": "PolicyId2", "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIPmix", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24", "2001:DB8:1234:5678::/64" ] }, "NotIpAddress": { "aws:SourceIp": [ "203.0.113.0/24", "2001:DB8:1234:5678:ABCD::/80" ] } } } ] }

管理基于 HTTP 或 HTTPS 请求的访问权限

仅限 HTTPS 请求访问

如果您想防止潜在攻击者操纵网络流量,则可以使用 HTTPS(TLS)以仅允许加密连接,同时限制 HTTP 请求访问您的存储桶。要确定请求是 HTTP 还是 HTTPS,请在 S3 存储桶策略中使用 aws:SecureTransport 全局条件键。aws:SecureTransport 条件键检查请求是不是使用 HTTP 发送的。

如果请求返回 true,则该请求是通过 HTTPS 发送的。如果请求返回 false,则该请求是通过 HTTP 发送的。然后,您可以根据所需的请求方案允许或拒绝对存储桶的访问。

在以下示例中,存储桶策略明确拒绝 HTTP 请求。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "RestrictToTLSRequestsOnly", "Action": "s3:*", "Effect": "Deny", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } }, "Principal": "*" }] }

仅限特定 HTTP 引用站点访问

假设您拥有一个网站,其域名为 www.example.comexample.com,并且带有指向存储在名为 DOC-EXAMPLE-BUCKET 的存储桶中的照片和视频的链接。默认情况下,所有 Amazon S3 资源都是私有的,因此,只有创建资源的 Amazon Web Services 账户才能访问它们。

要允许从您的网站对这些对象进行读取访问,您可以添加一个存储桶策略,以允许 s3:GetObject 权限并附带一个条件,即 GET 请求必须源自特定的网页。以下策略通过使用 StringLike 条件和 aws:Referer 条件键来限制请求。

{ "Version":"2012-10-17", "Id":"HTTP referer policy example", "Statement":[ { "Sid":"Allow only GET requests originating from www.example.com and example.com.", "Effect":"Allow", "Principal":"*", "Action":["s3:GetObject","s3:GetObjectVersion"], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition":{ "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]} } } ] }

确保您使用的浏览器在请求中包含 HTTP referer 标头。

警告

我们建议您谨慎使用 aws:Referer 条件键。包含公共已知的 HTTP 引用站点标头值是非常危险的。未经授权方可能会使用修改的浏览器或自定义浏览器提供他们选择的任何 aws:Referer 值。因此,请勿使用 aws:Referer 防止未经授权的各方直接进行 Amazon 请求。

提供 aws:Referer 条件键只是为了允许客户保护其数字内容(如存储在 Amazon S3 中的内容),以免在未经授权的第三方站点上引用。有关更多信息,请参阅 IAM 用户指南中的 aws:Referer

管理用户对特定文件夹的访问权限

授予用户对特定文件夹的访问权限

假设您正在尝试授予用户对特定文件夹的访问权限。如果 IAM 用户和 S3 存储桶属于同一个 Amazon Web Services 账户,则您可以使用 IAM 策略向用户授予对特定存储桶文件夹的访问权限。使用这种方法,您无需更新存储桶策略即可授予访问权限。您可以将 IAM 策略添加到多个用户可以切换到的 IAM 角色。

如果 IAM 身份和 S3 存储桶属于不同的 Amazon Web Services 账户,则您必须在 IAM 策略和存储桶策略中授予跨账户访问权限。有关授予跨账户访问权限的信息,请参阅存储桶拥有者授予跨账户存储桶权限

以下示例存储桶策略仅授予 JohnDoe 对他的文件夹(home/JohnDoe/)的完全控制台访问权限。通过创建 home 文件夹并向您的用户授予相应的权限,您可以让多个用户共享单个存储桶。该策略由三条 Allow 语句组成:

  • AllowRootAndHomeListingOfCompanyBucket:允许用户(JohnDoe)列出 DOC-EXAMPLE-BUCKET 存储桶的根级别和 home 文件夹中的对象。此语句还允许用户使用控制台根据前缀 home/ 进行搜索。

  • AllowListingOfUserFolder:允许用户(JohnDoe)列出 home/JohnDoe/ 文件夹和任何子文件夹中的所有对象。

  • AllowAllS3ActionsInUserFolder:允许用户通过授予 ReadWriteDelete 权限来执行所有 Amazon S3 操作。权限仅限于存储桶拥有者的主文件夹。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/JohnDoe" ] }, "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"], "Condition": { "StringEquals": { "s3:prefix": ["", "home/", "home/JohnDoe"], "s3:delimiter": ["/"] } } }, { "Sid": "AllowListingOfUserFolder", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/JohnDoe" ] }, "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"], "Condition": { "StringLike": { "s3:prefix": ["home/JohnDoe/*"] } } }, { "Sid": "AllowAllS3ActionsInUserFolder", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/JohnDoe" ] }, "Action": ["s3:*"], "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/JohnDoe/*"] } ] }

管理访问日志的访问权限

授予应用程序负载均衡器访问权限以启用访问日志

在为应用程序负载均衡器启用访问日志时,您必须指定负载均衡器将在其中存储日志的 S3 存储桶的名称。存储桶必须具有附加的策略,用于为弹性负载均衡授予写入存储桶的权限。

在以下示例中,存储桶策略授予弹性负载均衡(ELB)将访问日志写入存储桶的权限:

{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": "arn:aws:iam::elb-account-id:root" }, "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/prefix/AWSLogs/111122223333/*" } ] }
注意

请务必将 elb-account-id 替换为您的 Amazon Web Services 区域的弹性负载均衡的 Amazon Web Services 账户 ID。有关弹性负载均衡区域的列表,请参阅《弹性负载均衡用户指南》中的将策略附加到您的 Amazon S3 存储桶

如果您的 Amazon Web Services 区域未出现在支持的弹性负载均衡区域列表中,请使用以下策略,该策略授予对指定日志传输服务的权限。

{ "Version": "2012-10-17", "Statement": [ { "Principal": { "Service": "logdelivery.elasticloadbalancing.amazonaws.com" }, "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/prefix/AWSLogs/111122223333/*" } ] }

然后,确保通过启用您的弹性负载均衡访问日志来配置它们。您可以通过创建测试文件来验证您的存储桶权限

管理对 Amazon CloudFront OAI 的访问

向 Amazon CloudFront OAI 授予权限

下面的示例存储桶策略授予 CloudFront 来源访问身份(OAI)权限,以获取(读取)S3 存储桶中的所有对象。您可以使用 CloudFront OAI 以允许用户通过 CloudFront 访问存储桶中的对象,但不能直接通过 Amazon S3 访问。有关更多信息,请参阅《Amazon CloudFront 开发人员指南》中的使用来源访问身份限制对 Amazon S3 内容的访问

下面的策略使用 OAI 的 ID 作为策略的 Principal。有关使用 S3 存储桶策略向 CloudFront OAI 授予访问权限的更多信息,请参阅《Amazon CloudFront 开发人员指南》中的从来源访问身份(OAI)迁移到来源访问控制(OAC)

要使用此示例,请执行以下操作:

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

管理 Amazon S3 Storage Lens 存储统计管理工具的访问权限

授予 Amazon S3 Storage Lens 存储统计管理工具的权限

S3 Storage Lens 存储统计管理工具聚合您的指标,并在 Amazon S3 控制台的 Buckets(存储桶)页上的 Account snapshot(账户快照)部分中显示此信息。S3 Storage Lens 存储统计管理工具还提供了一个交互式控制面板,您可以使用它来可视化见解和趋势,标记异常值,并接收有关优化存储成本和应用数据保护最佳实践的建议。控制面板提供深入分析选项,用于在组织、账户、Amazon Web Services 区域、存储类、存储桶、前缀或 Storage Lens 组级别生成和可视化见解。您还可以将采用 CSV 或 Parquet 格式的每日指标导出发送到 S3 存储桶。

S3 Storage Lens 存储统计管理工具可以将聚合的存储使用情况指标导出到 Amazon S3 存储桶中,以便进一步分析。S3 Storage Lens 存储统计管理工具放置其指标导出的存储桶称为目标存储桶。在设置 S3 Storage Lens 存储统计管理工具指标导出时,您必须为目标存储桶制定存储桶策略。有关更多信息,请参阅使用 Amazon S3 Storage Lens 存储统计管理工具评估您的存储活动和使用情况

以下示例存储桶策略授予 Amazon S3 向目标存储桶写入对象(PUT 请求)的权限。在设置 S3 Storage Lens 存储统计管理工具指标导出时,您可以对目标存储桶使用类似这样的存储桶策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3StorageLensExamplePolicy", "Effect": "Allow", "Principal": { "Service": "storage-lens.s3.amazonaws.com" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::destination-bucket/destination-prefix/StorageLens/111122223333/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:s3:region-code:111122223333:storage-lens/storage-lens-dashboard-configuration-id" } } } ] }

在设置 S3 Storage Lens 存储统计管理工具组织级别的指标导出时,对之前存储桶策略的 Resource 语句进行以下修改。

"Resource": "arn:aws:s3:::destination-bucket/destination-prefix/StorageLens/your-organization-id/*",

管理 S3 清单、S3 分析和 S3 清单报告的权限

向 S3 清单和 S3 分析功能授予权限

S3 清单在存储桶中创建对象列表,而 S3 分析存储类分析导出功能创建分析中使用的数据的输出文件。由清单列出其对象的存储桶称为源存储桶。清单文件或分析导出文件将写入到的存储桶称为目标存储桶。在设置清单或分析导出时,必须为目标存储桶创建存储桶策略。有关更多信息,请参阅 Amazon S3 清单Amazon S3 分析 – 存储类分析

以下示例存储桶策略向 Amazon S3 授予将源存储桶的账户中的对象写入(PUT 请求)到目标存储桶的权限。您在设置 S3 清单和 S3 分析导出功能时,将对目标存储桶使用像这样的存储桶策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "InventoryAndAnalyticsExamplePolicy", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET/*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "StringEquals": { "aws:SourceAccount": "111122223333", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }

限制对于 S3 清单报告的访问权限

Amazon S3 清单创建 S3 存储桶中对象的列表,并为每个对象创建元数据。s3:PutInventoryConfiguration 权限允许用户创建清单报告(其中包含所有可用对象元数据字段)并指定存储清单的目标存储桶。对目标存储桶中的对象具有读取权限的用户可以访问清单报告中提供的所有对象元数据字段。有关 S3 清单中提供的元数据字段的更多信息,请参阅 Amazon S3 清单列表

要限制用户配置所有可用对象元数据的 S3 清单报告,请取消该用户的 s3:PutInventoryConfiguration 权限。

要限制用户访问目标存储桶中的 S3 清单报告,请向目标存储桶添加如下示例所示的存储桶策略。此示例存储桶策略拒绝除用户 Ana 以外的所有主体访问目标存储桶 DOC-EXAMPLE-DESTINATION-BUCKET 中的清单报告 DOC-EXAMPLE-DESTINATION-BUCKET-INVENTORY

{ "Id": "GetObjectPolicy", "Version": "2012-10-17", "Statement": [{ "Sid": "AllowListBucket", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET/*" ], "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/Ana" ] } }, { "Sid": "AllowACertainUserToReadObject", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET/DOC-EXAMPLE-DESTINATION-BUCKET-INVENTORY/*", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/Ana" ] } }, { "Sid": "DenyAllTheOtherUsersToReadObject", "Action": [ "s3:GetObject" ], "Effect": "Deny", "Resource": "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET/DOC-EXAMPLE-DESTINATION-BUCKET-INVENTORY/*", "Principal": { "AWS": "*" }, "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::111122223333:user/Ana" } } } ] }

需要 MFA

Amazon S3 支持受 MFA 保护的 API 访问,这是一项可在访问您的 Amazon S3 资源时强制进行多重身份验证(MFA)的特征。多重验证提供了额外的安全级别,可以应用于您的 Amazon 环境。MFA 是一项安全特征,要求用户通过提供有效 MFA 代码来证明实际拥有 MFA 设备。有关更多信息,请参阅 Amazon 多重身份验证。您可以要求对访问 Amazon S3 资源的任何请求使用 MFA。

要强制实施 MFA 要求,请在存储桶策略中使用 aws:MultiFactorAuthAge 条件键。IAM 用户可以使用由 Amazon Security Token Service(Amazon STS)发布的临时凭证访问 Amazon S3 资源。您可以在 Amazon STS 请求时提供 MFA 代码。

当 Amazon S3 收到带多重身份验证的请求时,aws:MultiFactorAuthAge 条件键将提供一个数值,指示临时凭证是在多久以前创建的(以秒为单位)。如果请求中提供的临时凭证不是使用 MFA 设备创建的,则此键值为空(缺失)。您可以在存储桶策略中添加一个条件来检查此值,如下面的示例所示。

如果请求未使用 MFA 进行身份验证,此示例策略将拒绝对 DOC-EXAMPLE-BUCKET 存储桶中的 /taxdocuments 文件夹执行任何 Amazon S3 操作。要了解有关 MFA 的更多信息,请参阅 IAM 用户指南中的在 Amazon 中使用多重身份验证 (MFA)

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/taxdocuments/*", "Condition": { "Null": { "aws:MultiFactorAuthAge": true }} } ] }

如果 aws:MultiFactorAuthAge 条件键值为空,即指示请求中的临时安全凭证是在没有 MFA 设备的情况下创建的,则 Condition 块中的 Null 条件的计算结果为 true

下面的存储桶策略是上述存储桶策略的扩展。它包含两个策略语句。一个语句允许将存储桶(DOC-EXAMPLE-BUCKET)的 s3:GetObject 权限授予所有人。另一个语句通过要求 MFA,进一步限制对 DOC-EXAMPLE-BUCKET/taxdocuments 文件夹的访问。

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/taxdocuments/*", "Condition": { "Null": { "aws:MultiFactorAuthAge": true } } }, { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

您可以选择使用数值条件来限制 aws:MultiFactorAuthAge 键的有效期。您使用 aws:MultiFactorAuthAge 键指定的期限独立于对请求进行身份验证时使用的临时安全凭证的生存期。

例如,除了要求 MFA 身份验证外,下面的存储桶策略还会查看临时会话是在多久以前创建的。如果 aws:MultiFactorAuthAge 键值指示临时会话是在一个小时 (3600 秒) 之前创建的,则策略将拒绝任何操作。

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/taxdocuments/*", "Condition": {"Null": {"aws:MultiFactorAuthAge": true }} }, { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/taxdocuments/*", "Condition": {"NumericGreaterThan": {"aws:MultiFactorAuthAge": 3600 }} }, { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }