如何疑難排解使用 IAM 角色或使用者來請求 API 呼叫時的明確拒絕錯誤訊息?

3 分的閱讀內容
0

使用 AWS Identity and Access Management (IAM) 角色或使用者來請求 API 呼叫時,我收到明確的拒絕錯誤訊息。如何疑難排解和解決明確拒絕錯誤訊息?

簡短描述

為了讓 IAM 實體 (角色或使用者) 成功進行 API 呼叫,實體必須符合下列條件:

  • 角色或使用者具有請求 API 呼叫的正確許可。
  • 適用於要求內容的所有政策中的任何陳述式,都不會拒絕許可。

如果您的 IAM 實體不符合這些條件,則 API 呼叫會失敗,並擲回類似下列的 (AccessDenied) 錯誤:

  • IAM user or role experiencing the issue: arn:XXXXXXXX:iam::XXXXXXXX:role/TestReadOnly (遇到此問題的 IAM 使用者或角色:arn:XXXXXXXX:iam::XXXXXXXX:role/TestReadOnly)

Error: An error occurred (AccessDenied) when calling the RunInstances operation: User: arn:aws:iam::XXXXXXXX:user/tester is not authorized to perform: ec2:RunInstances on resource: role TestReadOnly with an explicit deny (錯誤:呼叫 RunInstance 操作時發生錯誤 (AccessDenied):使用者:arn:aws:iam::XXXXXXXX:user/tester 沒有授權可在資源上執行: ec2:RunInstances: 角色 TestReadOnly 具有明確拒絕)

**注意:**本文中的疑難排解步驟專門用於處理明確拒絕錯誤,而非隱含拒絕錯誤。如需隱含拒絕錯誤的詳細資訊,請參閱隱含與明確拒絕之間的差異

解決方案

由於下列一或多個政策中的問題,所以會發生明確拒絕錯誤:

  • 以身分為基礎的政策
  • 以資源為基礎的政策
  • 許可界限
  • 服務控制政策
  • 工作階段政策

以身分為基礎的政策

以身分為基礎的政策可控制實體的允許/拒絕動作。使用這些疑難排解步驟,可識別以身分為基礎的政策的問題。

**注意:**最佳實務是在條件中使用 Deny 搭配 StringNotLike,以防止意外的特權存取。

1.    檢查以身分為基礎的政策中是否沒有拒絕陳述式。此範例包含拒絕陳述式:

{
  "Effect": "Deny",
  "Action": "iam:DeleteRole"
  "Resource": "*"
}

2.    檢查您的政策是否強制執行多重要素驗證 (MFA)。如果您的 IAM 實體在強制執行 MFA 時在未使用其他身分驗證因素來進行驗證,則該許可會被拒絕。例如,如果您的實體在沒有 MFA 的情況下使用 AWS CLI 進行驗證,則會拒絕您的 API 呼叫。請參閱這個 MFA 強制執行範例:

{
  "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"}
  }
}

此政策會明確拒絕所有 API 呼叫,但 NotAction 政策元素中提及的呼叫除外。

3.    請確定您的政策符合所有必要條件。如果您的政策有多個條件運算子或多個索引鍵,會使用 AND 邏輯來評估條件。每個 RequestTag 索引鍵必須用在單獨的陳述式中,以便取得相同的 AND 邏輯。以下是導致 API 呼叫失敗的常見問題範例:

{
  "Sid": "AllowRunInstancesWithRestrictions2",
  "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 Simple Storage Service (Amazon S3) 以資源為基礎的政策和 VPC 端點政策做為範例。

S3 儲存貯體政策評估

Amazon S3 儲存貯體政策評估的運作方式如下:

**注意:**這會假設儲存貯體 ACL 設定為預設值。

  • 若要存取相同帳戶中的儲存貯體,IAM 實體需要以 IAM 身分為基礎儲存貯體政策中的許可。
  • 若要存取不同帳戶中的儲存貯體,IAM 實體需要儲存貯體政策以及以 IAM 身分為基礎中的許可,才能取得存取權。

1.    檢查以資源為基礎的政策中的拒絕陳述式。此範例顯示儲存貯體政策中的拒絕陳述式:

{
  "Effect": "deny",
  "Principal": {
    "AWS": "arn:aws:iam::111111111111:role/ROLENAME"
  },
  "Action": "s3:ListBucket",
  "Resource": "arn:aws:s3:::MyExampleBucket"
}

2.    檢查政策中描述的 ARN 是否正確。

3.    如果目前使用者的 aws:userid 與政策中定義的內容不相等,儲存貯體政策會拒絕存取。請參閱此範例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",
            "AIDAEXAMPLEID",
            "111111111111"
          ]
        }
      }
    }
  ]
}

VPC 端點

VPC 端點政策是連接至端點的 IAM 資源政策。此政策不會覆寫或取代 IAM 使用者政策或服務特定政策 (例如 S3 儲存貯體政策)。

使用界面端點連接到 Amazon S3 時,有兩個方法可以控制對 Amazon S3 資料的存取:

  • 您可以控制可以使用 VPC 端點存取端點服務的 AWS 主體 (AWS 帳戶、IAM 使用者和 IAM 角色)。
  • 您可以使用 Amazon S3 儲存貯體政策來控制可存取儲存貯體的 VPC 或 VPC 端點。

以下範例是 Amazon S3 儲存貯體政策。此政策會限制從 ID 為 vpce-11111 的 VPC 端點存取特定的儲存貯體 (稱為 examplebucket)。如果未使用指定的端點,則政策會拒絕對儲存貯體的所有存取權。aws:SourceVpce 條件是用來指定端點。

{
   "Version": "2012-10-17",
   "Id": "Policy123456789”,
   "Statement": [
     {
       "Sid": "AccessSpecificVPCEOnly",
       "Principal": "*",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::examplebucket",
                    "arn:aws:s3:::examplebucket/*"],
       "Condition": {
         "StringNotEqualsIfExists": {
           "aws:SourceVpce": "vpce-11111”
         }
       }
     }
   ]
}

始終檢查 VPC 端點是否未明確拒絕對資源的存取。

許可界限

許可界限是受管政策,可設定以身分為基礎的政策可授與 IAM 實體的最大許可。此受管政策可以限制實體的許可,這可能會導致明確的拒絕錯誤訊息。

此範例顯示 IAM 政策中允許的動作,但在許可界限中明確拒絕。請參閱下面的許可界限:

{
  "Version": "2012-10-17",

  "Statement": [

    {
      "Effect": "Deny",
      "Action": "ec2:*"

      "Resource": "*"
    }
  ]
}

使用者具有下列許可:

{
  "Version": "2012-10-17",
  
  "Statement": {
    "Effect": "Allow",
    "Action": "ec2:RunInstances",
    
    "Resource": "*"
  }
}

雖然使用者擁有 RunInstance 許可,但是當他們提出請求時,卻收到明確的拒絕訊息。若要解決此錯誤,請確定您的許可界限和 IAM 都明確允許此動作。

服務控制政策

服務控制政策 (SCP) 可讓您管理組織中的許可。下列範例顯示 SCP 中的拒絕陳述式。在此範例中,SCP 連接至成員帳戶或特定組織單位 (OU)。它明確拒絕存取 RunInstances 動作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances"

      "Resource": "*"
    }
  ]
}

若要解決明確的拒絕錯誤,請執行下列其中一個動作:

  • 將 SCP 從帳戶中斷連結。
  • 新增排除某些使用案例的條件,以修改拒絕陳述式。例如,如果 IAM 主體使用 CloudOps 角色,則此範例中的此 SCP「不會」拒絕 ec2:RunInstances:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances"     
      "Resource": "*",
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalARN": "arn:aws:iam::*:role/CloudOps"
        }
      }
    }
  ]
}

工作階段政策

工作階段政策是當您以程式設計方式為角色或使用者建立臨時工作階段時,作為參數傳遞的進階政策。您可以建立角色工作階段,然後使用 AssumeRole、AssumeRoleWithSAML 或 AssumeRoleWithWebIdentity API 操作來傳遞工作階段政策。

例如,當使用者嘗試進行 RunInstance API 呼叫時,此政策會產生明確的拒絕錯誤。始終檢查工作階段政策中的拒絕陳述式:

{
  "Version": "2012-10-17",
  
  "Statement": {
    "Effect": "Deny",
    "Action": "ec2:RunInstances",
    
    "Resource": "*"
  }
}

相關資訊

AWS 資源的存取管理

如何使用服務控制政策在 AWS Organizations 中的各個帳戶之間設定許可防護機制

IAM 實體的許可界限

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

使用儲存貯體政策控制來自 VPC 端點的存取

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