如何對 IAM 政策的存取遭拒或未經授權的操作錯誤進行疑難排解?

4 分的閱讀內容
0

我嘗試對 AWS 資源執行動作,但收到「存取遭拒」或「未經授權的操作」錯誤。如何對這些許可問題進行疑難排解?

簡短描述

若要對 AWS Identity and Access Management (IAM) 政策的問題進行疑難排解:

解決方法

識別 API 呼叫者並了解錯誤訊息

重要:

檢閱 IAM 政策之前,請確定 API 呼叫是由代表正確的 IAM 實體所進行。如果錯誤訊息不包含呼叫者資訊,請依照下列步驟識別 API 呼叫者:

  1. 開啟 AWS 管理主控台
  2. 在頁面右上角,選擇帳戶資訊旁邊的箭頭。
  3. 如果您以 IAM 角色的身分登入,請參閱「目前角色:」以了解擔任角色的名稱,參閱「帳戶 ID」以了解帳戶 ID。
  4. 如果您以聯合身分使用者的身分登入,請參閱「聯合身分使用者」以了解聯合角色名稱和角色工作階段名稱。

-或-

使用 AWS CLI 命令 get-caller-identity 來識別 API 呼叫者。您也可以使用含 --debug 旗標的 AWS CLI 命令,來識別類似下列項目的輸出憑證來源:

2018-03-13 16:23:57,570 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials

檢查 IAM 政策許可

檢查連接的 IAM 政策,確認是否已授予 API 呼叫者必要的許可。如需詳細資訊,請參閱判斷帳戶內是否允許或拒絕請求

評估 AWS Organizations SCP

如果 AWS 帳戶是 AWS Organization 的一部分,則可以在階層層級套用 SCP 以允許或拒絕動作。AWS 帳戶中的所有 IAM 實體會繼承 SCP 許可。確保在 SCP 中未明確拒絕 API 呼叫者。

確保在影響呼叫者的組織 SCP 政策中未明確拒絕呼叫的 API

檢閱身分型和資源型政策

確定 IAM 實體身分型政策中有 API 呼叫者的明確 Allow 陳述式。然後,請確定 API 支援資源層級許可。如果 API 呼叫者不支援資源層級許可,請確定在 IAM 政策陳述式的資源元素中指定萬用字元 "*"

您可以將資源型的政策連接至 AWS 服務內的資源以提供存取權。如需詳細資訊,請參閱身分型政策和資源型政策

若要檢視 IAM 政策摘要,請執行下列步驟:

  1. 開啟 IAM 主控台
  2. 在導覽窗格中,選擇政策
  3. 選擇政策名稱旁邊的箭頭,以展開政策詳細資訊檢視。

在下列範例中,政策無法運作,因為並非所有 Amazon Elastic Compute Cloud (Amazon EC2) API 動作都會支援資源層級許可:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SorryThisIsNotGoingToWorkAsExpected",
            "Effect": "Allow",
            "Action": ["ec2:*"],
            "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*"
        }
    ]
}

嘗試使用 run-instances AWS CLI 命令在 us-east-1 區域中啟動 Amazon EC2 執行個體的 IAM 使用者會收到類似下列內容的錯誤訊息:

"An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message:…"

若要解決此錯誤,請將資源變更為萬用字元 "*"。這是因為 Amazon EC2 僅支援部分資源層級許可

若要解碼授權失敗訊息,以取得有關此失敗原因的更多詳細資訊,請使用類似於下列內容的 DecodeAuthorizationMessage API 動作:

$ aws sts decode-authorization-message --encoded-message <encoded-message-from-the-error>

檢查許可界限

如果 IAM 實體已連接至許可界限,則界限會設定實體擁有的最大許可。

評估工作階段政策

如果 API 呼叫者是 IAM 角色或聯合身分使用者,則會在工作階段期間傳遞工作階段政策。工作階段的許可是用來建立工作階段與工作階段政策的 IAM 實體的身分型政策交集。確定 API 呼叫存在於 IAM 政策和實體中。

確定 API 會支援政策中的條件金鑰

AWS 條件金鑰可用於將對 AWS 提出的 API 請求中的元素與 IAM 政策中指定的金鑰值進行比較。條件金鑰可以是全域條件金鑰,或由 AWS 服務定義。AWS 服務特定條件金鑰僅能在該服務中使用 (例如 EC2 API 動作的 EC2 條件)。如需詳細資訊,請參閱 AWS 服務的動作、資源和條件內容金鑰

條件元素可包含多個條件,且在每個條件區塊中可以包含多個金鑰對值對。如需詳細資訊,請參閱建立具有多個金鑰或值的條件

在此範例政策中,如果 IAM 使用者管理員呼叫 IAM API 請求,而來源 IP 位址來自 1.1.1.0/24 或 2.2.2.0/24,則會比對條件元素。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:username": "admin"
        },
        "IpAddress": {
          "aws:SourceIp": [
            "1.1.1.0/24",
            "2.2.2.0/24"
          ]
        }
      }
    }
  ]
}

IAM 政策錯誤和疑難排解範例

請參閱下列範例以識別錯誤訊息、API 呼叫者、API 以及呼叫的資源:

錯誤訊息範例API 呼叫者API資源何時
A:「呼叫 DescribeInstances 操作時發生錯誤 (UnauthorizedOperation): 您未獲授權執行此操作。」未知DescribeInstances未知錯誤發生時間
B:「呼叫 AssumeRole 操作時發生錯誤 (AccessDenied): User: arn:aws:iam::123456789012:user/test is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/EC2-FullAccess」arn:aws:iam::123456789012:user/testAssumeRolearn:aws:iam::123456789012:role/EC2-FullAccess錯誤發生時間
C:「呼叫 GetSessionToken 操作時發生錯誤 (AccessDenied): 無法使用工作階段憑證呼叫 GetSessionToken」未知GetSessionToken未知錯誤發生時間
D:「呼叫 AssociateIamInstanceProfile 操作時發生錯誤 (UnauthorizedOperation): 您未獲授權執行此操作。編碼授權失敗訊息:...」未知AssociateIamInstanceProfile未知錯誤發生時間

使用此評估方法,您可以識別針對不同 AWS 服務的許可問題所收到的錯誤訊息原因。如需詳細資訊,請參閱下列錯誤訊息和疑難排解步驟:

錯誤訊息範例 A:

此錯誤訊息會指出您沒有呼叫 DescribeInstances API 的許可。

若要解決此錯誤,請遵循下列步驟:

  1. 識別 API 呼叫者。
  2. 確認 ec2:DescribeInstances API 動作未包含在任何 Deny 陳述式中。
  3. 確認 ec2:DescribeInstances API 動作未包含在任何 Allow 陳述式中。
  4. 確認沒有指定此 API 動作的資源。**注意:**此 API 動作不支援資源層級許可
  5. 確認 DescribeInstances 動作會支援 Allow 陳述式中指定的所有 IAM 條件,並且確認條件皆符合。

如需詳細資訊,請參閱 DescribeInstanceStatus

錯誤訊息範例 B:

此錯誤訊息包含 API 名稱、API 呼叫者和目標資源。請確定稱為 API 的 IAM 身分具有正確的資源存取權。使用先前的評估方法檢閱 IAM 政策。

若要解決此錯誤,請依照下列步驟確認 IAM 角色的信任政策: EC2-FullAccess:

  1. 確認 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 不包含在任何信任政策的 Deny 陳述式中。
  2. 確認 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 包含在信任政策的 Allow 陳述式中。
  3. 確認 sts:AssumeRole API 動作會支援 Allow 陳述式中指定的所有 IAM 條件,並且確認條件皆符合。

請依照下列步驟確認連接至 API 呼叫者的 IAM 政策 (arn:aws:iam::123456789012:user/test):

  1. 確認 arn:aws:iam::123456789012:role/EC2-FullAccess 不包含在任何含 sts:AssumeRole API 動作的 Deny 陳述式中。
  2. 如果 arn:aws:iam::123456789012:root 位於信任政策的 Allow 陳述式中,則請確認 arn:aws:iam::123456789012:role/EC2-FullAccess 包含在含 sts:AssumeRole API 動作的 IAM 政策的 Allow 陳述式中。
  3. 確認 sts:AssumeRole API 動作會支援 Allow 陳述式中指定的所有 IAM 條件,並且確認條件皆符合。

錯誤訊息範例 C:

此錯誤訊息會指出暫時憑證不支援 get-session-token。如需詳細資訊,請參閱比較 AWS STS API 操作

錯誤訊息範例 D:

此錯誤訊息會傳回編碼訊息,該訊息可提供有關授權失敗的詳細資訊。若要解碼錯誤訊息並取得許可失敗的詳細資訊,請參閱 DecodeAuthorizationMessage。在解碼錯誤訊息後,識別 API 呼叫者,並檢閱資源層級的許可和條件。

若要解決此錯誤,請遵循下列步驟以檢閱 IAM 政策許可:

  1. 如果錯誤訊息指出 API 已明確拒絕,請從符合的陳述式中移除 ec2:AssociateIamInstanceProfile 或 iam:PassRole API 動作。
  2. 確認 ec2:AssociateIamInstanceProfile 和 iam:PassRole 位於 Allow 陳述式中,其中包含支援和正確的資源目標。例如,請確認 ec2:AssociateIamInstanceProfile API 動作的資源目標是 EC2 執行個體,而 iam:PassRole 的資源目標則是 IAM 角色。
  3. 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 動作位於相同的 Allow 陳述式中,請確認 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 動作會支援所有條件,並且確認條件皆符合。
  4. 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 動作位於單獨的 Allow 陳述式中,請確認動作會支援每個 Allow 陳述式中的所有條件,並且確認條件皆符合。

如需詳細資訊,請參閱政策評估邏輯判斷帳戶中是否允許或拒絕請求


相關資訊

對 IAM 政策進行疑難排解

為什麼我在嘗試擔任跨帳戶 IAM 角色時收到 "AccessDenied" 或 "Invalid information" 錯誤?

IAM JSON 政策元素參考