Amazon JSON 策略元素:Principal - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon JSON 策略元素:Principal

在基于资源的 JSON 策略中使用 Principal 元素指定允许或拒绝访问资源的主体。

您可以使用基于资源的策略中的 Principal 元素。包括 IAM 在内的多项服务支持基于资源的策略。IAM 中唯一基于资源的策略类型是角色信任策略。在 IAM 角色中,在角色的信任策略中使用 Principal 元素来指定可担任该角色的对象。对于跨账户访问,您必须指定受信任账户的 12 位标识符。要了解您信任区域之外的账户(受信任的企业或账户)中的主体是否有权承担您的角色,请参阅什么是 IAM Access Analyzer?

注意

创建角色后,您可以将账户更改为 "*",允许所有人担任该角色。如果执行此操作,我们强烈建议您通过其他方法 (如将访问只限定为特定 IP 地址的 Condition 元素) 限制能够访问该角色的用户。不要将角色的访问权限开放给所有人!

支持基于资源的策略的其他资源示例包括 Amazon S3 存储桶或 Amazon KMS key。

无法在基于身份的策略中使用 Principal 元素。基于身份的策略是附加到 IAM 身份(用户、群体或角色)的权限策略。在这些策略中,附加了策略的身份即是主体的身份。

指定主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定主体。例如,您可以指定 aws:PrincipalArn 条件密钥中的 Amazon Resource Name (ARN)

您可以在策略中指定以下任意主体:

  • Amazon 账户和根用户

  • IAM 角色

  • 角色会话

  • IAM 用户

  • 联合用户会话

  • Amazon 服务

  • 所有主体

您可以使用数组在以下部分中为每个主体类型指定多个主体。数组可以采用一个或多个值。如果您在该元素中指定多个主体,则表示您向每个主体授予权限。这是逻辑 OR 而不是逻辑 AND,因为您一次被认证为一个主体。如果包含多个值,请使用方括号([])并用逗号分隔数组的每个条目。以下示例策略定义了 123456789012 账户或 555555555555 账户的权限。

"Principal" : { "AWS": [ "123456789012", "555555555555" ] }
注意

您不能使用通配符匹配一部分主体名称或 ARN。

Amazon 账户主体

您可以在基于资源策略的 Principal 元素中或支持主体的条件密钥中指定 Amazon 账户标识符。这将权限委托给账户。当您允许访问其他账户时,该账户中的管理员必须授予对该账户中身份(IAM 用户或角色)的访问权限。在指定 Amazon 账户时,您可以使用账户 ARN (arn:aws:iam::account-ID:root) 或 "AWS": 前缀后加账户 ID 构成的简略格式。

例如,给定账户 ID 为 123456789012 的情况下,您可以使用以下任一方法来在 Principal 元素中指定账户:

"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
"Principal": { "AWS": "123456789012" }

账户 ARN 和缩短的账户 ID 的行为方式相同。两者都向账户委派权限。在 Principal 元素中使用账户 ARN 并不会将权限限制为该账户的根用户。

注意

当您保存包含缩短账户 ID 的基于资源的策略时,服务可能会将其转换为主体 ARN。这不会更改策略的功能。

某些 Amazon 服务支持其他用于指定账户主体的选项。例如,Amazon S3 允许您使用以下格式指定规范用户 ID

"Principal": { "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }

您还可以指定多个 Amazon 账户(或规范用户 ID)作为使用数组的主体。例如,您可以使用所有三种方法在存储桶策略中指定主体。

"Principal": { "AWS": [ "arn:aws:iam::123456789012:root", "999999999999", "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" ] }

IAM 角色主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定 IAM 角色主体 ARN。IAM 角色是身份。在 IAM 中,身份是您可以向其分配权限的资源。角色信任另一个身份验证来担任该角色。这包含 Amazon 中的主体或来自外部身份提供商 (IdP) 的用户。当主体或身份代入角色时,他们会收到具有代入角色权限的临时安全证书。当他们使用这些凭证,在 Amazon 中执行操作时,将变为角色会话主体

IAM 角色是 IAM 中存在的身份。角色信任另一个经过身份验证的身份,如 Amazon 中的主体或来自外部身份提供商的用户。当主体或身份代入角色时,他们会收到临时安全凭证。然后,他们可以使用这些凭据作为角色会话主体在 Amazon 中执行操作。

当您在基于资源的策略中指定角色主体时,主体的有效权限受限制该角色权限的任何策略类型的限制。这包括会话策略和权限边界。有关如何评估角色会话的有效权限的更多信息,请参阅 策略评估逻辑

要指定 Principal 元素中的角色 ARN,请采用以下格式:

"Principal": { "AWS": "arn:aws:iam::Amazon-account-ID:role/role-name" }
重要

如果角色信任策略的 Principal 元素中包含指向特定 IAM 角色的 ARN,在保存策略时该 ARN 将转换为该角色的唯一主体 ID。如果有人希望通过删除并重新创建角色来提升特权,这样有助于减轻此类风险。您通常不会在控制台中看到这个 ID,因为 IAM 在显示信任策略时使用反向转换回角色 ARN。但是,如果您删除角色,这种关系即被打破。即使您重新创建角色,策略也不再适用。因为新角色拥有新的主体 ID,与信任策略中存储的 ID 不匹配。在这种情况下,主体 ID 会显示在控制台中,因为 Amazon 无法将其映射回有效的 ARN。最终结果是,如果您删除并重新创建了信任策略的 Principal 元素所引用的角色,您必须编辑角色,用正确的 ARN 替换目前不正确的主体 ID。当您保存策略时,ARN 会再次转换为该角色新的主体 ID。

或者,您可以指定角色主体作为在基于资源的策略中的主体,或者创建使用 aws:PrincipalArn 条件密钥的广泛权限策略。当您使用此密钥时,角色会话主体将根据所担任的角色的 ARN 而不是生成的会话的 ARN 授予权限。由于 Amazon 不将条件键 ARN 转换为 ID,如果您删除该角色,然后创建一个具有相同名称的新角色,则授予该角色的权限将继续。使用授予的权限 aws:PrincipalArn 条件密钥不受基于身份的策略类型的限制,例如权限边界或会话策略。

角色会话主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定角色会话。当主体或身份代入角色时,他们会收到具有代入角色权限的临时安全证书。当他们使用这些凭证,在 Amazon 中执行操作时,将变为角色会话主体

您用于角色会话主体的格式取决于用来代入角色的 Amazon STS 操作。

此外,管理员可以设计一个流程来控制角色会话的发放方式。例如,他们可以为用户提供一键式解决方案,以创建可预测的会话名称。如果管理员执行此操作,则可以在策略或条件密钥中使用角色会话主体。否则,您可以将角色 ARN 指定为主体,或 aws:PrincipalArn 条件密钥中的主体。如何将角色指定为主体可以更改生成的会话的有效权限。有关更多信息,请参阅 IAM 角色主体

代入角色会话主体

假设的角色会话主体是使用 Amazon STS AssumeRole 操作产生的会话主体。有关哪些主体可以使用此操作代入角色的更多信息,请参阅 比较 Amazon STS API 操作

要指定 Principal 元素中代入角色会话的 ARN,请采用以下格式:

"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }

当您在 Principal 元素中指定代入角色会话时,不能使用通配符 "*" 表示所有会话。主体必须始终指明特定会话。

Web 身份会话主体

Web 身份会话主体是使用 Amazon STS AssumeRoleWithWebIdentity 操作产生的会话主体。您可以使用外部 Web 身份提供商 (IdP) 登录,然后使用此操作代入 IAM 角色。这利用了身份联合身份验证并发出角色会话。有关哪些主体可以使用此操作代入角色的更多信息,请参阅 比较 Amazon STS API 操作

从 Web 身份提供商发出角色时,您将获得这种特殊类型的会话主体,其中包括有关 Web 身份提供商的信息。

在策略中使用此主体类型可基于受信任的 Web 身份提供商来允许或拒绝访问。要指定角色信任策略 Principal 元素中 Web 身份角色会话的 ARN,请采用以下格式:

"Principal": { "Federated": "cognito-identity.amazonaws.com" }
"Principal": { "Federated": "www.amazon.com" }
"Principal": { "Federated": "graph.facebook.com" }
"Principal": { "Federated": "accounts.google.com" }

SAML 会话主体

SAML 会话主体是使用 Amazon STS AssumeRoleWithSAML 操作产生的会话主体。您可以使用外部 SAML 身份提供商 (IdP) 登录,然后使用此操作代入 IAM 角色。这利用了身份联合身份验证并发出角色会话。有关哪些主体可以使用此操作代入角色的更多信息,请参阅 比较 Amazon STS API 操作

从 SAML 身份提供商发出角色时,您将获得这种特殊类型的会话主体,其中包括有关 SAML 身份提供商的信息。

在策略中使用此主体类型可基于受信任的 SAML 身份提供商来允许或拒绝访问。要指定角色信任策略 Principal 元素中 Web 身份角色会话的 ARN,请采用以下格式:

"Principal": { "Federated": "arn:aws:iam::Amazon-account-ID:saml-provider/provider-name" }

IAM 用户主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定 IAM 用户。

注意

Principal 元素中,Amazon Resource Name (ARN) 的用户名部分区分大小写。

"Principal": { "AWS": "arn:aws:iam::Amazon-account-ID:user/user-name" }
"Principal": { "AWS": [ "arn:aws:iam::Amazon-account-ID:user/user-name-1", "arn:aws:iam::Amazon-account-ID:user/user-name-2" ] }

当在 Principal 元素中指定用户时,不能使用通配符 (*) 表示“所有用户”。主体必须始终指明特定用户。

重要

如果角色信任策略的 Principal 元素中包含指向特定 IAM 用户的 ARN,则在保存策略时该 IAM 将 ARN 转换为该用户的唯一主体 ID。如果有人希望通过删除并重新创建用户来提升特权,这样有助于减轻此类风险。您通常不会在控制台中看到这个 ID,因为显示信任策略时它还会反向转换为用户的 ARN。但是,如果您删除角色,这种关系即被打破。即使您重新创建用户,策略也不再适用。这是因为:新用户拥有新的主体 ID,该 ID 与信任策略中存储的 ID 不匹配。在这种情况下,主体 ID 会显示在控制台中,因为 Amazon 无法将其映射回有效的 ARN。结果是,如果您删除并重新创建了信任策略的 Principal 元素所引用的用户,您必须编辑角色,用正确的 ARN 替换目前不正确的主体 ID。当您保存策略时,IAM 会再次将 ARN 转换为该用户新的主体 ID。

Amazon STS 联合用户会话主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定 federated user sessions(联合身份用户会话)。

重要

Amazon 建议只有当必要时才能使用 Amazon STS 联合身份用户会话,如需要使用根用户访问权限时。反过来,使用角色来委托权限

Amazon STS 联合身份用户会话主体是使用 Amazon STS GetFederationToken 操作产生的会话主体。在这种情况下,Amazon STS 使用联合身份作为获取临时访问令牌而不是使用 IAM 角色的方法。

在 Amazon 中,IAM 用户或 Amazon Web Services 账户 根用户可以使用长期访问权限密钥来身份验证。有关哪些主体可以使用此操作联合身份的更多信息,请参阅 比较 Amazon STS API 操作

  • IAM 联合身份用户— 一个 IAM 用户联邦成员使用对该 IAM 用户产生联邦用户会话主体的 GetFederationToken 操作。

  • 联合身份根用户— 一个根用户联邦成员使用对该根用户产生联邦用户会话主体的 GetFederationToken 操作。

当 IAM 用户或根用户通过使用此操作的 Amazon STS 请求临时凭证时,他们开启临时的联合身份会话。本会话的 ARN 基于联合身份的原始身份。

要指定 Principal 元素中联合身份用户会话的 ARN,请采用以下格式:

"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }

Amazon 服务主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中指定 Amazon 服务。一个服务主体是服务的标识符。

可以由 Amazon 服务担任的 IAM 角色称为服务角色。服务角色必须包括信任策略。信任策略是附加到角色的基于资源的策略,这些策略定义了可担任该角色的主体。某些服务角色具有预定义的信任策略。但有些情况下,您必须在信任策略中指定服务主体。

服务主体的标识符包括服务名称,通常采用以下格式:

service-name.amazonaws.com

但是,某些服务可能使用以下格式代替常用格式或作为常用格式的补充:

service-name.amazonaws.com

服务主体由服务定义。可以通过以下方式找到某些服务的服务主体:打开 Amazon使用 IAM 的 服务,检查服务在 Service-linked role(服务相关角色)列中是否具有 Yes,然后打开 Yes(是)链接以查看该服务的服务相关角色文档。查找该服务的服务相关角色权限部分,查看服务主体。

以下示例显示了一个可以附加到服务角色的策略。该策略可启用两个服务(Amazon ECS 和 Elastic Load Balancing)以担任该角色。然后,这些服务可执行由分配给该角色 (未显示) 的权限策略授权执行的任何任务。要指定多个服务主体,不用指定两个 Service 元素;您可以只使用一个该元素。实际上,您可以将一组多个服务主体作为单个 Service 元素的值。

"Principal": { "Service": [ "ecs.amazonaws.com", "elasticloadbalancing.amazonaws.com" ] }

所有主体

您可以在支持主体的基于资源的策略或条件密钥的 Principal 元素中使用通配符 (*) 指定主体。作为最佳实践,只能使用 Condition 元素和条件键(例如 aws:PrincipalArn)才能限制那些广泛的权限。

对于基于资源的策略(如 Amazon S3 存储桶策略),主体元素中的通配符(*)指定所有用户或公有访问权限。例如,可以使用以下两种方法来指定 Principal 元素中的所有主体:

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

在基于资源的策略中使用具有 Allow 效果的 "Principal": "*" 允许任何人访问您的资源,即便未登录 Amazon。

使用具有 Allow 效果的 "Principal" : { "AWS" : "*" } 允许任何根用户、IAM 用户、代入角色会话或联合身份用户在同一分区的任何账户中访问您的资源。对于账户中的 IAM 用户和角色主体,不需要其他权限。对于其他账户中的主体,他们还必须在其账户中拥有基于身份的权限,以允许他们访问您的资源。这称为 cross-account access(跨账户访问)。此方法不允许 Web 身份会话主体、SAML 会话主体或服务主体访问您的资源。

重要

因为任何人都可以创建 Amazon 账户,安全级别在这两种方法中是等效的,尽管它们的功能不同。

您不能使用通配符匹配一部分主体名称或 ARN。

更多信息

有关更多信息,请参阅下列内容: