用户策略示例 - Amazon Simple Storage Service

用户策略示例

本节介绍用于控制用户对 Amazon S3 的访问权限的几个示例 AWS Identity and Access Management (IAM) 用户策略。有关示例存储桶策略,请参阅 使用存储桶策略。有关 IAM policy 语言的信息,请参阅存储桶策略和用户策略

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

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

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

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

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

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

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

DOC-EXAMPLE-BUCKET1 Mary/ Carlos/

要授予每个用户仅可以访问其文件夹的权限,您可以为每个用户编写策略,然后分别附加它。例如,您可以将以下策略附加到用户 Mary,以允许她对 DOC-EXAMPLE-BUCKET1/Mary 文件夹拥有特定的 Amazon S3 权限。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/Mary/*" } ] }

然后,您可以将类似策略附加到用户 Carlos,同时在 Resource 值中指定文件夹 Carlos

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

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/${aws:username}/*" } ] }
注意

当使用策略变量时,您必须在策略中明确指定版本 2012-10-17。IAM policy 语言的默认版本 2008-10-17 不支持策略变量。

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

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

在 2012-10-17 版本的策略中,策略变量以 $ 开始。如果您的对象键(对象名称)包括 $,则语法中的此更改可能会产生冲突。

为避免此冲突,请通过使用 ${$} 指定 $ 字符。例如,要在策略中包括对象键 my$file,请将其指定为 my${$}file

尽管 IAM 用户名称是友好、用户可读的标识符,但是它们无需全局唯一。例如,如果用户 Carlos 离开了企业,而另一个 Carlos 加入进来,则新 Carlos 可以访问原 Carlos 的信息。

您可以基于 IAM 用户 ID 创建文件夹,而不是使用用户名称。每个 IAM 用户 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:s3:::DOC-EXAMPLE-BUCKET1/home/${aws:userid}/*" } ] }

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

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

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

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

允许组在 Amazon S3 中拥有共享的文件夹

将以下策略附加到组将授予该组中的每个人访问 Amazon S3 中的以下文件夹的权限:DOC-EXAMPLE-BUCKET1/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:s3:::DOC-EXAMPLE-BUCKET1/share/marketing/*" } ] }

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

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

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

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

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

然后,您附加策略,此策略向组提供对存储桶中以下文件夹的 PutObject 访问权限:

DOC-EXAMPLE-BUCKET1/uploads/anycompany

您需要阻止 AnyCompany 组对存储桶执行任何其他操作,因此添加了一条语句,除了对 AWS 账户中的任何 Amazon S3 资源执行 PutObject 外,该语句显式拒绝执行任何其他 Amazon S3 操作的权限。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/uploads/anycompany/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/uploads/anycompany/*" } ] }

限制对特定 AWS 账户中 Amazon S3 存储桶的访问

如果您想确保您的 Amazon S3 主体只能访问受信任 AWS 账户中的资源,您可以限制访问权限。例如,基于身份的 IAM policy 使用 Deny 影响来阻止对 Amazon S3 操作的访问,除非正在访问的 Amazon S3 资源在账户 222222222222 中。为了防止 AWS 账户中的 IAM 主体访问账户外的 Amazon S3 对象,请附加以下 IAM policy:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:ResourceAccount": [ "222222222222" ] } } } ] }
注意

此策略不会取代现有的 IAM 访问控制,因为它不授予任何访问权限。相反,无论通过其他 IAM policy 授予什么权限,此策略都可以作为其他 IAM 权限的额外防护机制。

请确保将策略中的账户 ID 222222222222 替换为您自己的 AWS 账户。要在仍保持此限制的同时将策略应用于多个账户,请将账户 ID 替换为 aws:PrincipalAccount 条件键。该条件要求主体和资源必须在同一账户中。

限制企业单位 (OU) 内对 Amazon S3 存储桶的访问

如果在 AWS Organizations 中设置了企业单位 (OU),则可能需要将 Amazon S3 存储桶访问限制为企业的特定部分。在本示例中,我们将使用 aws:ResourceOrgPaths 键以限制 Amazon S3 存储桶对企业中 OU 的访问。在本例中,OU IDou-acroot-exampleou。确保用自己的 OU ID 替换自己的策略中的此值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowS3AccessOutsideMyBoundary", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-exampleou/" ] } } } ] }
注意

该策略不授予任何访问权限。相反,此策略充当其他 IAM 权限的后盾,阻止主体访问 OU 定义边界之外的 Amazon S3 对象。

该策略拒绝对 Amazon S3 操作的访问,除非正在访问的 Amazon S3 对象位于您企业的 ou-acroot-exampleou OU 中。IAM policy 条件要求 aws:ResourceOrgPaths(多值条件键)包含列出的任何 OU 路径。该策略使用 ForAllValues:StringNotLike 运算符将 aws:ResourceOrgPaths 的值与列出的 OU 进行比较,而不进行区分大小写的匹配。

限制对企业内 Amazon S3 存储桶的访问

要限制对组织内 Amazon S3 对象的访问,请将 IAM policy 附加到组织的根,并将其应用于组织中的所有账户。如果要求您的 IAM 主体遵守此规则,请使用服务控制策略 (SCP)。如果您选择使用 SCP,请确保先全面测试 SCP,然后将策略附加到企业的根。

在以下示例策略中,将拒绝对 Amazon S3 操作的访问,除非正在访问的 Amazon S3 对象与访问该对象的 IAM 主体位于同一企业中:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::*/*", "Condition": { "StringNotEquals": { "aws:ResourceOrgID": "${aws:PrincipalOrgID}" } } } ] }
注意

该策略不授予任何访问权限。相反,此策略充当其他 IAM 权限的后盾,阻止主体访问企业外部的任何 Amazon S3 对象。此策略还适用于在策略生效后创建的 Amazon S3 资源。

本例中的 IAM policy 条件要求 aws:ResourceOrgIDaws:PrincipalOrgID 彼此相等。有了这一要求,提出请求的主体和正在访问的资源必须位于同一企业中。