当我尝试访问 Amazon DynamoDB 表时,如何排查错误 AccessDeniedException?

3 分钟阅读
0

我正在尝试访问 Amazon DynamoDB 表,但收到了错误 AccessDeniedException。

简短描述

由于以下原因,您可能会收到此类错误:

  • 您用于访问 DynamoDB 表的 AWS Identity and Access Management(IAM)角色没有所需的权限。
  • 对 DynamoDB 表的访问权限在组织级别受到限制。
  • 与适用于 DynamoDB 的 Amazon Virtual Private Cloud(Amazon VPC)端点关联的策略限制了该操作。
  • 您激活了多重身份验证(MFA),并尝试在未使用 MFA 登录的情况下访问该表。
  • 您可以使用客户托管密钥或 AWS 托管式密钥来保护您的 DynamoDB 表。

解决方法

IAM 角色没有所需的权限

DynamoDB 不支持基于资源的策略。创建 DynamoDB 表时,请务必向用于访问该表的 IAM 角色授予所需的权限。您可以将策略附加到 IAM 用户、组或角色以授予所需的权限。有关更多信息,请参阅将基于身份的策略(IAM 策略)用于 Amazon DynamoDB

您可以使用 AWS 命令行界面(AWS CLI)脚本来排查 IAM 权限 API 调用失败问题。

**注意:**此 AWS CLI 脚本需要 jq 命令行 JSON 处理器。关于教程和下载说明,请参阅 JSON 输出格式。关于使用 yum 程序包的分配,请运行以下命令:

$ sudo yum install jq

运行以下 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

此命令的输出应与以下类似:

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 操作。

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

使用以下最佳实践来确保您的 IAM 角色拥有访问 DynamoDB 表所需的权限:

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

有关更多信息,请参阅如何获取数据以帮助排查 IAM 权限访问遭到拒绝或未经授权的问题?

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

如果您在尝试访问 DynamoDB 表时遇到以下错误,则表示访问因服务控制策略而被拒绝。

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 角色都无法访问 DynamoDB,尽管他们拥有所需的权限。

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

您可以使用 Amazon VPC 来提高 DynamoDB 表和应用程序之间数据传输的隐私和安全性。创建端点时,您可以选择通过向 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. 在导航窗格中,选择 Endpoints(端点)。
  3. 选择 VPC 端点。
  4. 选择 Policy(策略)选项卡以查看端点策略。

您尝试在未使用 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 操作)都将被拒绝。

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

当您使用客户托管密钥AWS Key Management Service(AWS KMS)密钥创建 DynamoDB 表时,该 KMS 密钥的策略必须授予 DynamoDB 代表您使用该密钥的权限。

请确保访问该表的 IAM 用户对 AWS KMS 密钥具有以下最低权限:

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

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


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