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.

用户策略示例

本节介绍用于控制用户访问 Amazon S3 的几个 IAM 用户策略。有关访问策略语言的更多信息,请参阅访问策略语言概述

如果您以编程方式测试以下示例策略,则它们将起作用;但是,为了使它们与 Amazon S3 控制台一起使用,您将需要授予控制台所需的其他权限。有关使用策略 (例如与 Amazon S3 控制台一起使用的策略) 的信息,请参阅演练示例:使用用户策略控制对存储桶的访问

示例:允许 IAM 用户访问您的一个存储桶

在本示例中,您需要授予您的 AWS 账户中的 IAM 用户访问一个存储桶 examplebucket 的权限,以便该用户能够添加、更新和删除对象。

除了授予该用户 s3:PutObjects3:GetObjects3:DeleteObject 权限外,此策略还授予 s3:ListAllMyBucketss3:GetBucketLocations3:ListBucket 权限。这些是控制台所需的其他权限。此外,s3:PutObjectAcls3:GetObjectAcl 操作需要能够在控制台中复制、剪切和粘贴对象。有关向用户授予权限并使用控制台测试这些权限的示例演练,请参阅演练示例:使用用户策略控制对存储桶的访问

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:ListAllMyBuckets" ], "Resource":"arn:aws-cn:s3:::*" }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource":"arn:aws-cn:s3:::examplebucket" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource":"arn:aws-cn:s3:::examplebucket/*" } ] }

示例:允许每个 IAM 用户访问存储桶中的一个文件夹

在本示例中,您需要两个 IAM 用户 (Alice 和 Bob) 具有访问存储桶 examplebucket 的权限,以便他们可以添加、更新和删除对象。但是,您想要限制每个用户对存储桶中单个文件夹的访问权限。您可以使用与用户名称匹配的名称创建文件夹。

Copy
examplebucket Alice/ Bob/

要授予每个用户仅可以访问他们的文件夹的权限,您可以为每个用户编写策略,然后分别附加它。例如,您可以将以下策略附加到用户 Alice,以允许她对 examplebucket/Alice 文件夹的特定 Amazon S3 权限。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws-cn:s3:::examplebucket/Alice/*" } ] }

然后,您可以将类似策略附加到用户 Bob,以在 Resource 值中识别 Bob 文件夹。

不要将策略附加到单个用户,而是编写使用策略变量的单个策略并将该策略附加到组。首先,您需要创建一个组,然后将 Alice 和 Bob 添加到该组。以下示例策略允许在 examplebucket/${aws:username} 文件夹中具有一组 Amazon S3 权限。评估策略后,策略变量 ${aws:username} 将替换为请求者的用户名称。例如,如果 Alice 发送了一个请求以放置对象,只有当 Alice 将对象上传到 examplebucket/Alice 文件夹后,才允许该操作。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws-cn:s3:::examplebucket/${aws:username}/*" } ] }

注意

使用策略变量时,您必须在该策略中显式指定版本 2012-10-17。访问策略语言的默认版本 2008-10-17 不支持策略变量。

如果需要在 Amazon S3 控制台上测试之前的策略,控制台需要其他 Amazon S3 权限,如以下策略所示。有关控制台如何使用这些权限的信息,请参阅 演练示例:使用用户策略控制对存储桶的访问

Copy
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws-cn:s3:::*" ] }, { "Sid": "AllowRootLevelListingOfTheBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::examplebucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::examplebucket"], "Condition":{ "StringLike":{"s3:prefix":["${aws:username}/*"] } } }, { "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix", "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws-cn:s3:::examplebucket/${aws:username}/*" } ] }

注意

在 2012-10-17 版本的策略中,策略变量以 $ 开始。如果您的对象键包括 $,则语法中的此更改可能会产生冲突。例如,要在策略中包括对象键 my$file,可以使用 $${$} 指定 my${$}file 字符。

尽管 IAM 用户名称是友好、用户可读的标识符,但是它们无需全局唯一。例如,如果用户 Bob 离开了组织,且另一个 Bob 加入进来,则新 Bob 可以访问旧 Bob 的信息。您可以基于用户 ID 创建文件夹,而不是使用用户名称。每个用户 ID 都是唯一的。在这种情况下,您需要修改之前的策略,以使用 ${aws:userid} 策略变量。有关用户标识符的更多信息,请参阅 IAM 用户指南 中的 IAM 标识符

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws-cn:s3:::my_corporate_bucket/home/${aws:userid}/*" } ] }

允许非 IAM 用户 (移动应用用户) 访问存储桶中的文件夹

假设您要开发一个移动应用,一个将用户数据存储在 S3 存储桶中的游戏。对于每个应用用户,您都需要在您的存储桶中创建一个文件夹。您还需要限制每个用户对其文件夹的访问权限。但是,在有人下载您的应用、开始玩此游戏之前,您不能创建文件夹,因为您没有用户 ID。

这种情况下,您可以要求用户使用公共身份提供商 (如 Login with Amazon、Facebook、或 Google) 登录到您的应用程序。用户通过这些提供商之一登录应用后,他们就有了用户 ID,可用来在运行时创建用户特定文件夹。

然后,您可以使用 AWS Security Token Service 中的 Web 联合身份验证将来自身份提供商的信息与您的应用相集成,为每个用户获取临时安全凭证。然后,您可以创建 IAM 策略,以便允许该应用访问存储桶和执行操作,如创建用户特定文件夹和上传数据。有关 Web 联合身份的更多信息,请参阅 IAM 用户指南 中的关于 Web 联合身份

示例:允许组在 Amazon S3 中拥有共享文件夹

将以下策略附加到组时,会授予组中每个成员访问 Amazon S3 中以下文件夹的权限:my_corporate_bucket/share/marketing。组成员仅允许访问策略中显示的特定 Amazon S3 权限,仅适用于指定文件夹中的对象。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws-cn:s3:::my_corporate_bucket/share/marketing/*" } ] }

示例:允许所有用户读取企业存储桶某部分中的对象

在本示例中,我们将创建名为 AllUsers 的组,该组包含 AWS 账户拥有的所有 IAM 用户。然后,我们将附加向该组提供对 GetObjectGetObjectVersion 的访问权限的策略,但仅适用于 my_corporate_bucket/readonly 文件夹中的数据元。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetObjectVersion" ], "Resource":"arn:aws-cn:s3:::my_corporate_bucket/readonly/*" } ] }

示例:允许合作伙伴将文件放入企业存储桶的特定部分中

在本示例中,我们将创建代表合作伙伴公司的名为 WidgetCo 的组。我们将在需要访问的合作伙伴公司中为特定用户或应用程序创建 IAM 用户,然后将该用户放入组中。

然后,我们将附加向组 PutObject 提供对企业存储段中的以下文件夹的访问权限的策略:my_corporate_bucket/uploads/widgetco

我们需要阻止 WidgetCo 组对存储桶执行任何其他操作,因此添加了一条语句,除了对 AWS 账户中的任何 Amazon S3 资源的 PutObject 权限外,该语句将显式拒绝对所有 Amazon S3 权限的权限。如果在您的 AWS 账户的其他位置使用了广泛策略,该策略向用户提供对 Amazon S3 资源的广泛访问,则此步骤是必要的。

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws-cn:s3:::my_corporate_bucket/uploads/widgetco/*" }, { "Effect":"Deny", "NotAction":"s3:PutObject", "Resource":"arn:aws-cn:s3:::my_corporate_bucket/uploads/widgetco/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws-cn:s3:::my_corporate_bucket/uploads/widgetco/*" } ] }