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

3 分的閱讀內容
0

我想疑難排解使用 AWS Identity and Access Management (IAM) 角色或使用者請求 API 呼叫時發生的明確拒絕錯誤訊息。

簡短說明

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

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

如果您的 IAM 實體不滿足這些條件,則 API 呼叫會失敗,並傳回類似於下列內容的 (AccessDenied) 錯誤:

  • 「IAM 使用者或角色遇到問題:arn:XXXXXXXX:iam::XXXXXXXX:role/TestReadOnly」
  • 「錯誤: 呼叫 RunInstances 操作時發生錯誤 (AccessDenied): 未授權使用者:arn:aws:iam::XXXXXXXX:user/tester 在資源:角色 TestReadOnly 上執行:ec2:RunInstances,並出現明確拒絕」

**注意:**本文中的疑難排解步驟會專注於討論明確拒絕錯誤,而不是隱含拒絕錯誤。如需隱含拒絕錯誤的詳細資訊,請參閱隱含與明確拒絕之間的區別

解決方法

系統會因為下列一個或多個政策中的問題而發生明確拒絕錯誤:

  • 身分型政策
  • 資源型政策
  • 許可界限
  • 服務控制政策
  • 工作階段政策

身分型政策

身分型政策會控制實體的允許/拒絕動作。請使用這些疑難排解步驟來識別身分型政策的問題。

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

1.    檢查您的身分型政策中是否沒有拒絕陳述式。此範例包含一個拒絕陳述式:

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

2.    檢查您的政策是否強制執行多重要素驗證 (MFA)。如果在強制執行 MFA 時,您的 IAM 實體未使用其他驗證要素進行驗證,則該權限將被拒絕。例如,如果您的實體使用不含 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"}
  }
}

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

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": "*"
  }
}

雖然使用者具有 RunInstances 權限,但會在請求時收到明確的拒絕訊息。若要解決這項錯誤,請確保許可界限和 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 作業來建立角色工作階段,並傳遞工作階段政策。

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

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

  "Statement": {
    "Effect": "Deny",
    "Action": "ec2:RunInstances",

    "Resource": "*"
  }
}

相關資訊

AWS 資源的存取管理

如何使用服務控制政策設定 AWS Organization 中跨帳戶的權限防護機制

IAM 實體的許可界限

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

使用儲存貯體政策,控制 VPC 端點的存取權

AWS 官方
AWS 官方已更新 6 個月前