我如何向用户授予对我的 Amazon S3 桶中的特定文件夹的访问权限?

3 分钟阅读
0

我想限制 AWS Identity and Access Management(IAM)用户仅访问 Amazon Simple Storage Service(Amazon S3)中的特定文件夹。

解决方案

如果用户和桶属于同一 AWS 账户,使用 IAM policy 向用户授予对桶文件夹的访问权限。如果 IAM policy 授予访问权限,则您无需更新桶策略。

注意: 如果 Amazon S3 桶策略明确拒绝 IAM 用户访问文件夹,您必须更新桶策略。

如果 IAM 用户和 S3 桶属于不同 AWS 账户,请同时在 IAM policy 和桶策略中授予访问权限。有关详细信息,请参阅如何向另一个 AWS 账户中的用户授予将对象上传到我的 Amazon S3 存储桶的权限?

单用户策略

以下示例 IAM policy 仅向名为 David 的用户授予对其文件夹(/home/David)的完全访问权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowStatement1",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Sid": "AllowStatement2A",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "home/",
            "home/David"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowStatement3",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "home/David/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowStatement4A",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/David/*"
      ]
    }
  ]
}

此策略包括以下语句:

  • **AllowStatement1:**允许用户列出属于其 AWS 账户的桶。此权限允许用户在控制台中导航到桶。
  • **AllowStatement2A:**允许用户列出 DOC-EXAMPLE-BUCKET 中的文件夹。此权限允许用户在控制台中导航到文件夹。
  • **AllowStatement3:**允许用户列出 DOC-EXAMPLE-BUCKET/home/David 文件夹中的内容。
  • **AllowStatement4A:**仅允许在 DOC-EXAMPLE-BUCKET/home/David 文件夹内执行所有操作,如读取、写入和删除权限。

多用户策略

在某些情况下,您在编写策略时不知道资源的确切名称。例如,假设您希望允许每个用户在 Amazon S3 桶中有自己的对象。这时可以使用策略变量来创建适用于多个用户的组策略,而不是为每个用户创建单独的策略。策略变量让您能够在策略中指定占位符。当您向 AWS 发出请求时,请求中的值会在策略完成评估时替换占位符。

以下示例显示了使用策略变量 ${aws:username} 的 Amazon S3 桶的策略:

**注意:**本文使用 aws:username 键,返回用户的易记名称,如“Adele”或“David”。 此值从您在创建 IAM 用户时提供的用户名获取。在某些情况下,最好使用相应的全局唯一值。例如,当您使用 IAM 角色时,aws:username 值可能对该 IAM 实体无效。有关详细信息,请参阅主体键值

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "home/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "home/${aws:username}/*",
            "home/${aws:username}"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${aws:username}/*"
      ]
    }
  ]
}

在本策略中,当用户向 AWS 发出请求时,请求者的名字将替换变量。例如,当 David 发出请求时,${aws:username} 会解析为 David

**注意:**IAM 用户可以在父级列出所有前缀,如 DOC-EXAMPLE-BUCKET/。用户可以在任何图形用户界面(GUI)客户端导航到主目录。如果您未在父级提供列表操作,则必须使用命令行界面直接访问特定文件夹。

根据 IAM Identity Center 用户主体限制访问权限

您可以基于 AWS IAM Identity Center(AWS 单点登录的继任者)用户主体控制对 S3 桶文件夹的访问权限。IAM Identity Center 目录中的每个用户都有一个唯一的用户 ID。对于要限制文件夹访问权限的每个用户,请使用策略变量 ${identitystore:UserId}。**注意:**创建 S3 文件夹时,请确保文件夹名称与 IAM Identity Center 目录中的用户 ID 相对应。

例如,假设 IAM Identity Center 目录中有一个用户(“John”),其对应的唯一用户 ID 为 1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c。要管理此用户,请在 S3 桶中为 John 创建一个同名文件夹:/home/1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c。要查找用户的用户 ID,请在 IAM Identity Center 控制台中导航到每个用户,或者使用 DescribeUser API。在以下示例中,IAM policy 使用了 ${identitystore:UserId} 变量:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "home/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "home/${identitystore:UserId}/*",
            "home/${identitystore:UserId}"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${identitystore:UserId}/*"
      ]
    }
  ]
}

相关信息

AWS Policy Generator

使用用户策略控制对桶的访问

Amazon S3 条件键示例

AWS 官方
AWS 官方已更新 7 个月前