如何解決 IAM 信任政策錯誤 "Failed to update trust policy.Invalid principal in policy" (無法更新信任政策。政策中的主體無效。)?

2 分的閱讀內容
0

嘗試使用 AWS 管理主控台編輯 AWS Identity and Access Management (IAM) 角色的信任政策時,我收到錯誤 "Failed to update trust policy.Invalid principal in policy." (政策中的主體無效,無法更新信任政策)。

簡短描述

此錯誤訊息指出 IAM 信任政策中的 Principal 元素的值無效。若要解決此問題,請確認下列動作:

  • 您的 IAM 角色信任政策針對 Principal 元素使用支援的值搭配正確的格式。
  • 如果 IAM 角色信任政策使用 IAM 身分 (使用者、使用者群組和角色) 作為主體,則請確認未刪除使用者或角色。

**注意:**如果標準 AWS 帳戶嘗試新增 AWS GovCloud (美國) 帳戶號碼,AWS GovCloud (美國) 帳戶可能也會收到此錯誤訊息。您無法建立角色來委派 AWS GovCloud (美國) 帳戶與標準 AWS 帳戶之間的存取權。如需詳細資訊,請參閱 AWS GovCloud (美國) 的 IAM 差異

解決方案

驗證 Principal 元素支援的值

您角色的 IAM 信任政策中的 Principal 元素必須包含以下支援的值。

1.    確保 IAM 政策包含正確的 AWS 12 位數 AWS 帳戶 ID,類似以下內容:

"Principal": {
"AWS": "123456789012"
}

**注意:**您也可以使用根使用者 Amazon 資源名稱 (ARN) 指定 AWS 帳戶。例如,arn:aws:iam::123456789012:root。

2.    如果 IAM 信任政策主體是 IAM 使用者、角色或聯合身分使用者,則您必須指定類似以下的整個 ARN:

"Principal": {
  "AWS": [
    "arn:aws:iam::123456789012:user/user-name",
    "arn:aws:iam::123456789012:role/role-name",
    "arn:aws:sts::123456789012:assumed-role/role-name/role-session-name",
    "arn:aws:sts::123456789012:federated-user/user-name"
  ]
}

3.    如果 IAM 信任政策包含萬用字元,則請遵循以下指導方針。

注意:您不能使用萬用字元「*」以符合主體名稱或 ARN 的一部分。

以下範例在 IAM 信任政策中未正確使用萬用字元:

"Principal": {
  "AWS": "arn:aws:iam::123456789012:user/user-*"
}

若要使用萬用字元符合主體名稱的一部分,請使用 Condition 元素搭配全域條件金鑰 aws:PrincipalArn。 然後,使用萬用字元指定 ARN。

若要指定來自所有 AWS 帳戶的身分,請使用如下的萬用字元:

"Principal": {
  "AWS": "*"
}

**重要提示:**您可以在 Principal 元素中使用萬用字元,搭配信任政策中的允許效果。不過,這允許同一分區中任何 AWS 帳戶中的任何 IAM 使用者、所擔任角色工作階段或聯合身分使用者。AWS 帳戶內的 IAM 使用者和角色主體無需任何其他許可。其他 AWS 帳戶中的主體必須具有身分型許可,才能擔任您的 IAM 角色。

此方法不允許 Web 身分工作階段主體、SAML 工作階段主體或服務主體存取您的資源。

最佳實務是只使用此方法搭配 Condition 元素和條件金鑰 (例如 aws:PrincipalArn),以限制許可。例如,您的檔案看起來可能類似下列內容:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::123456789012:user/user-*"
        }
      }
    }
  ]
}

此範例信任政策使用 aws:PrincipalArn 條件金鑰,僅允許具有相符使用者名稱的使用者擔任 IAM 角色。

4.    如果您的 IAM 角色是 AWS 服務角色,則您必須指定類似以下的整個服務主體:

"Principal": {
  "Service": "ec2.amazonaws.com"
}

5.    您可以使用 SAML 工作階段主體搭配外部 SAML 身分供應商,來驗證 IAM 使用者。IAM 角色的信任政策必須具有類似以下的 Principal 元素:

"Principal": {
  "Federated": "arn:aws:iam::123456789012:saml-provider/provider-name"
}

6.    您可以使用 Web 身分工作階段主體來驗證 IAM 使用者。提供存取權的 IAM 角色信任政策必須具有類似以下的 Principal 元素:

"Principal": { 
  "Federated": "cognito-identity.amazonaws.com" 
}

7.    如果您在單一陳述式內使用不同的主體類型,則請將類似以下的 IAM 信任政策格式化:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/user-name",
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

IAM 使用者或角色必須是現有身分

如果 IAM 角色信任政策使用 IAM 使用者或角色作為主體,請確認未刪除這些 IAM 身分。如果您修改 IAM 信任政策並刪除了主體,則會出現 "Invalid principal in policy" (政策中的主體無效) 錯誤。

**注意:**如果已刪除主體,請注意 IAM 信任政策中主體的唯一 ID,而不是 ARN。


相關資訊

我如何使用 AWS Identity and Access Management (IAM) 允許使用者存取資源?

如何使用 AWS IAM 存取另一個 AWS 帳戶中的資源?

為什麼 IAM 資源政策中存在未知的主體格式?

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