嘗試存取 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 Command Line Interface (AWS CLI) 指令碼對 IAM 許可 API 呼叫失敗進行疑難排解。

注意: 此 AWS CLI 指令碼需要 jq 命令列 JSON 處理器。如需教學和下載指示,請參閱 JSON 輸出格式。對於使用 yum (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'",'

**注意:**請務必使用適用於您資源的 IAM ARN 來取代取代 your-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 (ListTables) 動作,因為您已將許可連接至拒絕此操作的使用者 111122223333。第二個訊息表示沒有以身分為基礎的政策允許 dynamodb:ListTables (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 資料表和應用程式之間資料傳輸的隱私權和安全性。建立端點時,您可以選擇限制特定使用者對資料表的存取,只要將 IAM 資源政策連接到具有明確或隱含拒絕的 VPC 端點即可。如果您對嘗試存取資料表的 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 (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 (KMS) 金鑰建立 DynamoDB 資料表時,該 KMS 金鑰上的政策必須授予 DynamoDB 許可,才能代表您使用金鑰。

請確定存取資料表的 IAM 使用者對 AWS KMS key 具有以下最低許可:

  • DynamoDB 使用 AWS KMS key 為資料表產生和加密資料表的唯一資料金鑰,稱為資料表金鑰。若要產生並加密此金鑰,您必須具有 kms:GenerateDataKey 許可。
  • 資料表金鑰可保護用以加密資料表資料的資料加密金鑰。如果為資料表修改客戶受管金鑰,DynamoDB 會產生新的資料表金鑰。然後,DynamoDB 會使用新的資料表金鑰重新加密資料加密金鑰。若要執行此作業,您必須擁有 kms:ReEncrypt 許可。
  • DynamoDB 會使用 kms:DescribeKey 操作來判斷您選取的客戶受管金鑰是否存在於帳戶和區域中。如果金鑰經隨機移除,DescribeKey 呼叫會傳回錯誤。
  • DynamoDB 使用授權來設定客戶受管金鑰的許可。當 DynamoDB 執行背景系統維護和持續資料保護任務時,就會使用這些授予的許可。授予許可也可用於產生資料表金鑰。因此,請確保您具有 kms:CreateGrant 許可。

如需詳細資訊,請參閱 Amazon DynamoDB 如何使用 AWS KMS


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