跳至内容

如何解决 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 信任策略中 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)一起用于限制权限。以下示例信任策略使用 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 元素:

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

确认信任策略不包含 AIDA 或 AROA 前缀

如果您的信任策略包含 Principal 元素,该元素具有 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 官方已更新 2 年前