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

上次更新日期︰2022 年 4 月 4 日

當我嘗試使用 AWS 管理主控台,編輯 AWS Identity and Access Management (IAM) 角色信任政策時,收到如下錯誤:

"Failed to update trust policy.Invalid principal in policy." (無法更新信任政策。政策中的主體無效。)

簡短描述

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

  • 您的 IAM 角色信任政策針對 Principal 元素使用支援的值搭配正確的格式。
  • 如果 IAM 角色信任政策使用 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。