我存取 Amazon DynamoDB 資料表時,如何疑難排解 AccessDeniedException 錯誤?
我想存取 Amazon DynamoDB 資料表,但收到 AccessDeniedException 錯誤。
簡短說明
您可能會因下列原因收到此錯誤:
- 您用來存取 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 Command Line Interface (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 資料表所需權限的最佳實務:
- 請勿將 IAM 角色包含在信任政策的任何 DENY 陳述式中。
- 將 IAM 角色包含在信任政策的 ALLOW 陳述式中。
- 確認 sts:AssumeRole API 動作支援 ALLOW 陳述式中指定的所有 IAM 條件。
- 如果您使用 AWS CLI 來存取 DynamoDB 資料表,請使用正確的存取金鑰 ID 和私密存取金鑰。
如需詳細資訊,請參閱如何取得資料以協助對 IAM 許可存取遭拒或未經授權錯誤進行疑難排解?
對 DynamoDB 資料表的存取權在組織層級受到限制
如果您在嘗試存取 DynamoDB 資料表時遇到下列錯誤,就代表服務控制政策 (SCP) 已拒絕您的存取權:
「使用者:arn:aws:iam::11111222333:user/Admin 未獲授權在資源:arn:aws:dynamodb:us-east-1:11111222333:table 上執行:dynamodb:ListTables,且在服務控制政策中明確拒絕」
若要疑難排解此問題,請更新在組織層級定義的政策。
**注意:**如果您在組織層級拒絕 DynamoDB 作業,則會拒絕該組織或 AWS 帳戶中存在的所有 IAM 角色。即使角色或帳戶具有必要的權限,該角色或帳戶也會遭拒。
Amazon VPC 端點政策會限制操作
若要提高 DynamoDB 資料表與應用程式之間資料傳輸的隱私權和安全性,您可以使用 Amazon VPC。如果 VPC 端點具有限制 IAM 使用者存取資料表的 IAM 資源政策,則會出現下列錯誤:
「呼叫 ListTables 操作時發生錯誤 (AccessDeniedException): 使用者:arn:aws:iam::111222333444:user/Admin 未獲授權在資源:arn:aws:dynamodb:us-east-1:11111222333:table/* 上執行:dynamodb:ListTables,且在 VPC 端點政策中明確拒絕」
如果您收到此錯誤,則代表 VPC 端點政策中有明確的 DENY 陳述式,會拒絕使用者 Admin 的 ListTables 操作。
若要檢視 VPC 端點政策,請執行 AWS CLI 命令 describe-vpc-endpoints。或者,請完成下列步驟,以便在主控台中檢視政策:
- 開啟 Amazon VPC 主控台。
- 在導覽窗格中,選擇端點。
- 選取 VPC 端點。
- 選擇政策標籤以檢視端點政策。
若要解決此問題,請更新 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 (KMS) 金鑰的 DynamoDB 資料表必須具有正確的權限。KMS 金鑰政策必須授予 DynamoDB 代表您使用金鑰的權限。存取資料表的 IAM 使用者必須具有下列 AWS KMS key 的最低權限:
- DynamoDB 使用 AWS KMS key 來產生和加密資料表的唯一資料金鑰,稱為資料表金鑰。若要產生並加密此金鑰,您必須具有 kms:GenerateDataKey 權限。
- 若要存取加密金鑰,AWS KMS key 必須具有 kms:Encrypt 和 kms: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)。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 2 年前lg...
- 已提問 8 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前