Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

用户策略示例

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

如果以编程方式进行测试,以下示例策略将正常工作。不过,要在 Amazon S3 控制台中使用这些策略,您必须授予控制台所需的额外权限。有关使用策略(例如与 Amazon S3 控制台一起使用的策略)的信息,请参阅演练:使用用户策略控制对存储桶的访问

允许 IAM 用户访问某个存储桶

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

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

{ "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 存储桶,以便他们可以添加、更新和删除对象。但是,您想要限制每个用户对存储桶中单个文件夹的访问权限。您可以使用与用户名称匹配的名称创建文件夹。

examplebucket Alice/ Bob/

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

{ "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,以在 Bob 值中识别 Resource 文件夹。

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

{ "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 权限,如以下策略所示。有关控制台如何使用这些权限的信息,请参阅 演练:使用用户策略控制对存储桶的访问

{ "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 标识符

{ "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 权限,仅适用于指定文件夹中的对象。

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

允许所有用户读取 Corporate 存储桶的某个部分中的对象

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

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

允许合作伙伴将文件放置到 Corporate 存储桶的特定部分中

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

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

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

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