跳至内容

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

3 分钟阅读
0

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

解决方法

如果 IAM 用户和存储桶属于同一 AWS 账户,请使用 IAM 策略向用户授予对存储桶文件夹的访问权限。在 IAM 策略中授予访问权限时,无需更新存储桶策略。但是,如果存储桶策略明确拒绝 IAM 用户访问文件夹,则必须更新存储桶策略。

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

您可以在 IAM 策略中向单个用户或多个用户授予访问权限。对于多个用户,策略可以包含组或 AWS IAM Identity Center ID。

向单个用户授予访问权限

要仅向单个用户授予对其文件夹的访问权限,请创建 IAM 策略

策略示例:

{
  "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 以允许用户列出属于其账户的存储桶,并在控制台中导航到该存储桶。
  • 使用 AllowStatement2A 以允许用户列出 DOC-EXAMPLE-BUCKET 中的文件夹,并在控制台中导航到该文件夹。
  • 使用 AllowStatement3 以允许用户列出 DOC-EXAMPLE-BUCKET/home/Username 文件夹中的内容。
  • 使用 AllowStatement4A 以仅允许在 DOC-EXAMPLE-BUCKET/home/Username 文件夹中执行所有操作,例如读取、写入和删除权限。

使用组策略向多个用户授予访问权限

使用策略变量为多个用户创建组策略。

使用 ${aws:username} 策略变量的存储桶策略示例:

{
  "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:username 键,并返回用户的友好名称,例如“Adele”或“David”。 当 aws:username 值对于某个特定 IAM 角色可能无效时,您也可以使用唯一 ID。有关详细信息,请参阅主体键值

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

使用 AWS IAM Identity Center 向多个用户授予访问权限

您可以根据 AWS IAM Identity Center 主体控制对 S3 存储桶文件夹的访问权限。IAM Identity Center 目录中的每个用户都有一个唯一的用户 ID。对于要限制文件夹访问权限的每个用户,请使用 ${identitystore:UserId} 策略变量。

创建 S3 文件夹时,请使用与 IAM Identity Center 目录中的用户 ID 相对应的文件夹名称。例如,用户 John 有一个唯一的用户 ID 1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c。要管理 John,请在 S3 存储桶中为 John 创建一个名为 /home/1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c 的文件夹。要查找用户的用户 ID,请在 IAM Identity Center 控制台中导航到每个用户,或者使用 DescribeUser API。

以下示例 IAM 策略使用了 ${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}/*"
      ]
    }
  ]
}

相关信息

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

示例: 适用于存储桶操作的 Amazon S3 条件键

使用 IAM 策略模拟器测试 IAM 策略

AWS 官方已更新 10 个月前