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

上次更新日期:2020 年 11 月 5 日

我想授予 AWS Identity and Access Management (IAM) 访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶中特定文件夹的权限。该如何操作?

解决方案

如果 IAM 用户和 S3 存储桶属于同一个 AWS 账户,则可以使用 IAM 策略向该用户授予对特定存储桶文件夹的访问权限。只要存储桶策略没有明确拒绝用户访问文件夹,如果 IAM 策略授予访问权限,则无需更新存储桶策略。 您可以将 IAM 策略添加到单个 IAM 用户,也可以将 IAM 策略附加到多个用户可以切换到的 IAM 角色

如果 IAM 身份(用户或角色)和 S3 存储桶属于不同的 AWS 账户,则必须同时授予对 IAM 策略和存储桶策略的访问权限。有关跨账户访问的更多信息,请参阅如何授予其他 AWS 账户中的用户将对象上传到我的 Amazon S3 存储桶的权限?

以下示例 IAM 策略允许用户使用 Amazon S3 控制台下载文件夹 DOC-EXAMPLE-BUCKET/media 中的对象。该策略包含以下语句:

  • AllowStatement1 允许用户列出属于其 AWS 账户的存储桶。用户需要此权限才能使用控制台导航到存储桶。
  • AllowStatement2A 允许用户列出 DOC-EXAMPLE-BUCKET 中的文件夹,用户需要能够使用控制台导航到该文件夹。此语句还允许用户使用控制台搜索前缀 media/
  • AllowStatement3 允许用户列出 DOC-EXAMPLE-BUCKET/media 中的内容。
  • AllowStatement4A 允许用户从文件夹 DOC-EXAMPLE-BUCKET/media 下载对象 (s3:GetObject)。
{
 "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":["","media"]}}
    },
  {
     "Sid": "AllowStatement3",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
     "Condition":{"StringLike":{"s3:prefix":["media/*"]}}
    },    
   {
     "Sid": "AllowStatement4A",
     "Effect": "Allow",
     "Action": ["s3:GetObject"],
     "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/media/*"]
   }
 ]
}

再例如,以下 IAM 策略允许用户使用控制台或编程方法(如 AWS 命令行界面 (AWS CLI) 或 Amazon S3 API)下载和上传对象到文件夹 DOC-EXAMPLE-BUCKET/media。与以前的 IAM 策略的区别在于:

  • AllowStatement2B 包括 "s3:delimiter":["/"],它指定正斜杠字符 (/) 作为对象路径中文件夹的分隔符。如果用户使用 AWS CLI 或 Amazon S3 API 提出请求,则最佳做法是指定分隔符。
  • AllowStament4b 允许用户下载 ( S3:GetObject ) 并将 (s3:putoBject) 对象上传到文件夹 DOC-EXAMPLE-BUCKET/media
{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowStatement1",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowStatement2B",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
     "Condition":{"StringEquals":{"s3:prefix":["","media"],"s3:delimiter":["/"]}}
    },
  {
     "Sid": "AllowStatement3",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
     "Condition":{"StringLike":{"s3:prefix":["media/*"]}}
    },
   {
     "Sid": "AllowStatement4B",
     "Effect": "Allow",
     "Action": ["s3:GetObject", "s3:PutObject"],
     "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/media/*"]
   }
 ]
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?