如何解决来自其他 AWS 账户的 IAM 用户尝试访问我的 Amazon S3 存储桶时出现的“Access Denied”(访问被拒绝)错误?

3 分钟阅读
0

我的 Amazon Simple Storage Service (Amazon S3) 存储桶策略可授予对其他 AWS 账户的完全访问权限。但是,当来自该账户的 AWS Identity and Access Management (IAM) 用户尝试访问我的存储桶时,他们收到“Access Denied”(访问被拒绝)错误。

简短描述

如果您的存储桶策略已授予对其他账户的访问权限,则跨账户用户可能会因以下原因收到 Access Denied(访问被拒绝)错误:

  • 用户的 IAM 策略未授予对存储桶的访问权限。
  • 您已使用 AWS Key Management Service (AWS KMS) 加密对象,用户无权访问 AWS KMS 密钥。
  • 存储桶策略或 IAM 策略中的拒绝语句会阻止用户的访问。
  • Amazon Virtual Private Cloud (Amazon VPC) 端点策略会阻止对存储桶的访问。
  • AWS Organizations 服务控制策略 (SCP) 会阻止对存储桶的访问。
  • 对象不属于拥有存储桶的账户。
  • 您对 Amazon S3 存储桶已启用 Requester Pays
  • 您传递的一项会话策略已阻止对存储桶的访问。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

用户的 IAM 策略未授予对存储桶的访问权限

对于跨账户访问,请确保在用户账户的 IAM 策略和您账户的存储桶策略中授予存储桶访问权限。

要向用户账户中的 IAM 策略添加存储桶权限,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择无法访问存储桶的 IAM 用户或角色。
  3. Permissions policies(权限策略)中,展开每个策略以查看其 JSON 策略文档。
  4. 在包含存储桶名称的 JSON 策略文档中,确认策略允许对存储桶执行正确的 S3 操作。
  5. 如果 IAM 用户或角色未授予对存储桶的访问权限,请添加策略来授予正确的权限。
    以下示例 IAM 策略向用户授予从 DOC-EXAMPLE-BUCKETGetObject 请求中下载对象的访问权限:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "ExampleStmt",
                "Action": "s3:GetObject",
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
                ]
            }
        ]
    }

**注意:**如果您使用实例配置文件代入角色,请确保您的策略具有正确的权限。

您已使用 AWS KMS 加密对象

如果 IAM 策略和存储桶策略都授予跨账户访问权限,请检查存储桶是否使用 AWS KMS 进行默认加密。或者,检查对象的属性是否使用了 AWS KMS 加密。如果您已使用 KMS 密钥加密对象,则用户还必须拥有使用该密钥的权限。

要授予 IAM 用户下载和上传到存储桶以及使用 AWS KMS 密钥的权限,请完成以下步骤:

  1. 编辑 KMS 密钥策略以添加以下语句:

    {
        "Sid": "ExampleStmt",
        "Action": [
            "kms:Decrypt",
            "kms:GenerateDataKey"
        ],
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::111122223333:user/Jane"
        },
        "Resource": "*"
    }

    **注意:**将示例 ARN 替换为您的主体的 ARN。

  2. 如果 AWS KMS 密钥属于 IAM 用户账户,则无需更新密钥策略。如果 AWS KMS 密钥属于您的账户,则您必须更新 IAM 用户的权限才能添加以下 IAM 策略语句:

    {
        "Sid": "KMSAccess",
        "Action": [
            "kms:Decrypt",
            "kms:GenerateDataKey"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    }

    **注意:**将示例 KMS 密钥的 ARN 替换为您的 KMS 密钥的 ARN。

有关详细信息,请参阅为什么跨账户用户在尝试访问我使用 AWS KMS 客户自主管理型密钥加密的 S3 对象时会收到 Access Denied(访问被拒绝)错误?

策略中的 Deny 语句会阻止用户的访问

检查存储桶策略和用户的 IAM 策略,查看是否有任何显式拒绝用户访问存储桶的语句。

要检查存储桶策略,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 从存储桶列表中选择您要检查其策略的存储桶。
  3. 选择 Permissions(权限)选项卡。
  4. Bucket policy(存储桶策略)中,检查是否存在带有 "Effect": "Deny" 的语句。
  5. 修改存储桶策略以删除任何拒绝用户访问存储桶的任何 "Effect": "Deny" 语句。

要检查用户的 IAM 策略,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择无法访问存储桶的 IAM 用户或角色。
  3. Permissions policies(权限策略)中,展开每个策略以查看 JSON 策略文档。
  4. 在与 S3 存储桶相关的 JSON 策略文档中,检查是否有包含 "Effect": "Deny" 的语句。
  5. 修改用户的 IAM 权限策略以删除拒绝用户访问存储桶的 "Effect": "Deny" 语句。

VPC 端点策略阻止对存储桶的访问权限

如果用户使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例通过 VPC 端点访问存储桶,请检查 VPC 端点策略。确认 VPC 端点策略包含访问 S3 存储桶的正确权限。

以下 VPC 端点策略示例允许访问 DOC-EXAMPLE-BUCKET

{
    "Id": "Policy1234567890123",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1234567890123",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Principal": "*"
        }
    ]
}

**警告:**元素 "Principal": "*" 授予使用 VPC 端点的每个人对存储桶的访问权限。确保根据您的用例限制 Principal(主体)值的范围。

Organizations SCP 阻止对存储桶的访问权限

如果用户账户使用 Organizations,请检查 SCP 中是否有阻止访问存储桶的 Deny 语句。

以下示例策略明确拒绝访问 Amazon S3:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

对象不属于拥有存储桶的账户

默认情况下,上传对象的账户拥有该对象,即使另一个账户拥有该存储桶也是如此。存储桶的权限不会自动应用于其他账户拥有的对象。

要解决来自 S3 对象所有权的 Access Denied(访问被拒绝)错误,请遵循以下最佳实践:

您已开启 Requester Pays

如果您为存储桶开启了 Requester Pays,则来自其他账户的用户必须指定 x-amz-request-payer 参数。

用户必须执行以下操作:

  • 对于 DELETEGETHEADPOSTPUT 请求,在标头中包含 x-amz-request-payer : requester
  • 对于签名 URL,在请求中包含 x-amz-request-payer=requester
  • 对于 AWS CLI 命令,包含 --request-payer 参数:
    aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester
    

会话策略已阻止对存储桶的访问

确保您传递的会话策略不会阻止对 S3 存储桶的访问。

相关信息

如何对来自 Amazon S3 的 403 Access Denied(访问被拒绝)错误进行故障排除?

有权向我的 Amazon S3 存储桶添加对象的用户收到 Access Denied(访问被拒绝)错误。为什么?

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