跳至内容

如何排查在访问 Amazon DynamoDB 表时出现的 AccessDenieException 错误?

3 分钟阅读
0

我尝试访问 Amazon DynamoDB 表,但遇到了 AccessDenieException 错误。

简短说明

遇到这个错误,可能是由于以下原因:

  • 用于访问 DynamoDB 表的 AWS Identity and Access Management (IAM) 角色没有所需的权限。
  • 对 DynamoDB 表的访问在组织级别受到了限制。
  • 与适用于 DynamoDB 的 Amazon Virtual Private Cloud (Amazon VPC) 端点相关联的策略限制了该操作。
  • 您激活了多重身份验证 (MFA),但在访问该表时没有使用 MFA 进行登录。
  • 您使用了客户管理型密钥或 AWS 托管式密钥来保护 DynamoDB 表。
  • 您无法访问适用于 DynamoDB 的 Amazon CloudWatch Contributor Insights。

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

解决方法

IAM 角色没有所需的权限

当您创建 DynamoDB 表时,应向用来访问该表的 IAM 角色授予所需的权限。您可以将策略附加到 IAM 用户、组或角色,以授予所需的权限。有关更多信息,请参阅对 Amazon DynamoDB 使用基于身份的策略
要排查 IAM 权限 API 调用失败的问题,请使用 AWS CLI 脚本:

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";>   aws cloudtrail lookup-events --start-time "2022-08-04T13:23:00Z" --end-time "2022-08-04T13:27:00Z" --query "Events[*].CloudTrailEvent" --output text \
>     | jq -r ". | select(.userIdentity.arn == \"your-ARN\" and .eventType == \"AwsApiCall\" and .errorCode != null
>     and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
>     | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
> ) | column -t -s'",'

your-ARN 替换为您所用资源的 IAM ARN

**注意:**AWS CLI 脚本需要使用 jq 命令行 JSON 处理器。有关教程和下载说明,请参阅 JSON 输出格式

对于使用 yum 软件包的发行版,请运行以下命令:

$ sudo yum install jq

此命令的输出类似于如下内容:

Time                 Identity ARN                           Event ID                             Service                Action     Error Message
2022-08-04T13:24:14Z arn:aws:iam::111122223333:user/article 42f420fe-ef06-43be-98a6-d5a0a90d7b4c dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* with an explicit deny in an identity-based policy
2022-08-04T13:51:22Z arn:aws:iam::111122223333:user/article b174e4e1-94a7-403e-a15f-1234aec796a6 dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* because no identity-based policy allows the dynamodb:ListTables action

第一条消息表示,您无法执行 ListTables 操作,因为您已将某个拒绝执行该操作的权限附加到用户 111122223333 上。第二条消息表示,任何基于身份的策略都不允许执行 dynamodb:ListTables 操作。

以下最佳实践有助于确保 IAM 角色具有访问 DynamoDB 表所需的权限:

  • 请勿在信任策略的任何 DENY 语句中包含 IAM 角色。
  • 应在信任策略的 ALLOW 语句中包含 IAM 角色。
  • 确保 ALLOW 语句中指定的所有 IAM 条件均受 sts:AssumeRole API 操作的支持。
  • 如果使用 AWS CLI 来访问 DynamoDB 表,请使用正确的访问密钥 ID 和秘密访问密钥。

有关更多信息,请参阅如何获取数据以协助排查 IAM 权限访问被拒或未经授权的错误?

对 DynamoDB 表的访问在组织级别受到了限制

如果您在尝试访问 DynamoDB 表时遇到以下错误,是因为服务控制策略 (SCP) 拒绝了您的访问:

"User: arn:aws:iam::11111222333:user/Admin is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table with an explicit deny in a service control policy"

要排查此问题,请更新在组织级别定义的策略

**注意:**如果您在组织级别拒绝执行 DynamoDB 操作,则该组织或 AWS 账户中存在的所有 IAM 角色都将被拒绝。即使该角色或账户具有所需的权限,也会被拒绝。

Amazon VPC 端点策略限制了该操作

为了提高 DynamoDB 表和应用程序之间数据传输的隐私和安全性,您可能会使用 Amazon VPC。如果 VPC 端点设置了限制 IAM 用户访问该表的 IAM 资源策略,则会出现以下错误:

"An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::111222333444:user/Admin is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table/* with an explicit deny in a VPC endpoint policy"

如果遇到此错误,则表明 VPC 端点策略中有显式 DENY 语句,拒绝 Admin 用户执行 ListTables 操作。

要查看 VPC 端点策略,请运行 AWS CLI 命令 describe-vpc-endpoints。或者,完成以下步骤以在控制台中查看策略:

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择端点
  3. 选择 VPC 端点。
  4. 然后,选择策略选项卡查看端点策略。

要解决此问题,请更新 VPC 端点策略

您访问该表时没有使用 MFA 进行登录

假设您在账户中使用以下基于身份的策略配置了 MFA:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllExceptListedIfNoMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:GetUser",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ResyncMFADevice",
        "sts:GetSessionToken"
      ],
      "Resource": "",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

在这种情况下,除了使用 MFA 进行身份验证所需用到的操作外,所有其他操作都将被拒绝。如果 IAM 用户未使用 MFA 进行登录,则上述策略中未列出的所有操作都将被拒绝,包括 DynamoDB 操作。

要解决此问题,请使用 MFA 进行登录

您的 DynamoDB 表使用了客户管理型密钥或 AWS 托管式密钥

使用客户管理型密钥AWS Key Management Service (AWS KMS) 密钥的 DynamoDB 表必须具有正确的权限。KMS 密钥策略必须向 DynamoDB 授予代表您使用密钥的权限。访问该表的 IAM 用户必须至少拥有以下关于 AWS KMS 密钥的权限:

  • DynamoDB 使用 AWS KMS 密钥来生成和加密用于表的唯一数据密钥,称为表密钥。要生成和加密此密钥,您必须拥有 kms:GenerateDataKey 权限。
  • 要访问已加密的密钥,AWS KMS 密钥必须具有 kms:Encryptkms:Decrypt 权限。
  • 表密钥用于保护对表数据进行加密的数据加密密钥。如果修改了表的客户管理型密钥,则 DynamoDB 会生成一个新的表密钥。然后,DynamoDB 使用新的表密钥,对数据加密密钥进行重新加密。要执行此操作,您必须拥有 kms:ReEncrypt 权限。
  • DynamoDB 使用 kms:DescribeKey 操作来确定您选择的客户管理型密钥是否存在于账户和区域中。如果密钥被随机删除,则 DescribeKey 调用会返回错误。
  • DynamoDB 使用授权来设置关于客户管理型密钥的权限。当 DynamoDB 执行后台系统维护和持续数据保护任务时,会用到这些授权权限。授予权限还用于生成表密钥。因此,请确保您拥有 kms:CreateGrant 权限。

有关更多信息,请参阅 Amazon DynamoDB 如何使用 AWS KMS

您无法访问适用于 DynamoDB 的 CloudWatch Contributor Insights

如果您在尝试访问适用于 DynamoDB 的 CloudWatch Contributor Insights 时遇到错误,可能是因为您没有正确的 IAM 权限。要访问 CloudWatch Contributor Insights,您必须拥有以下权限:

有关更多信息,请参阅适用于 DynamoDB 的 CloudWatch Contributor Insights: 工作原理

**注意:**DynamoDB 不支持基于属性的访问权限控制 (ABAC)。此外,基于标签的条件不能用于控制对表的访问权限,而是应使用 IAM 策略条件进行细粒度访问控制 (FGAC)

相关信息

IAM: 通过编程和控制台来允许和拒绝对多个服务的访问

为 DynamoDB 使用基于资源的策略

AWS 官方已更新 2 年前