如何對在使用 IAM 角色或使用者要求 API 呼叫時,出現的明確拒絕錯誤訊息進行疑難排解?
我想對在使用 AWS Identity and Access Management (IAM) 角色或使用者進行 API 呼叫時,出現的明確拒絕錯誤訊息進行疑難排解。
簡短說明
若 IAM 角色或使用者要成功進行 API 呼叫,該實體必須符合以下條件:
- 角色或使用者具備請求 API 呼叫的正確權限。
- 套用至請求內容的政策中,沒有任何陳述式拒絕該權限。
如果您的 IAM 實體不符合這些條件,API 呼叫就會失敗,並回傳類似以下的拒絕存取錯誤:
- 「IAM user or role that has the issue: arn:aws:iam::444455556666:role/ExampleRole」
- 「Error: An error occurred (AccessDenied) when calling the RunInstances operation: User: arn:aws:iam::444455556666:user/ExampleUser is not authorized to perform: ec2:RunInstances on resource: arn:aws:ec2:us-east-1:444455556666:volume/* with an explicit deny」
**注意:**本文章中的疑難排解步驟專門處理明確拒絕錯誤,而非隱含拒絕錯誤。如需了解隱含拒絕錯誤的詳細資訊,請參閱明確拒絕與隱含拒絕之間的差異。
解決方法
明確拒絕錯誤會因以下一或多種政策類型中的問題而發生:
- 身分型政策
- 資源型政策
- 權限界限
- 服務控制政策
- 資源控制政策
- 工作階段政策
身分型政策
身分型政策會控制實體可允許或拒絕的動作。請使用以下疑難排解步驟來識別身分型政策中的問題。
**注意:**最佳實務是使用 Deny 搭配條件中的 StringNotLike,以防止意外鎖定。
-
請確認您的身分型政策中不存在任何拒絕陳述式。此範例包含一個拒絕陳述式:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "iam:DeleteRole", "Resource": "*" } ] } -
請檢查您的政策是否強制執行多重要素驗證 (MFA)。如果您的 IAM 實體在未使用 MFA 的情況下進行驗證,而有一個 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" } } } ] }如果 IAM 實體未使用 MFA 進行驗證,此政策會明確拒絕所有 API 呼叫,僅允許 NotAction 政策元素中提到的項目。
-
請確認您的政策符合所有必要條件。如果您的政策包含多個條件運算子或多個索引鍵,AWS 會使用 AND 邏輯來評估條件。每個條件內容索引鍵都必須在不同的陳述式中使用,才能取得相同的 AND 邏輯。以下為導致 API 呼叫失敗的常見問題範例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRunInstancesWithRestrictions", "Effect": "Deny", "Action": [ "ec2:CreateVolume", "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:*:*:volume/*", "arn:aws:ec2:*:*:instance/*" ], "Condition": { "ForAllValues:StringNotLike": { "aws:TagKeys": "Production" }, "StringEquals": { "ec2:InstanceType": "t2.micro" } } } ] }若要避免這些 API 呼叫發生明確拒絕存取錯誤,請確認您已符合該條件。
**注意:**aws:TagKeys 條件區分大小寫。
資源型政策
資源型政策可允許或拒絕對資源的存取。與統一的 IAM 身分型政策不同,各服務會自行設計資源型政策。以下疑難排解步驟以 Amazon S3 資源型政策與 VPC 端點政策作為範例。
S3 儲存貯體政策評估
Amazon S3 儲存貯體政策的評估方式如下:
- 若要存取同一帳戶中的儲存貯體,IAM 實體需要在 IAM 身分型政策或儲存貯體政策中具備權限。
- 若要存取不同帳戶中的儲存貯體,IAM 實體必須同時在儲存貯體政策與 IAM 身分型政策中具備權限,才能取得存取權。
**注意:**此情況假設儲存貯體 ACL 設為預設值。
-
請檢查資源型政策中是否存在拒絕陳述式。以下範例顯示儲存貯體政策中的拒絕陳述式:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::444455556666:role/Role" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example-bucket" } ] } -
請確認政策中的 ARN 正確無誤。
-
如果目前使用者的 aws:userid 不等於您在政策中定義的值,儲存貯體政策就會拒絕存取。請參閱以下範例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::example-bucket", "arn:aws:s3:::example-bucket/*" ], "Condition": { "StringNotLike": { "aws:userid": [ "AROAEXAMPLEID:*", "AIDAEXAMPLEID", "444455556666" ] } } } ] }
VPC 端點
VPC 端點政策是一種附加至端點的 IAM 資源政策。此政策不會覆寫或取代 IAM 使用者政策或服務專用政策,例如 S3 儲存貯體政策。
當您使用介面端點連線至 Amazon S3 時,有兩種方式可控制對 Amazon S3 資料的存取:
- 您可以控制哪些 AWS 主體 (AWS 帳戶、IAM 使用者與 IAM 角色) 能使用 VPC 端點來存取端點服務
- 您可以透過 Amazon S3 儲存貯體政策,控制哪些 VPC 或 VPC 端點可以存取您的儲存貯體
以下範例為一個 Amazon S3 儲存貯體政策。該政策會限制僅能從 ID 為 vpce-1a2b3c4d 的 VPC 端點,存取名為 example-bucket 的特定儲存貯體。如果您未使用指定的端點,該政策就會拒絕所有對儲存貯體的存取。aws:SourceVpce 條件會指定該端點。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessSpecificVPCEOnly", "Principal": "*", "Action": "s3:*", "Effect": "Deny", "Resource": [ "arn:aws:s3:::example-bucket", "arn:aws:s3:::example-bucket/*" ], "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpce": "vpce-1a2b3c4d" } } } ] }
請務必檢查 VPC 端點是否未明確拒絕對資源的存取。
權限界限
權限界限是一種受管政策,用來設定身分型政策可授予 IAM 實體的最大權限。此受管政策可能會限制實體的權限,進而導致明確拒絕錯誤訊息。
以下範例顯示 IAM 政策允許的動作,但權限界限卻明確拒絕該動作。請參閱以下權限界限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:*", "Resource": "*" } ] }
使用者具有以下權限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" } ] }
即使使用者具有 RunInstances 權限,在提出請求時仍會收到明確拒絕訊息。若要解決此錯誤,請確認您的權限界限與 IAM 政策都明確允許此動作。
服務控制政策
服務控制政策 (SCP) 可讓您在組織中管理權限。以下範例顯示 SCP 中的拒絕陳述式。在此範例中,SCP 會附加至會員帳戶或特定的組織單位 (OU)。它會明確拒絕存取 RunInstances 動作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "*" } ] }
若要解決明確拒絕錯誤,請從帳戶中分離服務控制政策 (SCP)。或是在拒絕陳述式中新增條件,以排除特定使用案例。
例如,此範例中的 SCP 不會在 IAM 主體使用 ExampleCloudOps 角色時拒絕 ec2:RunInstances:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnNotLike": { "aws:PrincipalARN": "arn:aws:iam::444455556666:role/ExampleCloudOps" } } } ] }
資源控制政策
資源控制政策 (RCP) 可讓您集中控制組織中資源可用的最大權限。RCP 支援以下資源類型:
- Amazon S3
- AWS Security Token Service
- AWS Key Management Service
- Amazon SQS
- AWS Secrets Manager
- Amazon Elastic Container Registry
- Amazon OpenSearch Serverless
在此範例中,您會將 RCP 附加至組織單位 (OU) 或會員帳戶。它會在所有 S3 儲存貯體上明確拒絕 DeleteObject 動作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:DeleteObject", "Resource": "*" } ] }
若要解決明確拒絕錯誤,請從帳戶中分離資源控制政策 (RCP)。或是在拒絕陳述式中新增條件,以排除特定使用案例。
例如,此範例中的 RCP 不會在 IAM 主體使用 ExampleCloudOps 角色時拒絕 ec2:RunInstances:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "ArnNotLike": { "aws:PrincipalARN": "arn:aws:iam::444455556666:role/ExampleCloudOps" } } } ] }
工作階段政策
工作階段政策是進階政策,您在以程式方式為角色或使用者建立暫時工作階段時,會將其作為參數傳遞。您可以建立角色工作階段,並在 AssumeRole、AssumeRoleWithSAML 或 AssumeRoleWithWebIdentity API 作業中傳遞工作階段政策。
例如,以下政策會在使用者嘗試進行 RunInstances API 呼叫時產生明確拒絕錯誤。請務必檢查工作階段政策中是否存在拒絕陳述式:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "*" } ] }
相關資訊
如何使用服務控制政策在 AWS Organizations 中跨帳戶設定權限防護機制
- 語言
- 中文 (繁體)

相關內容
- 已提問 4 年前