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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

存储桶策略示例

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

注意

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

您可以使用 AWS 策略发生器 为您的 Amazon S3 桶。然后,您可以使用生成的文档来设置您的桶策略,方法是使用 Amazon S3 控制台,通过多个第三方工具或通过您的应用程序进行。

重要

使用 Amazon S3 控制台,您需要授予控制台要求的额外权限—s3:ListAllMyBucketss3:GetBucketLocation,和 s3:ListBucket 权限。有关向用户授予权限并使用控制台测试这些权限的示例演练,请参阅演示 控制对带有用户策略的桶的访问.

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

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

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

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

限制对特定IP地址的访问

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

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

TheThethe Condition Block使用 NotIpAddress 条件和 aws:SourceIp 条件密钥,即AWS宽条件键。有关这些条件键的更多信息,请参阅Amazon S3 条件键. TheThethe aws:SourceIp Ipv4值使用标准CIDR标记。有关详细信息,请参阅 IAMJSON政策元素参考IAM 用户指南...

重要

在使用此策略之前,将此示例中的 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.

TheThethe IPv6 值 aws:SourceIp 必须采用标准CIDR格式。对于 IPv6,我们使用 :: 代表一系列0S(例如, 2032001:DB8:1234:5678::/64)。有关详细信息,请参阅 IP地址条件操作符IAM 用户指南.

重要

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

{ "Id":"PolicyId2", "Version":"2012-10-17", "Statement":[ { "Sid":"AllowIPmix", "Effect":"Allow", "Principal":"*", "Action":"s3:*", "Resource":"arn:aws-cn: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 关键字,Get请求必须从特定网页出发。以下策略指定 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-cn: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 S3 使用原始访问身份的内容Amazon CloudFront 开发人员指南.

以下策略使用OAIID作为策略 Principal...如需更多有关使用S3桶策略授予访问权限的信息 CloudFront OAI,参见 使用 Amazon S3 桶政策Amazon CloudFront 开发人员指南.

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

{ "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多因素验证. 您可以要求对任何访问 Amazon S3 资源的任何请求使用 MFA。

您可以使用 aws:MultiFactorAuthAge 键入桶策略。 AWS Identity and Access Management (IAM)用户可以访问 Amazon S3 通过使用 AWS Security Token Service (AWS STS)。您可以在 AWS STS 请求时提供 MFA 代码。

当WhenWhen Amazon S3 接收多因素验证的请求, aws:MultiFactorAuthAge 密钥提供了一个数值,表示已创建临时凭据的时间长度(以秒为单位)。如果请求中提供的临时凭证不是使用 MFA 设备创建的,则此键值为空 (缺失)。您可以在存储桶策略中添加一个条件来检查此值,如下面的示例存储桶策略所示。政策拒绝任何 Amazon S3 操作的操作 /taxdocuments 文件夹 awsexamplebucket1 如果请求未使用MFA进行身份验证,则会使用该请求。如需了解有关MFA的更多信息,请参阅 在AWS中使用多因素验证(MFA)IAM 用户指南.

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

TheThethe Null 条件在 Condition 如果 aws:MultiFactorAuthAge 密钥值为null,表示在没有MFA密钥的情况下创建请求中的临时安全凭据。

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

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

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

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

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

您可以允许其他 AWS 账户将对象上传到您的存储桶。然而,您可能会决定作为存储桶拥有者,您必须完全控制已上传到您的存储桶的对象。以下政策强制执行特定AWS帐户(123456789012)拒绝上传对象的能力,除非该帐户授予对通过电子邮件地址识别的桶所有者的全控制访问(xyz@amazon.com)。TheThethe StringNotEquals 策略中的条件指定 s3:x-amz-grant-full-control 表达要求的条件键(参阅 Amazon S3 条件键)。

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

授予权限 Amazon S3 库存和 Amazon S3 分析

Amazon S3 库存创建对象列表 Amazon S3 桶和 Amazon S3 AnalyticsExport(分析导出)创建分析中使用的数据的输出文件。库存列出对象的桶称为 源桶. 写入库存文件的存储桶以及写入分析导出文件的桶 目标桶. 您在为 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-cn:s3:::destinationbucket/*"], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws-cn:s3:::sourcebucket" }, "StringEquals": { "aws:SourceAccount": "1234567890", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }