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

Amazon JSON 策略元素: Principal

在策略中使用 Principal 元素指定允许或拒绝访问资源的委托人。无法在基于 IAM 身份的策略中使用 Principal 元素。可以在 IAM 角色的信任策略和基于资源的策略中使用它。基于资源的策略是直接嵌入资源中的策略。例如,您可以在 Amazon S3 存储桶或 Amazon KMS 客户主密钥 (CMK) 中嵌入策略。

您可以在策略中指定以下任意委托人:

  • Amazon 账户和 根用户

  • IAM 用户

  • 联合身份用户(使用 Web 身份或 SAML 联合身份验证)

  • IAM 角色

  • 代入角色的会话

  • Amazon 服务

  • 匿名用户(不推荐)

请通过以下方式使用 Principal 元素:

  • 在 IAM 角色中,在角色的信任策略中使用 Principal 元素来指定可担任该角色的对象。对于跨账户访问,您必须指定受信任账户的 12 位标识符。要了解您信任区域之外的账户(受信任的组织或账户)中的委托人是否有权承担您的角色,请参阅什么是 IAM Access Analyzer?

    注意

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

  • 在基于资源的策略中,使用 Principal 元素来指定有权访问资源的账户或用户。

不要在附加到 IAM 用户和组的策略中使用 Principal 元素。同样,不要在 IAM 角色的权限策略中指定委托人。在这些情况下,委托人是隐含的,即策略附加到的用户 (对于 IAM 用户) 或担任角色的用户 (对于角色访问策略)。将策略附加到 IAM 组时,委托人是提出请求的组中的 IAM 用户。

指定委托人

您可以使用委托人的 Amazon Resource Name (ARN) 或其他标识符来指定委托人,如以下部分所示。不能将 IAM 组和实例配置文件指定为委托人。

您可以使用数组在以下部分中为每种委托人类型指定多个委托人。数组可以采用一个或多个值。如果包含多个值,则数组用方括号 ([]) 括起来并用逗号分隔,如下例所示:

"Principal" : { "AWS": [ "arn:aws-cn:iam::123456789012:root", "arn:aws-cn:iam::555555555555:root" ] }

Amazon 账户

在将 Amazon 账户标识符作为策略中的委托人时,将向该账户委派权限。如果账户内的所有身份附加了明确允许访问的适当 IAM 权限,则这些身份都可以访问该资源。这包括该账户中的 IAM 用户和角色。在指定 Amazon 账户时,您可以使用账户 ARN (arn:aws-cn:iam::Amazon-account-ID:root) 或 AWS: 前缀后加账户 ID 构成的简略格式。

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

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

您还可以使用之前所提及的方法的任意组合,通过数组将多个 Amazon 账户(或规范用户 ID)指定为委托人。

"Principal": { "AWS": [ "arn:aws-cn:iam::123456789012:root", "999999999999" ] }

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

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

单独的 IAM 用户

您可以将单个 IAM 用户 (或用户组) 指定为委托人,如以下示例中所示。如果您在该元素中指定多个委托人,则表示您向每个委托人授予权限。这是逻辑 OR 而不是逻辑 AND,因为您一次被认证为一个委托人。

注意

Principal 元素中,用户名区分大小写。

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

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

重要

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

联合 Web 身份用户

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

联合身份 SAML 用户

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

IAM 角色

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

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

特定的代入角色会话

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

当您在 Principal 元素中指定代入角色会话时,不能使用通配符 (*) 表示“所有会话”。委托人必须始终指明特定会话。

Amazon 服务

可以由 Amazon 服务担任的 IAM 角色称为服务角色。服务角色必须包括信任策略。信任策略 是附加到角色的基于资源的策略,这些策略定义了可担任该角色的委托人。某些服务角色具有预定义的信任策略。但有些情况下,您必须在信任策略中指定服务委托人。服务委托人是一个标识符,用于向服务授予权限。

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

service-name.amazonaws.com

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

service-name.amazonaws.com.cn

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

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "ecs.amazonaws.com", "elasticloadbalancing.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

匿名用户(公有访问权限)

对于基于资源的策略(如 Amazon S3 存储桶策略),委托人元素中的通配符 (*) 指定所有用户或公有访问权限。以下元素是等效的:

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

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

我们强烈建议您不要在角色的信任策略中的 Principal 元素里使用通配符,除非您在该策略中通过 Condition 元素对访问进行了限制。否则,分区的任何账户中的任意 IAM 用户都能访问此角色。

更多信息

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