为什么尽管我的桶策略授予了对另一个账户的完全访问权限,来自该 AWS 账户的 IAM 用户仍然会遭遇 Access Denied(访问被拒绝)错误?

3 分钟阅读
0

我的 Amazon Simple Storage Service(Amazon S3)桶的策略授予了对另一个 AWS 账户的完全访问权限。但是,当来自该账户的 AWS Identity and Access Management(AWS IAM)用户尝试访问我的桶时,他们会遭遇 Access Denied(访问被拒绝)错误。

简短描述

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

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

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新版本

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

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

按照以下步骤在账户 A 中检查用户的 IAM 策略:

1.    打开 IAM 控制台

2.    在控制台中,打开无法访问桶的 IAM 用户或角色。

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

4.    在 JSON 策略文档中,寻找含有桶名称的策略。然后,确认这些策略允许对桶执行正确的 S3 操作。

5.    如果 IAM 用户或角色未授予对桶的访问权限,则添加一项策略来授予正确的权限。例如,以下 IAM 策略授予了一项用户访问权限,允许从 DOC-EXAMPLE-BUCKET 下载对象 (s3: GetObject):

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

该对象由 AWS KMS 加密,用户无权访问 AWS KMS 密钥

如果 IAM 策略(账户 A)和桶策略(账户 B)都授予跨账户存取权限,则使用 AWS KMS 检查桶的默认加密。或者,检查对象的属性以了解 AWS KMS 加密。如果对象由 AWS KMS 密钥加密,则用户还必须拥有使用该密钥的权限。

要授予 IAM 用户在使用 KMS 密钥进行加密时下载和上传到桶的权限,请执行以下步骤:

1.    编辑 KMS 密钥策略以添加类似于以下内容的语句:

注意:输入 IAM 用户的 Amazon 资源名称(ARN)作为主体

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

2.    如果 KMS 密钥与 IAM 用户属于同一个账户,则无需更新密钥策略。如果 KMS 密钥与 IAM 用户属于不同的账户,则您还必须更新 IAM 用户的权限。添加一条类似于以下内容的 IAM 策略语句:

注意:输入 KMS 密钥的 ARN 作为资源

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

桶策略或 IAM 策略中的拒绝语句正在阻止用户的访问

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

请按照以下步骤检查桶策略:

1.    打开 Amazon S3 控制台

2.    从桶列表中,打开包含要检查的桶策略的桶。

3.    选择 Permissions(权限)选项卡。

4.    选择 Bucket policy(桶策略)。

5.    寻找含有 "Effect": "Deny" 的语句。

6.    修改桶策略以编辑或删除所有含 "Effect": "Deny" 的语句,正是这些语句在拒绝用户对桶的访问。

请按照以下步骤检查用户的 IAM 策略:

1.    打开 IAM 控制台

2.    在控制台中,打开无法访问桶的 IAM 用户或角色。

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

4.    在 JSON 策略文档中,寻找与 S3 桶相关且其语句中含有 "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 端点的每个人对桶的访问权限。确保根据您的用例限制主体值的范围。

AWS Organizations 服务控制策略正在阻止对桶的访问

如果用户的账户已启用 AWS Organizations,请检查服务控制策略以确保允许访问 Amazon S3。例如,以下策略显式拒绝了对 Amazon S3 的访问,会导致 Access Denied(访问被拒绝)错误:

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

有关 AWS Organizations 功能的详细信息,请参阅启用组织中的所有功能

该对象不属于拥有该桶的 AWS 账户

默认情况下,S3 对象归上传该对象的 AWS 账户所有。即使桶归另一个账户所有,也是如此。当某个对象归其他账户所有时,桶的权限不会自动应用于该对象。

要解决由对象所有权导致的 Access Denied(访问被拒绝)错误,请尝试以下解决办法:

$ aws s3api put-object-acl --bucket examplebucket --key keyname --acl bucket-owner-full-control

**注意:**要访问对象,对象拥有者必须向桶拥有者显式授予访问权限。因此,使用对象拥有者帐户来运行这些命令。

您为桶启用了 Requester Pays

如果您为您的桶启用了 Requester Pays,则来自其他账户的用户在向您的桶发送请求时必须指定 request-payer 参数。否则,这些用户会遭遇 Access Denied(访问被拒绝)错误。

要解决此错误,请执行以下操作:

  • 对于 DELETE、GET、HEAD、POST 和 PUT 请求,在标头中包含 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(访问被拒绝)错误?

为什么跨账户用户在尝试访问我的由自定义 AWS KMS 密钥加密的桶时会遇到 Access Denied(访问被拒绝)错误?

AWS 官方
AWS 官方已更新 1 年前