AWS Identity and Access Management
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

IAM 策略

策略是 AWS 中的一个实体;在附加到身份或资源时,策略定义了它们的权限。在委托人 (如用户) 发出请求时,AWS 将评估这些策略。策略中的权限确定是允许还是拒绝请求。策略作为 JSON 文档存储在 AWS 中,它们作为基于身份的策略 附加到委托人或作为基于资源的策略 附加到资源。

基于身份的策略

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

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

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

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

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

    要了解如何选择是使用托管策略还是内联策略,请参阅托管策略与内联策略

基于资源的策略

基于资源的策略是附加到资源 (如 Amazon S3 存储桶) 的 JSON 策略文档。这些策略控制指定的委托人可在何种条件下对该资源执行哪些操作。基于资源的策略是内联策略,没有基于资源的托管策略。

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

信任策略 是附加到角色的基于资源的策略,这些策略定义了可担任该角色的委托人。在 IAM 中创建角色时,该角色必须具有以下两项内容:第一个是指示哪个用户可担任该角色的信任策略。第二个是指示他们可使用该角色执行哪些操作的权限策略。请记住,将账户添加到角色的信任策略只是建立信任关系工作的一半而已。默认情况下,可信账户中的任何用户均无法代入角色,直至该账户的管理员向用户授予代入角色的权限。有关更多信息,请参阅 向用户授予切换角色的权限

重要

在整个 AWS 文档中,在提及 IAM 策略而未提到上面的任何特定类别时,我们指的是基于身份的客户托管策略。

JSON 策略概述

策略作为 JSON 文档存储在 AWS 中,它们作为基于身份的策略 附加到委托人或作为基于资源的策略 附加到资源。您无需了解 JSON 语法。您可以使用可视化编辑器创建和编辑客户托管策略,而无需使用 JSON。不过,如果您选择针对组使用内联策略,您仍需在 JSON 编辑器中创建和编辑这些策略。有关使用可视化编辑器的更多信息,请参阅创建 IAM 策略编辑 IAM 策略

JSON 策略简介

要为用户、组、角色或资源分配权限,请创建一个 JSON 策略,这是一个定义权限的文档。策略文档包含以下元素:

  • Effect – 策略允许还是拒绝访问

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

  • Resource – 作为操作目标的资源的列表

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

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

策略是使用 JSON 存储的文档。策略包含一个或多个语句,每个语句描述一组权限。以下为一个简单的策略示例。

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

您可以将该策略附加到一个 IAM 身份 (组、用户或角色)。如果这是该身份的唯一策略,则仅允许该身份对一个 Amazon S3 存储桶 (example_bucket) 执行该操作 (ListBucket)。

要为资源指定权限,您可以为该资源 (例如 Amazon SNS 主题、Amazon S3 存储桶或 Amazon Glacier 文件库) 附加基于资源的策略。在该情况下,策略必须包含有关允许哪些人 (称为委托人) 访问资源的信息。(对于基于身份的策略,委托人是该策略附加到的 IAM 用户,或者是从组中获取该策略的用户。)有关更多信息,请参阅 基于身份的策略和基于资源的策略

以下示例说明了一个可附加到 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 策略控制访问不受接口限制。例如,您可以为一个用户提供密码以访问 AWS 管理控制台。该用户 (或该用户所属的任何组) 的策略控制用户可在 AWS 管理控制台中执行的操作。或者,您可以为该用户提供 AWS 访问密钥,以便对 AWS 进行 API 调用。这些策略将通过使用这些访问密钥进行身份验证的库或客户端控制该用户可调用哪些操作。

有关一般情况下的基本策略示例,请参阅示例策略

可以从 AWS 管理控制台中的 IAM 控制台使用 AWS 托管策略和策略生成器。有关在控制台中创建策略的更多信息,请参阅管理 IAM 策略。此外,您可以在线使用 AWS 策略生成器创建用于 AWS 产品的策略,无需访问控制台。

多个声明和多个策略

您可以将多个策略附加到某个实体。如果您想向一个实体授予多个许可,可以将这些许可分为多个策略,也可以都涵盖在一个策略中。

通常,策略中的每个声明都包含有关单个许可的信息。如果您的策略包含多个声明,则在评估时将跨声明应用逻辑 OR。类似地,如果多个策略适用于某个请求,则在评估时将跨策略应用逻辑 OR。

用户通常拥有多个适用的策略 (但不一定必须附加)。例如,IAM 用户 Bob 可能拥有加载到他的策略,同时拥有附加至他加载到群组的其他策略。此外,他还可能访问具有自己的存储段策略 (基于资源的策略) 的 Amazon S3 存储段。将评估所有适用的策略,而且结果始终是授予或拒绝访问。有关我们使用的评估逻辑的更多信息,请参阅 IAM JSON 策略评估逻辑

策略结构

每个策略是一个 JSON 格式文件。如下图所示,一个策略包含:

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

  • 一个或多个单独语句

每个语句都是有关单独权限的核心信息。如果一个策略包含多个语句,那么在评估时 AWS 将跨这些语句应用一个 OR 逻辑值。如果多个策略都适用于一个请求,那么在评估时 AWS 将跨这些策略应用一个 OR 逻辑值。

普通策略结构

语句中的信息均含在一系列的元素内。有关这些元素的信息,请参阅IAM JSON 策略元素参考

例 包含多个语句的策略

策略通常包含多个语句,其中每个语句授予对一组不同资源的权限或是在特定条件下授予权限。例如,以下策略具有三个语句,每个语句授予一组单独的权限。假设策略所关联的用户或组位于 AWS 账户 123456789012 中。(策略不得引用其他账户中的资源。)这些语句执行以下操作:

  • 第一个语句 (Sid (语句 ID) 元素设置为 FirstStatement) 使用户可以管理自己的密码。此语句中的 Resource 元素是“*” (这表示“所有资源”),但是实际上,ChangePassword API (或等效的 change-password CLI 命令) 仅影响提出请求的用户的密码。

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

  • 通过使用第三个语句 ("Sid": "ThirdStatement"),用户可以列出和检索名为 confidential-data 的存储桶中的任何对象,但前提是使用由多重身份验证 (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"}} } ] }