Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

存储桶策略示例

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

注意

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

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

重要

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

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

以下示例策略向多个 AWS 账户授予 s3:PutObjects3:PutObjectAcl 权限,并要求针对这些操作的任何请求都包含 public-read 标准 ACL。有关更多信息,请参阅 在策略中指定权限在策略中指定条件

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

向匿名用户授予只读权限

下面的示例策略向任何公用匿名用户授予 s3:GetObject 权限。 (有关权限以及它们允许执行的操作的列表,请参阅在策略中指定权限。) 此权限允许任何人读取对象数据,当您将存储桶配置为网站并且希望每个人都能读取存储桶中的对象时,这十分有用。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AddPerm", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws-cn:s3:::examplebucket/*"] } ] }

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

以下示例向任何用户授予对指定存储桶中的对象执行任何 Amazon S3 操作的权限。但是,请求必须来自条件中指定的 IP 地址范围。

此语句的条件确定允许的 Internet 协议版本 4 (IPv4) IP 地址范围为 54.240.143.*,有一种例外情况:54.240.143.188。

Condition 块使用 IpAddressNotIpAddress 条件以及 aws:SourceIp 条件键 (这是 AWS 范围的条件键)。有关这些条件键的更多信息,请参阅在策略中指定条件aws:sourceIp IPv4 值使用标准 CIDR 表示法。有关更多信息,请参阅 IAM 用户指南 中的 IP 地址条件运算符

Copy
{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws-cn:s3:::examplebucket/*", "Condition": { "IpAddress": {"aws:SourceIp": "54.240.143.0/24"}, "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} } } ] }

允许 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,我们支持使用 :: 表示 0s 范围,例如,2032001:DB8:1234:5678::/64。有关更多信息,请参阅 IAM 用户指南 中的 IP 地址条件运算符

Copy
{ "Id":"PolicyId2", "Version":"2012-10-17", "Statement":[ { "Sid":"AllowIPmix", "Effect":"Allow", "Principal":"*", "Action":"s3:*", "Resource":"arn:aws-cn:s3:::examplebucket/*", "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),并且带有指向存储在 S3 存储桶中的照片和视频的链接 examplebucket。默认情况下,所有 S3 资源都是私有的,因此只有创建资源的 AWS 账户才能访问它们。要允许从您的网站对这些对象进行读取访问,您可以添加一个存储桶策略允许 s3:GetObject 权限,并附带使用 aws:referer 键的条件,即获取请求必须来自特定的网页。以下策略指定带有 aws:Referer 条件键的 StringLike 条件。

Copy
{ "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", "Resource":"arn:aws-cn:s3:::examplebucket/*", "Condition":{ "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]} } } ] }

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

您可以通过向存储桶策略添加显式拒绝,更好地保护对 examplebucket 存储桶中的对象的访问,如下面的示例所示。显式拒绝将取代您使用其他方法 (如 ACL 或用户策略) 可能已授予 examplebucket 存储桶中的对象的任何许可。

Copy
{ "Version": "2012-10-17", "Id": "http referer policy example", "Statement": [ { "Sid": "Allow get requests referred by www.example.com and example.com.", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::examplebucket/*", "Condition": { "StringLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]} } }, { "Sid": "Explicit deny to ensure requests are allowed only from specific referer.", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws-cn:s3:::examplebucket/*", "Condition": { "StringNotLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]} } } ] }

向 Amazon CloudFront Origin Identity 授予权限

下面的示例中,存储桶策略向 CloudFront Origin Identity 授予获取 (列出) Amazon S3 存储桶中所有对象的权限。CloudFront Origin Identity 用于启用 CloudFront 的私有内容功能。该策略使用 CanonicalUser 前缀而不是 AWS 来指定规范用户 ID。要了解有关提供私有内容的 CloudFront 支持的更多信息,请参阅 Amazon CloudFront 开发人员指南 中的提供私有内容主题。您必须为您的 CloudFront 分配的原始访问标识指定规范用户 ID。有关查找规范用户 ID 的说明,请参阅在策略中指定委托人

Copy
{ "Version":"2012-10-17", "Id":"PolicyForCloudFrontPrivateContent", "Statement":[ { "Sid":" Grant a CloudFront Origin Identity access to support private content", "Effect":"Allow", "Principal":{"CanonicalUser":"79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"}, "Action":"s3:GetObject", "Resource":"arn:aws-cn:s3:::example-bucket/*" } ] }

添加存储桶策略以要求进行 MFA 身份验证

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

您可以使用存储桶策略中的 aws:MultiFactorAuthAge 密钥强制 MFA 身份验证请求。IAM 用户可以使用由 AWS 安全令牌服务 (STS) 颁发的临时凭证访问 Amazon S3 资源。您可以在 STS 请求时提供 MFA 代码。

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

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

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

下面的存储桶策略是上述存储桶策略的扩展。它包含两个策略声明。一条语句允许所有人对存储桶 (examplebucket) 拥有 s3:GetObject 权限,另一条语句通过要求进行 MFA 身份验证进一步限制对存储桶中 examplebucket/taxdocuments 文件夹的访问。

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

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

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

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

您可以允许其他 AWS 账户将对象上传到您的存储桶。然而,您可能会决定作为存储桶拥有者,您必须完全控制已上传到您的存储桶的对象。下面的策略将强制拒绝特定的 AWS 账户 (111111111111) 上传对象的能力,除非该账户向由电子邮件地址 (xyz@amazon.com) 标识的存储桶拥有者授予完全控制访问权限。该策略中的 StringNotEquals 条件指定 s3:x-amz-grant-full-control 条件键以表示要求 (请参阅在策略中指定条件)。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"111", "Effect":"Allow", "Principal":{"AWS":"1111111111"}, "Action":"s3:PutObject", "Resource":"arn:aws-cn:s3:::examplebucket/*" }, { "Sid":"112", "Effect":"Deny", "Principal":{"AWS":"1111111111" }, "Action":"s3:PutObject", "Resource":"arn:aws-cn:s3:::examplebucket/*", "Condition": { "StringNotEquals": {"s3:x-amz-grant-full-control":["emailAddress=xyz@amazon.com"]} } } ] }

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

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

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

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