为什么我无法访问 Amazon S3 桶中的特定文件夹或文件?

2 分钟阅读
0

我无法访问我的 Amazon Simple Storage Service(Amazon S3)桶中的特定前缀或对象,但我可以访问该桶中的其他数据。

简短描述

请检查任何拒绝您访问该前缀或对象的设置中的以下权限:

  • 前缀或对象的所有权
  • 桶策略中的限制
  • 您的 AWS Identity and Access Management(IAM)用户策略中的限制
  • 对 AWS Key Management Service(AWS KMS)加密的对象的权限

此外,还请注意以下访问条件:

  • 如果使用 AWS KMS 密钥加密对象,则只有加密该对象的 AWS 账户才能读取该对象。
  • 如果定义了权限边界和会话策略,则可能会影响请求者的最大权限。因此,也可能会影响对象访问。
  • 限制可能会在其他策略中指定,例如 VPC 端点策略服务控制策略(SCP)。因此,请检查这些策略并相应进行更新。
  • 您还可以使用 Amazon S3 对象所有权控制上传对象的所有权。如果将对象所有权设为 BucketOwnerPreferred,则具有 bucket-owner-full-control 预装 ACL 的账户写入的对象可以转移至桶拥有者。

解决方法

前缀或对象的所有权

默认情况下,S3 对象归上传此对象的 AWS 账户所有。即使桶由另一个账户拥有,也是如此。如果其他账户向您的桶上传对象,请执行以下步骤以获取您无法访问的对象或前缀的权限:

  1. 运行此 AWS 命令行界面(AWS CLI)命令以获取您账户的 Amazon S3 规范 ID:

    aws s3api list-buckets --query Owner.ID
  2. 运行此命令以获取您无法访问的对象所属账户的 Amazon S3 规范 ID:

    aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
  3. 如果规范 ID 不匹配,则您(桶拥有者)不拥有该对象。对于单个对象,对象拥有者可以运行 put-object-acl 命令,授予您完全控制权限:

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

    对于前缀中的对象,对象拥有者必须在操作过程中重新复制前缀,并授予您对相关对象的完全控制权限。例如,对象拥有者可以使用 --acl bucket-owner-full-control 参数运行此 cp 命令:

    aws s3 cp s3://DOC-EXAMPLE-BUCKET/abc/ s3://DOC-EXAMPLE-BUCKET/abc/ --acl bucket-owner-full-control --recursive --storage-class STANDARD

    提示: 您可以使用桶策略,要求其他账户向您授予对他们上传到您的桶的对象的所有权。

桶策略中的限制

  1. 打开 Amazon S3 控制台

  2. 从桶列表中打开您要审查其策略的桶。

  3. 选择权限选项卡。

  4. 选择桶策略

  5. 搜索带有 "Effect": "Deny" 的语句。然后审查提及您无法访问的前缀或对象的语句。例如,下面的桶策略将拒绝所有人访问 DOC-EXAMPLE-BUCKET 中的 abc/* 前缀:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "StatementPrefixDeny",
          "Effect": "Deny",
          "Principal": {
            "AWS": "*"
          },
          "Action": "s3:*",
          "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*"
        }
      ]
    }
  6. 修改桶策略以编辑或删除任何错误拒绝您访问该前缀或对象的任何 "Effect": "Deny" 语句。

您的 IAM 用户策略中的限制

  1. 打开 IAM 控制台

  2. 在控制台中,打开您用来访问该前缀或对象的 IAM 用户或角色。

  3. 在 IAM 用户或角色的权限选项卡中,展开每个策略查看其 JSON 策略文档。

  4. 在 JSON 策略文档中,搜索与 Amazon S3 访问相关的策略。然后,在这些策略中搜索任何阻止您访问该前缀或对象的 "Effect": "Deny" 语句。

    例如,以下 IAM 策略含有一个 "Effect": "Deny" 语句,它会阻止该 IAM 身份访问 DOC-EXAMPLE-BUCKET 中的前缀 abc/*。此外,该策略还含有一个 "Effect": "Allow" 语句,它会授予对 DOC-EXAMPLE-BUCKET 的访问权限。尽管该 allow 语句适用于整个桶,但显式拒绝语句阻止了该 IAM 身份访问前缀 abc/*

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "StatementPrefixDeny",
          "Effect": "Deny",
          "Action": "s3:GetObject",
          "Resource": [
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*"
          ]
        },
        {
          "Sid": "StatementFullPermissionS3",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": [
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
          ]
        }
      ]
    }
  5. 修改策略以编辑或删除错误拒绝您访问该前缀或对象的任何 "Effect": "Deny" 语句。

对 AWS KMS 加密的对象的权限

如果某个对象使用了 AWS KMS 密钥进行加密,则您同时需要该对象和该密钥的权限。检查您无法访问该对象的原因是否是因为您需要 AWS KMS 密钥的权限:

  1. 使用 Amazon S3 控制台查看您无法访问的某个对象的属性。查看对象的加密属性。

  2. 如果对象使用自定义 AWS KMS 密钥进行加密,请查看密钥政策。确认密钥政策允许您的 IAM 身份执行以下操作:

    "Action": ["kms:Decrypt"]
  3. 如果您的 IAM 身份缺少以下任何操作的权限,请修改密钥政策以授予缺失的权限。

**重要事项:**如果您的 IAM 身份和 AWS KMS 密钥属于不同的账户,请进行检查以确保您拥有适当的权限。您的 IAM 和密钥政策都必须向您授予所需 AWS KMS 操作的权限。

相关信息

为何我无法访问由其他 AWS 账户上传到我的 Amazon S3 桶的对象?

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

当我从 Amazon S3 下载 KMS 加密的对象时,我是否需要指定 AWS KMS 密钥?

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