如何解决 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 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-*"
}

要使用通配符匹配部分主体名称,请将 Condition 元素与全局条件键 aws:PrincipalArn 结合使用。 然后,使用通配符指定 ARN。

要指定所有 AWS 账户的身份,请使用类似于以下内容的通配符:

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

**重要提示:**您可以在 Principal(主体)元素中使用通配符,并在信任策略中使用 Allow(允许)效果。但是,这允许同一分区中任何 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 信任策略并且删除了主体,则会出现“策略中的主体无效”错误。

**注意:**如果主体已删除,请在 IAM 信任策略中记下主体的唯一 ID,而不是 ARN。


相关信息

如何使用 AWS Identity and Access Management(IAM)允许用户访问资源?

如何使用 AWS IAM 访问其他 AWS 账户中的资源?

为什么我的 IAM 基于资源的策略中存在未知的主体格式?

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