AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

策略和权限

您在 AWS 中通过创建策略并将其附加到 IAM 身份(用户、用户组或角色)或 AWS 资源来管理访问权限。策略是 AWS 中的对象;在与身份或资源相关联时,策略定义它们的权限。在委托人实体(如用户或角色)发出请求时,AWS 将评估这些策略。策略中的权限确定是允许还是拒绝请求。大多数策略作为 JSON 文档存储在 AWS 中。AWS 支持六种类型的策略:基于身份的策略、基于资源的策略、权限边界、组织 SCP、ACL 和会话策略。

IAM 策略定义操作的权限,无论您使用哪种方法执行操作。例如,如果一个策略允许GetUser 操作,则具有该策略的用户可以从 AWS 管理控制台、AWS CLI 或 AWS API 获取用户信息。在创建 IAM 用户时,您可以选择允许控制台或编程访问。如果允许控制台访问,则 IAM 用户可以使用用户名和密码登录到控制台。或者,如果允许编程访问,则用户可以通过访问密钥来使用 CLI 或 API。

策略类型

可在 AWS 中使用以下策略类型,它们按使用频率顺序列出。有关更多详细信息,请参阅下面有关各种策略类型的各部分。

  • 基于身份的策略 – 将托管策略和内联策略附加到 IAM 身份(用户、用户所属组或角色)。基于身份的策略向身份授予权限。

  • 基于资源的策略 – 将内联策略附加到资源。基于资源的策略的最常见示例是 Amazon S3 存储桶策略和 IAM 角色信任策略。基于资源的策略向在策略中指定的委托人实体授予权限。委托人可以与资源位于同一个账户中,也可以位于其他账户中。

  • 权限边界 – 使用托管策略作为 IAM 实体(用户或角色)的权限边界。该策略定义基于身份的策略可以授予实体的最大权限,但不授予权限。权限边界不定义基于资源的策略可以授予实体的最大权限。

  • 组织 SCP – 使用 AWS Organizations 服务控制策略 (SCP) 为组织或组织单元 (OU) 的账户成员定义最大权限。SCP 限制基于身份的策略或基于资源的策略授予账户中实体(用户或角色)的权限,但不授予权限。

  • 访问控制列表 (ACL) – 使用 ACL 来控制其他账户中的哪些委托人可以访问 ACL 附加到的资源。ACL 类似于基于资源的策略,但它们是唯一不使用 JSON 策略文档结构的策略类型。ACL 是跨账户的权限策略,向指定的委托人实体授予权限。ACL 不能向同一账户内的实体授予权限。

  • 会话策略 – 当您使用 AWS CLI 或 AWS API 代入某个角色或联合身份用户时,传递高级会话策略。会话策略限制角色或用户的基于身份的策略授予会话的权限。会话策略限制所创建会话的权限,但不授予权限。有关更多信息,请参阅会话策略

基于身份的策略

基于身份的策略是可附加到身份(用户、用户组或角色)的 JSON 权限策略文档。这些策略控制实体(用户或角色)可在什么样的条件下对哪些资源执行哪些操作。基于身份的策略可以进一步分类:

  • 托管策略 – 基于身份的独立策略,可附加到您的 AWS 账户中的多个用户、组和角色。您可以使用两个类型的托管策略:

    • AWS 托管策略 – 由 AWS 创建和管理的托管策略。如果您刚开始使用策略,建议先使用 AWS 托管策略。

    • 客户托管策略 – 您在 AWS 账户中创建和管理的托管策略。与 AWS 托管策略相比,客户托管策略可以更精确地控制策略。您可以在可视化编辑器中创建和编辑 IAM 策略,也可以直接创建 JSON 策略文档以创建和编辑该策略。有关更多信息,请参阅 创建 IAM 策略编辑 IAM 策略

  • 内联策略 – 由您创建和管理的策略,直接嵌入在单个用户、组或角色中。大多数情况下,我们不建议使用内联策略。

要了解如何在托管策略或内联策略之间选择,请参阅托管策略与内联策略

基于资源的策略

基于资源的策略是附加到资源 (如 Amazon S3 存储桶) 的 JSON 策略文档。这些策略授予指定的委托人对该资源执行特定操作的权限,并定义这在哪些条件下适用。基于资源的策略是内联策略。没有基于托管资源的策略。

要启用跨账户访问,您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的委托人。将跨账户委托人添加到基于资源的策略只是建立信任关系工作的一半而已。当委托人和资源位于单独的 AWS 账户中时,还必须使用基于身份的策略授予对资源的委托人实体访问权限。但是,如果基于资源的策略向同一个账户中的委托人授予访问权限,则不需要额外的基于身份的策略。

IAM 服务仅支持一种类型的基于资源的策略(称为角色信任策略),这种策略附加到 IAM 角色。由于 IAM 角色同时是支持基于资源的策略的身份和资源,因此,您必须同时将信任策略和基于身份的策略附加到 IAM 角色。信任策略定义哪些委托人实体(账户、用户、角色和联合身份用户)可以代入该角色。要了解 IAM 角色如何与其他基于资源的策略不同,请参阅IAM 角色与基于资源的策略有何不同

要了解哪些其他服务支持基于资源的策略,请参阅使用 IAM 的 AWS 服务。要了解基于资源的策略的更多信息,请参阅基于身份的策略和基于资源的策略

IAM 权限边界

权限边界是一项高级功能,借助该功能,您可以设置基于身份的策略可以授予 IAM 实体的最大权限。当您设置实体的权限边界时,该实体只能执行其基于身份的策略和其权限边界同时允许的操作。指定用户或角色作为委托人的基于资源的策略不受权限边界限制。任一项策略中的显式拒绝将覆盖允许。有关权限边界的更多信息,请参阅IAM 实体的权限边界

服务控制策略 (SCP)

AWS Organizations 是用于分组和集中管理企业拥有的 AWS 账户的服务。如果在组织内启用了所有功能,则可对任意或全部账户应用服务控制策略 (SCP)。SCP 是指定组织或组织单元 (OU) 的最大权限的 JSON 策略。SCP 限制成员账户中实体的权限,包括每个 AWS 账户根用户。任一项策略中的显式拒绝将覆盖允许。

有关 组织 和 SCP 的更多信息,请参阅 AWS Organizations 用户指南中的关于服务控制策略

访问控制策略 (ACL)

访问控制策略 (ACL) 允许您控制其他账户中的哪些委托人可以访问资源。不能使用 ACL 控制同一账户中的委托人的访问权限。ACL 类似于基于资源的策略,但它们是唯一不使用 JSON 策略文档格式的策略类型。Amazon S3、AWS WAF 和 Amazon VPC 是支持 ACL 的服务示例。要了解有关 ACL 的更多信息,请参阅Amazon Simple Storage Service 开发人员指南中的访问控制列表 (ACL) 概述

会话策略

会话策略是当您以编程方式为角色或联合身份用户创建临时会话时作为参数传递的高级策略。会话的权限来自用于创建会话的 IAM 实体(用户或角色)的基于身份的策略以及会话策略。权限也可以来自基于资源的策略。任一项策略中的显式拒绝将覆盖允许。

您可以使用 AssumeRoleAssumeRoleWithSAMLAssumeRoleWithWebIdentity API 操作以编程方式创建角色会话并传递会话策略。生成的会话仅具有由该角色的基于身份的策略和会话策略这两者授予的权限。有关创建角色会话的更多信息,请参阅 请求临时安全凭证

当您创建联合身份用户会话时,您使用 IAM 用户的访问密钥以编程方式调用 GetFederationToken API 操作。当您执行此操作并传递会话策略时,生成的会话仅具有由 IAM 用户的基于身份的策略和会话策略这两者授予的权限。有关创建联合身份用户的更多信息,请参阅 GetFederationToken—通过自定义身份代理进行联合

如果基于资源的策略将用户或角色的 ARN 指定为委托人,则在创建会话前,来自基于资源的策略的权限将添加到相应角色或用户的基于身份的策略。会话策略限制由基于资源的策略和基于身份的策略授予的总权限。生成的会话具有会话策略以及基于资源的策略(或基于身份的策略)的权限。


          评估会话策略以及指定实体 ARN 的基于资源的策略

如果基于资源的策略将会话的 ARN 指定为委托人,则在创建会话后,将添加来自基于资源的策略的权限。基于资源的策略权限不受会话策略限制。生成的会话具有基于资源的策略的所有权限以及由基于身份的策略和会话策略这两者授予的权限。


          评估会话策略以及指定会话 ARN 的基于资源的策略

如果权限边界设置用于创建会话的用户或角色的最大权限,则生成的会话仅具有会话策略、权限边界和基于身份的权限策略中的权限。


          评估会话策略以及权限边界

策略和根用户

AWS 账户根用户 受一些策略类型的影响,而不受其他策略类型的影响。您不能将基于身份的策略附加到 根用户,也不能为 根用户 设置权限边界。不过,您可以在基于资源的策略或 ACL 中将 根用户 指定为委托人。作为账户的成员,根用户 受账户的任何 SCP 的影响。

JSON 策略概述

大多数策略在 AWS 中存储为 JSON 文档。基于身份的策略和用于设置权限边界的策略是您附加到用户或角色的 JSON 策略文档。基于资源的策略是附加到资源的 JSON 策略文档。SCP 是附加到 AWS Organizations 组织单元 (OU) 的使用限制语法的 JSON 策略文档。ACL 也可附加到资源,但必须使用不同的语法。会话策略是您在代入角色会话时提供的 JSON 策略。

您无需了解 JSON 语法。您可以使用 AWS 管理控制台中的可视化编辑器创建和编辑客户托管策略,而无需使用 JSON。不过,如果您选择使用适用于组的内联策略或复杂策略,则仍需使用控制台在 JSON 编辑器中创建和编辑这些策略。有关使用可视化编辑器的更多信息,请参阅创建 IAM 策略编辑 IAM 策略

JSON 策略文档结构

如下图所示,JSON 策略文档包含以下元素:

  • 可选的策略范围信息(位于文件顶部)

  • 一个或多个单独语句

每个语句都包含有关单个权限的信息。如果一个策略包含多个语句,则 AWS 会在评估它们时跨这些语句应用逻辑 OR。如果有多个策略应用于请求,则 AWS 会在评估它们时跨所有这些策略应用逻辑 OR


          JSON 策略文档结构

语句中的信息均含在一系列的元素内。

  • Version – 指定要使用的策略语言的版本。作为最佳实践,请使用最新的 2012-10-17 版本。

  • Statement – 使用此主要策略元素作为以下元素的容器。可以在一个策略中包含多个语句。

  • Sid – 包含可选的语句 ID 来区分您的语句。

  • Effect – 使用 AllowDeny 来指示策略是允许还是拒绝访问。

  • Principal – 指示要允许或拒绝访问的账户、用户、角色或联合身份用户。如果要创建策略以附加到用户或角色,则不能包含此元素。委托人暗示为该用户或角色。

  • Action – 包含策略允许或拒绝的操作的列表。

  • Resource – 指定操作应用于的资源的列表。

  • Condition(可选)– 指定策略在哪些情况下授予权限。

要了解上述及其他更高级的策略元素,请参阅IAM JSON 策略元素参考

多个声明和多个策略

如果要为实体(用户、组或角色)定义多个权限,可以在单个策略中使用多个语句或附加多个策略。如果您尝试在单个语句中定义多个权限,则策略可能没有授予预期访问权限。作为最佳实践,请按资源类型分解策略。

由于策略的大小有限,可能需要对更复杂的权限使用多个策略。在单独的客户托管策略中创建权限的功能分组也是个好主意。例如,为 IAM 用户管理创建一个策略,为自我管理创建一个策略,并为 S3 存储桶管理创建另一个策略。无论多个语句和多个策略如何组合,AWS 都会以相同方式评估您的策略。

例如,以下策略具有三个语句,其中每个语句在单个账户中定义一组单独的权限。这些语句定义以下权限:

  • Sid(语句 ID)为 FirstStatement 的第一个语句让具有附加策略的用户更改自己的密码。此语句中的 Resource 元素是“*”(这表示“所有资源”),但是实际上,ChangePassword API 操作(或等效的 change-password CLI 命令)仅影响提出请求的用户的密码。

  • 第二个语句使用户可以列出其 AWS 账户中的所有 Amazon S3 存储桶。此语句中的 Resource 元素是 "*"(这表示“所有资源”)。但由于策略没有为其他账户中的资源授予访问权限,因此,用户只能列出自己的 AWS 账户中的存储桶。

  • 第三个语句允许用户列出和检索名为 confidential-data 的存储桶中的任何对象,但是仅当使用 Multi-Factor Authentication (MFA) 对用户进行了身份验证时才能如此。策略中的 Condition 元素将强制实施 MFA 身份验证。

    如果策略语句包含 Condition 元素,则仅当 Condition 元素计算为 true 时,语句才有效。在此示例中,Condition 在用户进行了 MFA 身份验证时计算为 true。如果用户没有进行 MFA 身份验证,则此 Condition 计算为 false。在这种情况下,此策略中的第三个语句不会应用,因此用户将无法访问 confidential-data 存储桶。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "FirstStatement", "Effect": "Allow", "Action": ["iam:ChangePassword"], "Resource": "*" }, { "Sid": "SecondStatement", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Sid": "ThirdStatement", "Effect": "Allow", "Action": [ "s3:List*", "s3:Get*" ], "Resource": [ "arn:aws-cn:s3:::confidential-data", "arn:aws-cn:s3:::confidential-data/*" ], "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}} } ] }

JSON 策略语法示例

以下基于身份的策略允许暗示的委托人列出名为 example_bucket 的单个 Amazon S3 存储桶:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws-cn:s3:::example_bucket" } }

以下基于资源的策略可附加到 Amazon S3 存储桶。此策略允许特定 AWS 账户的成员在名为 mybucket 的存储桶中执行任何 Amazon S3 操作。它允许可对存储桶或其中的对象执行的任何操作。(因为该策略仅向该账户授予信任,所以仍必须向该账户中的各个用户授予执行指定 Amazon S3 操作的权限。)

{ "Version": "2012-10-17", "Id": "S3-Account-Permissions", "Statement": [{ "Sid": "1", "Effect": "Allow", "Principal": {"AWS": ["arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:root"]}, "Action": "s3:*", "Resource": [ "arn:aws-cn:s3:::mybucket", "arn:aws-cn:s3:::mybucket/*" ] }] }

要查看常见场景的示例策略,请参阅IAM 基于身份的策略示例