跳至內容

如何對在使用 IAM 角色或使用者要求 API 呼叫時,出現的明確拒絕錯誤訊息進行疑難排解?

4 分的閱讀內容
0

我想對在使用 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,以防止意外鎖定。

  1. 請確認您的身分型政策中不存在任何拒絕陳述式。此範例包含一個拒絕陳述式:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": "iam:DeleteRole",
                "Resource": "*"
            }
        ]
    }
    
  2. 請檢查您的政策是否強制執行多重要素驗證 (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 政策元素中提到的項目。

  3. 請確認您的政策符合所有必要條件。如果您的政策包含多個條件運算子或多個索引鍵,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 設為預設值。

  1. 請檢查資源型政策中是否存在拒絕陳述式。以下範例顯示儲存貯體政策中的拒絕陳述式:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Principal": {
                    "AWS": "arn:aws:iam::444455556666:role/Role"
                },
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::example-bucket"
            }
        ]
    }
    
  2. 請確認政策中的 ARN 正確無誤。

  3. 如果目前使用者的 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 中跨帳戶設定權限防護機制

IAM 實體的權限界限

如何將 Amazon S3 儲存貯體存取限制為特定 IAM 角色

AWSSupport-TroubleshootIAMAccessDeniedEvents

AWS 官方已更新 6 個月前