策略结构 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

策略结构

以下主题说明 IAM policy 的结构。

策略语法

IAM policy 是包含一个或多个语句的 JSON 文档。每个语句的结构如下。

{ "Statement":[{ "Effect":"effect", "Action":"action", "Resource":"arn", "Condition":{ "condition":{ "key":"value" } } } ] }

组成语句的各个元素如下:

  • Effect:effect 可以是 AllowDeny。默认情况下 用户没有使用资源和 API 操作的权限,因此,所有请求均会被拒绝。显式允许将覆盖默认规则。显式拒绝将覆盖任何允许。

  • Actionaction 是对其授予或拒绝权限的特定 API 操作。要了解有关指定 action 的信息,请参阅 Amazon EC2 操作

  • Resource:受操作影响的资源。有些 Amazon EC2 API 操作允许您在策略中包括该操作可以创建或修改的特定资源。您可使用 Amazon Resource Name (ARN) 来指定资源,或使用通配符 (*) 以指明该语句适用于所有资源。有关更多信息,请参阅Amazon EC2 API 操作支持的资源级权限

  • Condition:条件是可选的。它们可以用于控制策略生效的时间。想要了解更多有关为 Amazon EC2 指定条件的信息,请参阅 Amazon EC2 的条件键

有关策略要求的更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略元素参考。有关适用于 Amazon EC2 的 IAM policy 语句示例,请参阅 有关使用 Amazon CLI 或 Amazon 开发工具包的示例策略

Amazon EC2 操作

在 IAM policy 语句中,您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 Amazon EC2,请使用以下前缀为 API 操作命名:ec2:。例如:ec2:RunInstancesec2:CreateImage

要在单个语句中指定多项操作,请使用逗号将它们隔开,如下所示:

"Action": ["ec2:action1", "ec2:action2"]

您也可以使用通配符指定多项操作。例如,您可以指定名称以单词“Describe”开头的所有操作,如下所示:

"Action": "ec2:Describe*"
注意

当前, Amazon EC2 描述 * API 操作都不支持资源级权限。有关 Amazon EC2 资源级权限更多信息,请参阅 适用于 Amazon EC2 的 IAM policy

要指定所有 Amazon EC2 API 操作,请使用 * 通配符,如下所示:

"Action": "ec2:*"

有关 Amazon EC2 操作的列表,请参阅 Amazon EC2 服务授权参考中定义的操作

Amazon EC2 API 操作支持的资源级权限

资源级权限指的是能够指定允许用户对哪些资源执行操作的能力。Amazon EC2 部分支持资源级权限。这意味着对于某些 Amazon EC2 操作,您可以控制何时允许用户执行操作 (基于必须满足的条件)或是允许用户使用的特定资源。例如,您可以向用户授予启动实例的权限,但是仅限特定类型的实例,并且只能使用特定的 AMI。

要在 IAM policy 语句中指定资源,请使用其 Amazon Resource Name (ARN)。有关指定 ARN 值的详细信息,请参阅 适用于 Amazon EC2 的 Amazon Resource Name (ARN)。如果 API 操作不支持单个 ARN,则必须使用通配符 (*) 来指定所有资源都可能受到操作的影响。

要查看标识哪些 Amazon EC2 API 操作支持资源级权限的表,以及您可以在策略中使用的 ARN 和条件键,请参阅 Amazon EC2 的操作、资源和条件键

请记住,您可以在用于 Amazon EC2 API 操作的 IAM policy 中应用基于标签的资源级权限。这可让您更好地控制用户可创建、修改或使用哪些资源。有关更多信息,请参阅在创建过程中授予标记资源的权限

适用于 Amazon EC2 的 Amazon Resource Name (ARN)

每个 IAM policy 语句适用于您使用资源的 ARN 指定的资源。

ARN 的一般语法如下:

arn:aws:[service]:[region]:[account-id]:resourceType/resourcePath
service

服务 (例如,ec2)。

region

资源所在区域(例如,us-east-1)。

account-id

Amazon 账户 ID,不包含连字符(例如,123456789012)。

resourceType

资源类型 (例如,instance)。

resourcePath

识别资源的路径。您可以在路径中使用 * 通配符。

例如,您可以使用特定实例 (i-1234567890abcdef0) 的 ARN 在语句中指定它,如下所示。

"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"

您可以使用 * 通配符指定属于特定账户的所有实例,如下所示。

"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/*"

还可以使用 * 通配符指定属于特定账户的所有 Amazon EC2 资源,如下所示。

"Resource": "arn:aws:ec2:us-east-1:123456789012:*"

要指定所有资源,或者如果特定 API 操作不支持 ARN,请在 Resource 元素中使用 * 通配符,如下所示。

"Resource": "*"

许多 Amazon EC2 API 操作涉及多种资源。例如,AttachVolume 将一个 Amazon EBS 卷附加到一个实例,从而使用户必须获得相应权限才能使用该卷和该实例。要在单个语句中指定多个资源,请使用逗号分隔其 ARN,如下所示。

"Resource": ["arn1", "arn2"]

有关 Amazon EC2 资源的 ARN 列表,请参阅 Amazon EC2 定义的资源类型

Amazon EC2 的条件键

在策略语句中,您可以选择性指定控制策略生效时间的条件。每个条件都包含一个或多个键值对。条件键不区分大小写。我们已经定义了 Amazon 全局条件键以及其他特定于服务的条件键。

有关 Amazon EC2 的服务特定条件键的列表,请参阅 Amazon EC2 的条件键。Amazon EC2 还实施了 Amazon 全局条件键。有关更多信息,请参阅 IAM 用户指南中的在所有请求中可用的信息

要在 IAM policy 中使用条件键,请使用 Condition 语句。例如,以下策略授予用户添加和删除任何安全组的入站和出站规则的权限。它使用 ec2:Vpc 条件键来指定只能对特定 VPC 中的安全组执行这些操作。

{ "Version": "2012-10-17", "Statement":[{ "Effect":"Allow", "Action": [ "ec2:AuthorizeSecurityGroupIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress", "ec2:RevokeSecurityGroupEgress"], "Resource": "arn:aws:ec2:region:account:security-group/*", "Condition": { "StringEquals": { "ec2:Vpc": "arn:aws:ec2:region:account:vpc/vpc-11223344556677889" } } } ] }

如果您指定了多个条件或在单一条件中指定了多个密钥,我们将通过逻辑 AND 操作对其进行评估。如果您在单一条件中指定了一个具有多个值的密钥,我们将通过逻辑 OR 操作对其进行评估。必须满足所有条件才能授予权限。

在指定条件时,您也可使用占位符。有关更多信息,请参阅 IAM 用户指南 中的 IAM policy 元素:变量和标签

重要

许多条件键是特定于某个资源的,而某些 API 操作会使用多个资源。如果您使用条件键编写策略,请使用语句的 Resource 元素指定要应用该条件键的资源。否则,该策略可能会完全阻止用户执行操作,因为针对未应用条件键的资源的条件检查失败。如果您不想指定资源,或者如果您已将策略的 Action 元素编写为包含多个 API 操作,则必须使用 ...IfExists 条件类型以确保对不使用条件键的资源忽略条件键。有关更多信息,请参阅《IAM 用户指南》中的 ...IfExists 条件

所有 Amazon EC2 操作都支持 aws:RequestedRegionec2:Region 条件键。有关更多信息,请参阅示例:限制对特定区域的访问权限

ec2:SourceInstanceARN 条件键

ec2:SourceInstanceARN 条件键可用于指定作为请求源的实例的 ARN 的条件。这是一个 Amazon 全局条件键,并不特定于任何服务。有关策略示例,请参阅 Amazon EC2:附加或分离卷至 EC2 实例示例:允许特定实例查看其他 Amazon 服务中的资源ec2:SourceInstanceARN 键不能用作变量来填充语句中 Resource 元素的 ARN。

有关适用于 Amazon EC2 的策略语句示例,请参阅 有关使用 Amazon CLI 或 Amazon 开发工具包的示例策略

ec2:Attribute 条件键

ec2:Attribute 条件键可用于按资源的属性筛选访问权限的条件。条件键仅支持原始数据类型(例如字符串或整数)的属性或者仅具有属性的复杂 AttributeValue 对象,例如 ModifyImageAttribute API 操作的描述ImdsSupport 对象。

重要

条件键不能用于具有多个属性的复杂对象,例如 ModifyImageAttribute API 操作的 LaunchPermission 对象。

例如,以下策略使用 ec2:Attribute/Description 条件键按 ModifyImageAttribute API 操作的复杂 Description(描述)对象筛选访问权限。条件键仅允许将图像描述修改为 ProductionDevelopment 的请求。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:ModifyImageAttribute", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { "ec2:Attribute/Description": [ "Production", "Development" ] } } } ] }

以下示例策略使用 ec2:Attribute 条件键按 ModifyImageAttribute API 操作的主要 Attribute(属性)属性筛选访问权限。条件键拒绝尝试修改图像描述的所有请求。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:ModifyImageAttribute", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { "ec2:Attribute": "Description" } } } ] }

ec2:ResourceID 条件键

通过指定的 API 操作使用以下 ec2:ResourceID 条件键时,条件键值用于指定 API 操作创建的结果资源。ec2:ResourceID 条件键不能用于指定 API 请求中特定的源资源。如果您通过指定 API 使用以下其中一个 ec2:ResourceID 条件键,则必须始终指定通配符 (*)。如果您指定不同的值,则在运行期间条件始终解析为 *。例如,要通过 CopyImage API 使用 ec2:ImageId 条件键,则必须按如下方式指定条件键:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CopyImage", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { ec2:ImageID": "*" } } } ] }
条件键 API 操作
ec2:DhcpOptionsID
  • CreateDhcpOptions

ec2:ImageID
  • CopyImage

  • CreateImage

  • ImportImage

  • RegisterImage

ec2:InstanceID
  • RunInstances

  • ImportInstance

ec2:InternetGatewayID
  • CreateInternetGateway

ec2:NetworkAclID
  • CreateNetworkAcl

ec2:NetworkInterfaceID
  • CreateNetworkInterface

ec2:PlacementGroupName
  • CreatePlacementGroup

ec2:RouteTableID
  • CreateRouteTable

ec2:SecurityGroupID
  • CreateSecurityGroup

ec2:SnapshotID
  • CopySnapshot

  • CreateSnapshot

  • CreateSnapshots

  • ImportSnapshots

ec2:SubnetID
  • CreateSubnet

ec2:VolumeID
  • CreateVolume

  • ImportVolume

ec2:VpcID
  • CreateVpc

ec2:VpcPeeringConnectionID
  • CreateVpcPeeringConnection

我们建议您避免通过这些 API 操作使用 ec2:ResourceID 条件键。相反,如果您需要根据特定的资源 ID 筛选访问权限,我们建议您使用 Resource 策略元素,如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CopyImage", "Resource": "arn:aws:ec2:us-east-1::image/ami-01234567890abcdef" } ] }

检查用户是否具有所需权限

在您创建 IAM policy 后,建议您检查它是否允许用户使用策略生效前所需的特定 API 操作和资源。

首先,创建一个用于测试目的的用户,然后将您创建的 IAM policy 与该测试用户关联起来。然后,以测试用户身份提出请求。

如果您测试的 Amazon EC2 操作创建或修改了一种资源,您在提交请求时应该使用 DryRun 参数(或运行带有 --dry-run 选项的 Amazon CLI 命令)。在这种情况下,调用会完成身份验证检查,但是不会完成该操作。例如,您可以检查用户能否终止特定实例,但不会真的终止它。如果测试用户具有所需的权限,请求会返回 DryRunOperation;否则,它会返回 UnauthorizedOperation

如果策略未授予用户您所期望的权限,您可以根据需要调节策略并重新测试,直到您获得预期的结果。

重要

在其生效之前,它需要几分钟时间将策略更改为适合状态。因此,我们建议您在测试策略更新前,等候五分钟的时间。

如果身份验证检查失败,该请求将返回一个带有诊断信息的代码消息。您可以使用 DecodeAuthorizationMessage 操作对消息进行解码。有关更多信息,请参阅 Amazon Security Token Service API Reference 中的 DecodeAuthorizationMessage,以及 Amazon CLI Command Reference 中的 decode-authorization-message