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

2 分的閱讀內容
0

我嘗試編輯 AWS Identity and Access Management (IAM) 身分使用者或角色的信任政策,但收到下列錯誤: "Failed to update trust policy.Invalid principal in policy." (無法更新信任政策。政策中的主體無效。)

簡短說明

此錯誤訊息指出在您的 IAM 信任政策中的主體元素的值無效。若要解決此錯誤,請確認下列項目:

  • 您的 IAM 角色信任政策會將正確格式的支援值用於主體元素。
  • 如果 IAM 角色信任原則使用 IAM 使用者或角色作為主體,請確認尚未刪除該使用者或角色。

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

解決方法

驗證主體元素的支援值

在您角色的 IAM 信任政策中的主體元素必須包含下列支援的值。

  1. 請確定 IAM 政策包含正確的 AWS 12 位數 AWS 帳戶 ID (類似於下列內容):

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

    注意: 您也可以使用根使用者 Amazon Resource Name (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-*"
    }

    若要使用萬用字元搭配部分主體名稱,請使用具有全域條件金鑰 [aws:PrincipalArn 的條件元素。]() 然後使用萬用字元指定 ARN。若要從所有 AWS 帳戶指定身分,請使用與下列項目相似的萬用字元:

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

    重要: 如果主體元素在信任政策中具有允許效果,則可以在該主體元素中使用萬用字元。但是,這可讓在同一分割區中任一 AWS 帳戶的任何 IAM 使用者、擔任的角色工作階段或聯合身分使用者存取您的角色。AWS 帳戶中的 IAM 使用者和角色主體不需要任何其他許可。其他 AWS 帳戶中的主體必須具有身分型許可,才能擔任您的 IAM 角色。此方法不允許 Web 身分工作階段主體、SAML 工作階段主體或服務主體存取您的資源。最佳實務為僅使用此方法搭配條件元素和條件金鑰 (例如 aws:PrincipalArn) 來限制許可。下列信任政策範例使用 aws:PrincipalArn 條件金鑰,僅允許具有相符使用者名稱 IAM 角色的使用者擔任:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringLike": {
              "aws:PrincipalArn": "arn:aws:iam::123456789012:user/user-*"
            }
          }
        }
      ]
    }
  4. 如果您的 IAM 角色是 AWS 服務角色,則必須將整個服務主體指定為類似於下列內容:

    "Principal": {
      "Service": "ec2.amazonaws.com"
    }
  5. 您可以透過外部 SAML 身分使用 SAML 工作階段主體來驗證 IAM 使用者。IAM 角色的信任政策必須具有類似於下列內容的主體元素:

    "Principal": {
      "Federated": "arn:aws:iam::123456789012:saml-provider/provider-name"
    }
  6. 您可以使用 Web 身分工作階段主體來驗證 IAM 使用者。提供存取權之 IAM 角色的信任政策必須具有類似於下列內容的主體元素:

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

確認信任原則不包含 AIDA 或 AROA 前綴

如果您的信任原則包含具有 IAM 實體 ARN 的主體元素,則 ARN 在儲存時會變更為唯一的主體 ID。這個唯一的主體 ID 對 IAM 使用者具有前綴 AIDA,對 IAM 角色具有前綴 AROA,類似於下列:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "AIDAW4GTDFISYQEXAMPLE",
          "AROAW4GTDFISYQEXAMPLE"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

以信任政策中的唯一主體 ID 表示 IAM 使用者或角色已刪除。主體 ID 會出現,因為 AWS 無法將其對應回有效的 ARN。如果您編輯信任政策,則必須移除主體 ID,或以有效的主體 ARN 取代它。儲存政策後,ARN 會變更為使用者或角色的新唯一 ID。

如需更多資訊,請參閱為什麼我的以 IAM 資源為基礎的政策中具有未知的主體格式?

相關資訊

如何使用 IAM 允許使用者存取資源?

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

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