存储桶策略示例 - Amazon Simple Storage Service

存储桶策略示例

本节介绍几个关于存储桶策略的典型使用案例示例。策略在资源值中使用 bucketexamplebucket 字符串。要测试这些策略,您需要将这些字符串替换为您的存储桶名称。有关访问策略语言的更多信息,请参阅Amazon S3 中的策略和权限

注意

存储桶策略的大小限制为 20 KB。

您可以使用 AWS 策略生成器为您的 Amazon S3 存储桶创建存储桶策略。然后,您可以通过 Amazon S3 控制台、多个第三方工具或您的应用程序,使用生成的文档设置您的存储桶策略。

重要

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

在添加条件的情况下向多个账户授予权限

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

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

向匿名用户授予只读权限

下面的示例策略向任何公用匿名用户授予 s3:GetObject 权限。(有关权限以及它们允许执行的操作的列表,请参阅Amazon S3 操作。) 此权限允许任何人读取对象数据,当您将存储桶配置为网站并且希望每个人都能读取存储桶中的对象时,这十分有用。在使用存储桶策略向匿名用户授予只读权限之前,您必须对存储桶禁用阻止公有访问设置。有关更多信息,请参阅设置访问网站的权限

{ "Version":"2012-10-17", "Statement":[ { "Sid":"PublicRead", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject","s3:GetObjectVersion"], "Resource":["arn:aws:s3:::awsexamplebucket1/*"] } ] }
警告

在授予对 Amazon S3 存储桶的匿名访问权限或禁用阻止公有访问设置时,请小心谨慎。如果您授予匿名访问权限,那么世界上的任何人都可以访问您的存储桶。我们建议您永远不要授予对 Amazon S3 存储桶的匿名访问权限,除非您明确需要,如使用静态网站托管时。

将访问权限限定为特定 IP 地址

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

此语句确定 54.240.143.0/24 作为允许的 Internet 协议版本 4 (IPv4) IP 地址范围。

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

重要

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

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

允许 IPv4 和 IPv6 地址

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

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

aws:SourceIp 的 IPv6 值必须采用标准的 CIDR 格式。对于 IPv6,我们支持使用 :: 表示 0 范围(例如,2032001: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:::awsexamplebucket1/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "54.240.143.0/24", "2001:DB8:1234:5678::/64" ] }, "NotIpAddress": { "aws:SourceIp": [ "54.240.143.128/30", "2001:DB8:1234:5678:ABCD::/80" ] } } } ] }

限制对特定 HTTP 引用站点的访问

假设您拥有一个网站,其域名为 www.example.comexample.com,并且带有指向存储在 Amazon S3 存储桶 awsexamplebucket1 中的照片和视频的链接。默认情况下,所有 Amazon S3 资源都是私有的,因此只有创建资源的 AWS 账户才能访问它们。要允许从您的网站对这些对象进行读取访问,您可以添加一个存储桶策略允许 s3:GetObject 权限,并附带使用 aws:Referer 键的条件,即获取请求必须来自特定的网页。以下策略指定带有 StringLike 条件键的 aws:Referer 条件。

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

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

向 Amazon CloudFront OAI 授予权限

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

下面的策略使用 OAI ID 作为策略的 Principal。有关使用 S3 存储桶策略授予对 CloudFront OAI 的访问权限的更多信息,请参阅 Amazon CloudFront 开发人员指南 中的使用 Amazon S3 存储桶策略

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

{ "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:::awsexamplebucket1/*" } ] }

添加存储桶策略以请求 MFA

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

您可以使用存储桶策略中的 aws:MultiFactorAuthAge 密钥来实施 MFA 要求。AWS Identity and Access Management (IAM) 用户可通过使用 AWS Security Token Service (AWS STS) 颁发的临时凭证来访问 Amazon S3 资源。您可以在 AWS STS 请求时提供 MFA 代码。

Amazon S3 收到带多重验证的请求时,aws:MultiFactorAuthAge 键将提供一个数值,指示临时凭证是在多久以前创建的(以秒为单位)。如果请求中提供的临时凭证不是使用 MFA 设备创建的,则此键值为空 (缺失)。您可以在存储桶策略中添加一个条件来检查此值,如下面的示例存储桶策略所示。如果请求未使用 MFA 进行身份验证,策略将拒绝对 awsexamplebucket1 存储桶中的 /taxdocuments 文件夹执行的任何 Amazon S3 操作。要了解有关 MFA 的更多信息,请参阅IAM 用户指南中的在 AWS 中使用 Multi-Factor Authentication (MFA)

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

如果 Null 键值为空,即指示请求中创建的临时安全凭证不具有 MFA 密钥,则 Condition 块中的 aws:MultiFactorAuthAge 条件的计算结果为 true。

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

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

您可以选择使用数值条件限制 aws:MultiFactorAuthAge 密钥的有效期,该期限独立于对请求进行身份验证时使用的临时安全凭证的生存期。例如,除了要求 MFA 身份验证外,下面的存储桶策略还会查看临时会话是在多久以前创建的。如果 aws:MultiFactorAuthAge 键值指示临时会话是在一个小时 (3600 秒) 之前创建的,则策略将拒绝任何操作。

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

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

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

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

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

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

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

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