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。我们将创建一个包含文件夹的存储桶,然后在您的 AWS 账户中创建 AWS Identity and Access Management 用户并向这些用户授予对 Amazon S3 存储桶及其中的文件夹的增量许可。

背景:存储桶和文件夹基础知识

Amazon S3 数据模型是一种扁平结构:您创建存储桶,存储桶存储对象。不存在子存储桶或子文件夹的层级结构,但您可以效仿文件夹的层级结构。诸如 Amazon S3 控制台等工具可以显示存储桶中的这些逻辑文件夹和子文件夹的视图,如下所示:

控制台显示名为 companybucket 的存储桶拥有三个文件夹:PrivateDevelopmentFinance;以及一个对象:s3-dg.pdf。控制台使用对象名称 (键) 来创建文件夹和子文件夹的逻辑层级结构。考虑以下示例:

  • 当您创建 Development 文件夹时,控制台将创建带有键值 Development/ 的对象。请注意尾部的“/”分隔符。

  • 当您将名为 Projects1.xls 的对象上传到 Development 文件夹时,控制台会上传该对象并授予它 Development/Projects1.xls 键。

    在此键值中,Development 是前缀,'/' 是分隔符。Amazon S3 API 在其操作中支持前缀和分隔符。例如,您可以使用特定的前缀和分隔符,从存储桶获取所有对象的列表。在控制台中,若您双击 Development 文件夹,控制台会列出该文件夹内的对象。在下例中,Development 文件夹包含一个对象。

    当控制台列出 companybucket 存储桶中的 Development 文件夹时,它会向 Amazon S3 发送请求并在请求中指定前缀 Development 和分隔符 '/'。控制台的反应方式与计算机文件系统内的文件夹列表的反应方式相似。上一个示例显示,存储桶 companybucket 拥有一个带键值 Development/Projects1.xls 的对象。

控制台使用对象键来推断逻辑层级结构;Amazon S3 没有物理层级结构,它只有采用平面文件结构包含对象的存储桶。若您使用 Amazon S3 API 来创建对象,可以使用暗示逻辑层级结构的对象键。

当您创建对象的逻辑层级结构时,您可以管理对单个文件夹的访问权限,在本演练中我们将进行这样的操作。

在浏览演练之前,您还需要熟悉另一个概念,即“根级”存储桶内容。假设您的 companybucket 存储桶具有以下对象:

Private/privDoc1.txt

Private/privDoc2.zip

Development/project1.xls

Development/project2.xls

Finance/Tax2011/document1.pdf

Finance/Tax2011/document2.pdf

s3-dg.pdf

这些对象键可以创建一个逻辑层级结构,将 PrivateDevelopmentFinance 作为根级文件夹并将 s3-dg.pdf 作为根级对象。当您在 Amazon S3 控制台中单击存储桶名称时,根级项目如下所示。控制台会将顶级前缀 (Private/、Development/ 和 Finance/) 显示为根级文件夹。对象键 s3-dg.pdf 没有前缀,因此它显示为根级项目。

演练示例

本演练的示例如下:

  • 创建一个存储桶,然后向其添加三个文件夹 (Private、Development 和 Finance)。

  • 您拥有两个用户,Alice 和 Bob。您希望 Alice 只能访问 Development 文件夹;Bob 只能访问 Finance 文件夹;并且您想要将 Private 文件夹内容保持为私有。在演练中,您通过创建 AWS Identity and Access Management (IAM) 用户 (我们将使用相同用户名称 Alice 和 Bob) 来管理访问,并向这些用户授予所需许可。

    IAM 还支持创建用户组以及授予适用于组中所有用户的组级许可。这将帮助您更好地管理许可。就本演练而言,Alice 和 Bob 都需要一些常规的许可。因此,您也需要创建名为 Consultants 的组,并将 Alice 和 Bob 添加到该组。首先,通过将组策略附加到该组来授予许可。然后,通过将策略附加到特定用户来添加用户特定的许可。

注意

本演练使用 companybucket 作为存储桶名称,使用 Alice 和 Bob 作为 IAM 用户,并使用 Consultants 作为组名称。由于 Amazon S3 要求存储桶名称全局唯一,因此您需要创建一个名称来替代存储桶名称。

步骤 0:准备演练

在本示例中,您将使用 AWS 账户凭证来创建 IAM 用户。 最初,这些用户没有权限。您可以采用递增的方式授予这些用户许可,让他们执行特定的 Amazon S3 操作。要测试这些许可,您需要使用每个用户的凭证登录控制台。由于您以 AWS 账户拥有者身份递增地授予许可,并以 IAM 用户身份测试这些许可,因此每次使用不同的凭证时需要登录和注销。您可以使用一个浏览器进行此项测试,但如果您采用两个不同的浏览器,测试过程会更快:使用 AWS 账户凭证将一个浏览器连接到 AWS 管理控制台,并使用 IAM 用户凭证连接另一个浏览器。

要使用 AWS 账户凭证登录 AWS 管理控制台,请转到 https://console.amazonaws.cn/ IAM 用户无法使用同一链接进行登录。IAM 用户必须使用支持 IAM 的登录页面。作为账户所有者,您可以向您的用户提供此链接。

有关 IAM 的更多信息,请转到 IAM 用户指南 中的 AWS 管理控制台登录页

向 IAM 用户提供登录链接

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

  2. Navigation 窗格中,单击 IAM Dashboard

  3. 记下 IAM users sign in link: 下的 URL。向 IAM 用户提供此链接,以便其使用 IAM 用户名称和密码登录控制台。

步骤 1:创建存储桶

在此步骤中,您可以使用 AWS 账户凭证登录到 Amazon S3 控制台,创建一个存储桶,将文件夹 (Development、Finance 和 Private) 添加到该存储桶,然后在每个文件夹中上传一个或两个示例文档。

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

  2. 创建存储桶。

    有关分步说明,请参阅如何创建 S3 存储桶? (在 Amazon Simple Storage Service 控制台用户指南 中)。

  3. 将一个文档上传到存储桶。

    本演练假设您有一个 s3-dg.pdf 文档位于此存储桶的根级。如果您上传其他文档,请使用其文件名替代 s3-dg.pdf

  4. 将名为 Private、Finance 和 Development 的三个文件夹添加到存储桶。

  5. 将一个或两个文档上传到每个文件夹。

    在本演练中,我们将假设您已在每个文件夹中上传了一些文档,并使存储桶包含带有以下密钥的对象:

    Private/privDoc1.txt

    Private/privDoc2.zip

    Development/project1.xls

    Development/project2.xls

    Finance/Tax2011/document1.pdf

    Finance/Tax2011/document2.pdf

    s3-dg.pdf

    有关分步说明,请参阅如何将文件和文件夹上传至 S3 存储桶? (在 Amazon Simple Storage Service 控制台用户指南 中)。

步骤 2:创建 IAM 用户和组

现在使用 IAM 控制台将两个 IAM 用户 (Alice 和 Bob) 添加到您的 AWS 账户。还需要创建名为 Consultants 的管理组,然后将这两个用户添加到该组。

警告

添加用户和组时,请不要为这些用户附加任何授予许可的策略。一开始,这些用户没有任何许可。在下面的部分中,您会采用递增的方式授予许可。您首先必须确保已为这些 IAM 用户分配密码。您将使用这些用户凭证来测试 Amazon S3 操作并验证这些许可按预期工作。

有关创建新 IAM 用户的分步说明,请参阅 IAM 用户指南 中的在您的 AWS 账户中创建 IAM 用户

有关创建管理组的分步指导,请参阅 IAM 用户指南 中的创建您的第一个 IAM 用户和管理员组

步骤 3:验证 IAM 用户没有任何权限

如果您使用两个浏览器,现在可以使用第二个浏览器通过 IAM 用户凭证之一登录控制台。

  1. 使用 IAM 用户登录链接 (请参阅 向 IAM 用户提供登录链接),通过任一 IAM 用户证书登录 AWS 控制台。

  2. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    验证是否有以下告知您访问已被拒绝的控制台消息。

现在开始授予用户增量许可。首先,附加组策略以授予两个用户都必须拥有的许可。

步骤 4:授予组级许可

我们希望所有的用户都可以执行以下操作:

  • 列出父账户拥有的所有存储桶。

    要执行此操作,Bob 和 Alice 必须拥有执行 s3:ListAllMyBuckets 操作的许可。

  • companybucket 存储桶中,列出根级项目、文件夹和对象。

    要执行此操作,Bob 和 Alice 必须拥有在 companybucket 存储桶上执行 s3:ListBucket 操作的许可。

现在,我们将创建可授予这些许可的策略,然后将其附加到 Consultants 组。

步骤 4.1:授予列出所有存储桶的权限

在此步骤中,您将创建一个托管策略,该策略授予用户最低权限,使他们可以列出父账户拥有的所有存储桶,然后您将此策略附加到 Consultants 组。如果您将该托管策略附加到某个用户或组,您即授予该用户或组许可,允许他们获取父 AWS 账户拥有的存储桶的列表。

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

    注意

    因为您将授予用户权限,所以应使用您的 AWS 账户证书而不是以 IAM 用户身份登录。

  2. 创建托管策略。

    1. 在左侧的导航窗格中,单击 Policies (策略),然后单击 Create Policy (创建策略)

    2. Create Your Own Policy (创建您自己的策略) 旁,单击 Select (选择)

    3. Policy Name 字段中输入 AllowGroupToSeeBucketListInTheConsole

    4. 复制下面的访问策略,然后将其粘贴到 Policy Document 字段中。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::*"] } ] }

      策略是一个 JSON 文档。在文档中,Statement 是一个对象数组,其中每个对象均使用名称值对的集合来描述许可。之前的策略描述了一个特定的许可。Action 指定访问权限的类型。在策略中,s3:ListAllMyBuckets 是预定义的 Amazon S3 操作。此操作涵盖了 Amazon S3 GET Service 操作,它可以返回已经过身份验证的发件人拥有的所有存储桶的列表。Effect 元素值决定是允许还是拒绝特定的许可。

  3. 将您创建的 AllowGroupToSeeBucketListInTheConsole 托管策略附加到 Consultants 组。

    有关附加托管策略的分步说明,请参阅 IAM 用户指南 中的通过 AWS 管理控制台使用托管策略

    您可以在 IAM 控制台中将策略文档附加到 IAM 用户和组。因为我们希望两个用户都能够列出存储桶,所以我们将该策略附加到该组。

  4. 测试许可。

    1. 使用 IAM 用户登录链接 (请参阅 向 IAM 用户提供登录链接),通过任何 IAM 用户证书登录 AWS 控制台。

    2. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

      控制台现在应该会列出所有的存储桶,但不会列出任何存储桶中的对象。

步骤 4.2:允许用户列出存储桶的根级内容

现在,我们允许所有的用户列出根级 companybucket 存储桶项目。当用户在 Amazon S3 控制台中单击公司存储桶时,该用户将能够看到此存储桶中的根级项目。

请记住,我们在使用 companybucket 进行说明。您必须使用您为此演练创建的存储桶的名称。

要了解在您单击存储桶名称时控制台向 Amazon S3 发送的请求、Amazon S3 返回的响应以及控制台如何解释响应,我们有必要进行深入的了解。

当您单击存储桶名称时,控制台会向 Amazon S3 发送 GET Bucket (列出对象) 请求。该请求包括以下参数:

  • prefix 参数,使用空字符串作为其值。

  • delimiter 参数,使用 / 作为其值。

以下是一个请求示例:

Copy
GET ?prefix=&delimiter=/ HTTP/1.1 Host: companybucket.s3.amazonaws.com Date: Wed, 01 Aug 2012 12:00:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=

Amazon S3 将返回包含以下 <ListBucketResult/> 元素的响应:

Copy
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix></Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>s3-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Finance/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private/</Prefix> </CommonPrefixes> </ListBucketResult>

键值 s3-dg.pdf 不包含 '/' 分隔符,并且 Amazon S3 在 <Contents/> 元素中返回键值。但是,我们的示例存储桶中的所有其他键值都包含 '/' 分隔符。Amazon S3 将组合这些键值,并在指定的 <CommonPrefixes/> 分隔符首次出现时,为每个不同前缀值 Development/Finance/Private/ (它们是这些键值开头的子字符串) 返回 '/' 元素。

控制台将解释该结果并将根级项目显示为三个文件夹和一个对象键。

现在,如果 Bob 或 Alice 双击 Development 文件夹,控制台会向 Amazon S3 发送 GET Bucket (列出对象) 请求并将 prefixdelimiter 参数设置为以下值:

  • prefix 参数,使用值 Development/

  • delimiter 参数,使用值 '/'

作为响应,Amazon S3 将返回对象键,该键以指定的前缀开头。

Copy
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix>Development</Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>Project1.xls</Key> ... </Contents> <Contents> <Key>Project2.xls</Key> ... </Contents> </ListBucketResult>

控制台将显示以下对象键:

现在,我们返回到授予用户许可,以便列出根级存储桶项目。要列出存储桶内容,用户需要调用 s3:ListBucket 操作的许可,如下面的策略声明中所述。为确保他们只能看见根级内容,我们将添加一个条件:用户必须在请求中指定一个空的 prefix – 即不允许他们双击任意根级文件夹。最后,我们将通过要求用户请求包含使用值 '/'delimiter 参数,添加一个条件来要求文件夹样式的访问。

Copy
{ "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }

使用 Amazon S3 控制台时,请注意当您单击一个存储桶时,控制台首先会发送 GET Bucket location 请求,以查找部署存储桶的 AWS 区域。然后,控制台会将该区域特定的终端节点用于存储桶,以便发送 GET Bucket (List Objects) 请求。因此,如果用户要使用控制台,您必须授予他们进行 s3:GetBucketLocation 操作的许可,如下面的策略声明所述:

Copy
{ "Sid": "RequiredByS3Console", "Action": ["s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::*"] }

允许用户列出根级存储桶内容的步骤

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    使用 AWS 账户证书,而不是 IAM 用户的证书登录控制台。

  2. 将附加到 Consultants 组的现有 AllowGroupToSeeBucketListInTheConsole 托管策略替换为以下策略,该策略还允许 s3:ListBucket 操作。记得将策略 Resource 中的 companybucket 替换为您的存储桶的名称。

    有关分步说明,请参阅 IAM 用户指南 中的编辑客户托管策略。按照分步说明操作时,请确保按照指示操作,以便将您的更改应用到策略附加到的所有委托人实体。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws-cn:s3:::*" ] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } } ] }
  3. 测试更新的许可。

    1. 使用 IAM 用户登录链接 (请参阅 向 IAM 用户提供登录链接) 登录 AWS 管理控制台。

      通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    2. 单击您为本演练创建的存储桶,控制台现在将显示根级存储桶项目。若您单击存储桶中的任意文件夹,您将无法查看文件夹内容,因为您尚未被授予执行这些操作的许可。

在用户使用 Amazon S3 控制台时,此项测试即成功完成,因为当您在控制台中单击存储桶时,控制台实施将发送一份请求,其中包含使用空字符串作为其值的 prefix 以及使用 '/' 作为其值的 delimiter 参数。

步骤 4.3:组策略总结

您所添加的组策略的实际结果是授予 IAM 用户 Alice 和 Bob 以下最低许可:

  • 列出父账户拥有的所有存储桶。

  • 查看 companybucket 存储桶中的根级项目。

然而,许多操作用户仍然无法执行。让我们授予用户特定的许可,如下所述:

  • 允许 Alice 在 Development 文件夹中获取和放置对象。

  • 允许 Bob 在 Finance 文件夹中获取和放置对象。

对于用户特定的许可,您需要将策略附加到特定的用户,而不是附加到组。在以下部分中,您将授予 Alice 在 Development 文件夹中工作的许可。您可以重复这些步骤,以便授予 Bob 相似的许可,使其可在 Finance 文件夹中工作。

步骤 5:授予 IAM 用户 Alice 特定的权限

现在,我们将其他许可授予 Alice,以使她能够查看 Development 文件夹中的内容,并可以在该文件夹中获取和放置对象。

步骤 5.1:授予 IAM 用户 Alice 列出 Development 文件夹内容的权限

要允许 Alice 列出 Development 文件夹内容,您必须对 Alice 应用一个策略,以授予她对 companybucket 存储桶执行 s3:ListBucket 操作的权限,但请求应包含前缀 Development/。因为我们希望只对用户 Alice 应用此策略,所以我们将使用内联策略。有关内联策略的更多信息,请参阅 IAM 用户指南 中的托管策略与内联策略

  1. 登录 AWS 管理控制台 并通过 https://console.amazonaws.cn/iam/ 打开 IAM 控制台。

    使用 AWS 账户证书,而不是 IAM 用户的证书登录控制台。

  2. 创建内联策略以授予用户 Alice 列出 Development 文件夹内容的权限。

    1. 在左侧导航窗格中,单击 Users

    2. 单击用户名 Alice。

    3. 在用户详细信息页面上,选择 Permissions 选项卡,然后展开 Inline Policies 部分。

    4. 选择 click here (或 Create User Policy)。

    5. 单击 Custom Policy (自定义策略),然后单击 Select (选择)

    6. Policy Name 字段中为策略输入一个名称。

    7. 将以下策略复制到 Policy Document 字段中。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] }
  3. 测试对 Alice 的许可的更改:

    1. 使用 IAM 用户登录链接 (请参阅 向 IAM 用户提供登录链接) 登录 AWS 管理控制台。

    2. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    3. 在 Amazon S3 控制台中,验证 Alice 能否可以查看存储桶中 Development/ 文件夹中的对象列表。

      当用户单击 /Development 文件夹以查看其中的对象列表时,Amazon S3 控制台会向 Amazon S3 发送前缀为 /DevelopmentListObjects 请求。由于用户已被授予许可,可以查看使用前缀 Development 和分隔符 '/' 的对象列表,因此 Amazon S3 将返回使用键前缀 Development/ 的对象列表,并且控制台将显示该列表。

步骤 5.2:授予 IAM 用户 Alice 在 Development 文件夹中获取和放置对象的权限

要使 Alice 能够在 Development 文件夹中获取和放置对象,她需要用于调用 s3:GetObjects3:PutObject 操作的许可。如果请求包含使用值 Development/prefix 参数,可使用下面的策略声明授予这些许可。

Copy
{ "Sid":"AllowUserToReadWriteObjectData", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws-cn:s3:::companybucket/Development/*"] }
  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    使用 AWS 账户证书,而不是 IAM 用户的证书登录控制台。

  2. 编辑您在上一步中创建的内联策略。

    1. 在左侧导航窗格中,单击 Users

    2. 单击用户名 Alice。

    3. 在用户详细信息页面上,选择 Permissions 选项卡,然后展开 Inline Policies 部分。

    4. 单击上一步所建策略的名称旁的 Edit Policy

    5. 将下面的策略复制到 Policy Document 字段中,替换现有策略。

      Copy
      { "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws-cn:s3:::companybucket/Development/*"] } ] }
  3. 测试更新的策略:

    1. 使用 IAM 用户登录链接 (请参阅 向 IAM 用户提供登录链接) 登录 AWS 管理控制台。

    2. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    3. 在 Amazon S3 控制台中,验证 Alice 现在是否可在 Development 文件夹中添加和下载对象。

步骤 5.3:显式拒绝 IAM 用户 Alice 对存储桶中其他任何文件夹的权限

用户 Alice 现在可以列出 companybucket 存储桶中的根级内容。她还可以在 Development 文件夹中获取和放置对象。如果您确实想要严格控制访问许可,可以显式拒绝 Alice 对存储桶中其他任何文件夹的访问。若存在任何其他策略 (存储桶策略或 ACL),而且它们授予了 Alice 访问存储桶中任何其他文件夹的权限,此显式拒绝将覆盖这些许可。

您可以向用户 Alice 策略添加以下声明:要求 Alice 发送到 Amazon S3 的所有请求均包含 prefix 参数,该参数的值可为 Development/* 或空字符串。

Copy
{ "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*"] }, "Null" : {"s3:prefix":false } } }

请注意,Condition 数据块中存在两个条件表达式。使用逻辑 AND 组合这些条件表达式的结果。如果两种条件均为真,组合条件的结果才为真。

  • Null 条件表达式确保来自 Alice 的请求包含 prefix 参数。

    prefix 参数要求类似文件夹的访问权限。如果您发送的请求没有包含 prefix 参数,Amazon S3 将返回所有的对象键。

    如果请求包括值为空的 prefix 参数,该表达式的值将计算为真,因此整个 Condition 的值也将计算为真。您必须允许将空字符串作为 prefix 参数的值。您可以回顾前面讨论的内容,采用与前面讨论中控制台相同的方式,通过允许空字符串使 Alice 能够检索根级存储桶项目。有关更多信息,请参阅 步骤 4.2:允许用户列出存储桶的根级内容

  • StringNotLike 条件表达式确保当指定了 prefix 参数的值并且不是 Development/* 时,请求将失败。

根据上一节中的步骤,再次更新您为用户 Alice 创建的内联策略。

将下面的策略复制到 Policy Document 字段中,替换现有策略。

Copy
{ "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws-cn:s3:::companybucket/Development/*"] }, { "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*"] }, "Null" : {"s3:prefix":false } } } ] }

步骤 6:授予 IAM 用户 Bob 特定的权限

现在,您想要授予 Bob 访问 Finance 文件夹的许可。遵循您之前在授予 Alice 许可时所采用的步骤,但是将 Development 文件夹替换为 Finance 文件夹。如需分步指导,请参阅 步骤 5:授予 IAM 用户 Alice 特定的权限

步骤 7:确保 Private 文件夹的安全

在此示例中,您有两个用户。您已授予了所需最低组级许可,仅当确实需要单个用户级别的许可时才授予用户级许可。此方法有助于最大程度地降低管理许可的工作量。随着用户数的增加,管理许可工作将变得极为繁重。例如,在本示例中您不希望任意用户访问 Private 文件夹内的内容。如何确保您不会在无意中授予用户访问该文件夹的许可?您可以添加一个策略,显式拒绝对该文件夹的访问。显式拒绝将覆盖任何其他许可。要确保 Private 文件夹仍保持为私有,您可以向组策略添加以下两个拒绝声明:

  • 添加以下声明以显式拒绝对 Private 文件夹 (companybucket/Private/*) 中的资源执行任何操作。

    Copy
    { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws-cn:s3:::companybucket/Private/*"] }
  • 若请求指定了 Private/ 前缀,您也可以拒绝列出对象操作所需的许可。在控制台中,如果 Bob 或 Alice 双击 Private 文件夹,此策略将导致 Amazon S3 返回错误响应。

    Copy
    { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws-cn:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } }

将 Consultants 组策略替换为包含了上述拒绝声明的更新策略。应用更新的策略后,组中的用户均无法访问存储桶中的 Private 文件夹。

  1. 登录 AWS 管理控制台并通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

    使用 AWS 账户证书,而不是 IAM 用户的证书登录控制台。

  2. 将附加到 Consultants 组的现有 AllowGroupToSeeBucketListInTheConsole 托管策略替换为下面的策略。记得将策略中的 companybucket 替换为您的存储桶的名称。

    有关说明,请参阅 IAM 用户指南 中的编辑客户托管策略。按照说明操作时,请确保按照指示操作,以便将您的更改应用到策略附加到的所有委托人实体。

    Copy
    { "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::*"] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws-cn:s3:::companybucket"], "Condition":{ "StringEquals":{"s3:prefix":[""]} } }, { "Sid": "RequireFolderStyleList", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws-cn:s3:::*"], "Condition":{ "StringNotEquals":{"s3:delimiter":"/"} } }, { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws-cn:s3:::companybucket/Private/*"] }, { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws-cn:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } } ] }

清除

要进行清除,请转到 IAM 控制台并删除用户 Alice 和 Bob。有关分步说明,请转到 IAM 用户指南 中的删除 IAM 用户

为了确保不再继续占用存储空间,您还应该删除您为本演练创建的对象和存储桶。

相关资源