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

策略和权限

您可以创建策略并将其附加到 IAM 身份或 AWS 资源以管理 AWS 中的访问。策略是 AWS 中的对象;在与实体或资源相关联时,策略定义了它们的权限。在委托人 (如用户) 发出请求时,AWS 将评估这些策略。策略中的权限确定是允许还是拒绝请求。大多数策略在 AWS 中存储为 JSON 文档。

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

策略类型

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

  • 基于身份的策略 – 将托管策略和内联策略附加到 IAM 身份,如用户、用户属于的组和角色。

  • 基于资源的策略 – 将内联策略附加到资源。基于资源的策略的最常见示例是 Amazon S3 存储桶策略和 IAM 角色信任策略。

  • 组织 SCP – 使用 AWS Organizations 服务控制策略 (SCP) 将权限边界应用于 AWS Organizations 组织或组织单元 (OU)。

  • 访问控制列表 (ACL) – 使用 ACL 来控制哪些委托人可以访问资源。ACL 类似于基于资源的策略,但它们是唯一不使用 JSON 策略文档结构的策略类型。

策略权限类别

策略可分类为权限策略或权限边界。

  • 权限策略 – 将权限策略附加到 AWS 中的对象以定义该对象的权限。在单个账户中,AWS 一起评估所有权限策略。权限策略是最常用的策略。您可以使用以下策略类型作为权限策略:

    • 基于身份的策略 – 将托管策略或内联策略附加到 IAM 用户、组或角色时,该策略定义该实体的权限。

    • 基于资源的策略 – 将 JSON 策略文档附加到资源时,定义该资源的权限。服务必须支持基于资源的策略。

    • 访问控制列表 (ACL) – 将 ACL 附加到资源时,定义具有访问该资源的权限的委托人的列表。资源必须支持 ACL。

  • 权限边界 – 您还可以使用策略来定义委托人的权限边界。权限边界控制委托人可以具有的最大权限。权限边界是一项高级的 AWS 功能。当多种类型的策略应用于请求时,AWS 会单独评估每个权限边界。您可以在以下情况下应用权限边界:

    • 组织 – 您可以使用 AWS Organizations 服务控制策略 (SCP) 将权限边界应用于 AWS Organizations 组织或组织单元 (OU)。

    • IAM 用户或角色 – 您可以对用户或角色的权限边界使用托管策略。有关更多信息,请参阅 IAM 身份的权限边界

基于身份的策略

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

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

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

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

  • 内联策略 – 由您创建和管理并直接嵌入 到单个用户、组或角色的策略。

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

基于资源的策略

基于资源的策略是附加到资源 (如 Amazon S3 存储桶) 的 JSON 策略文档。这些策略允许您指定,指定的委托人可在何种条件下对该资源执行哪些操作。基于资源的策略是内联策略,没有基于资源的托管策略。请记住,将委托人添加到基于资源的策略只是建立信任关系工作的一半而已。您还必须使用基于身份的策略来授予委托人访问资源的权限。

虽然 IAM 身份从技术上是 AWS 资源,但无法将基于资源的策略附加到 IAM 身份。您必须在 IAM 中使用基于身份的策略。要了解哪些服务支持基于资源的策略,请参阅使用 IAM 的 AWS 服务。要了解基于资源的策略的更多信息,请参阅基于身份的策略和基于资源的策略

信任策略 是附加到角色的基于资源的策略。它们定义哪些委托人可代入角色。在 IAM 中创建角色时,该角色必须具有信任策略和权限策略。信任策略指示谁可以代入角色。权限策略指示他们可使用该角色执行哪些操作。请记住,在该账户的管理员向可信任的实体授予代入角色的权限之前,任何可信任的实体都无法代入角色。有关更多信息,请参阅 向用户授予切换角色的权限

服务控制策略 (SCP)

AWS Organizations 是用于分组的服务,可集中管理企业拥有的 AWS 账户。如果在组织内启用了所有功能,则可对任意或全部账户应用服务控制策略 (SCP)。SCP 是将权限边界应用于 AWS Organizations 组织或组织单元 (OU) 的 JSON 策略。此权限边界控制这些账户中的实体可访问的最多服务和操作。

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

访问控制策略 (ACL)

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

AWS STS 角色代入期间传递的策略

IAM 角色可以具有一个权限策略和一个权限边界。在使用 AWS STS AssumeRole* API 操作之一代入角色时,还可以传递另一个权限策略来进一步限制 API 操作返回的临时安全凭证的权限。如果角色包含多种权限类型,则角色的访问权限由所有适用的策略类型的交集决定。

例如,考虑具有允许所有 Amazon EC2 和 CloudWatch 操作的权限边界的角色。该角色具有仅允许 ec2:StartInstancesec2:StopInstancess3:ListBucket 操作的权限策略。管理员在 AWS STS 角色代入期间传递仅允许启动和停止 MyCompanyInstance Amazon EC2 实例和列出 MyCompanyBucket Amazon S3 存储桶的权限策略。在 AWS 评估这三种策略类型时,生成的访问权限是这三种策略类型的交集。在此示例中,代入角色的任何人只能启动和停止 MyCompanyInstance Amazon EC2 实例。他们无法执行仅出现在一个或两个策略类型中的操作。

策略和根用户

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

JSON 策略概述

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

您无需了解 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/*" ] }] }

要查看常见场景的示例策略,请参阅示例策略