AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 AWS Identity and Access Management 控制访问

使用 AWS Identity and Access Management (IAM),您可以创建 IAM 用户,以便控制可访问您 AWS 账户中资源的对象。您可以将 IAM 与 AWS CloudFormation 结合使用以控制用户使用 AWS CloudFormation 可以执行的操作,例如,是否可以查看堆栈模板、创建堆栈或删除堆栈。

除了 AWS CloudFormation 操作之外,您还可以管理哪些 AWS 服务和资源对每个用户可用。这样一来,您可以控制用户在使用 AWS CloudFormation 时可访问哪些资源。例如,您可以指定哪些用户可以创建 Amazon EC2 实例、终止数据库实例或更新 VPC。只要这些用户使用 AWS CloudFormation 执行这些操作,这些相同的权限就会被应用。

有关您能够对访问实话控制的所有服务的更多信息,请参阅IAM 用户指南 中的支持 IAM 的 AWS 服务

AWS CloudFormation 操作

当您在 AWS 账户中创建一个组或一个 IAM 用户时,您可以将 IAM 策略与该组或该用户关联,用于指定要授予的权限。例如,假设您有一个入门级开发人员组。您可以创建包含所有入门级开发人员的 Junior application developers 组。然后,您可以将一个只允许用户查看 AWS CloudFormation 堆栈的策略与该组关联。在这种情况下,您可能有一个类似下面示例的策略:

例 授予查看堆栈权限的示例策略

{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources" ], "Resource":"*" }] }

该策略授予 Action 元素中列出的所有 DescribeStack API 操作的权限。

注意

如果语句中未指定堆栈名称或 ID,则还必须对 Resource 资源使用 * 通配符向该操作授予使用所有资源的权限。

除了 AWS CloudFormation 操作之外,创建或删除堆栈的 IAM 用户还需要依赖于堆栈模板的其他权限。例如,如果您有一个描述 Amazon SQS 队列的模板,则用户必须具有 Amazon SQS 操作的对应权限才能成功创建堆栈,如下面的示例策略所示:

例 授予创建和查看堆栈操作以及所有 Amazon SQS 操作的示例策略

{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "sqs:*", "cloudformation:CreateStack", "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResources", "cloudformation:GetTemplate", "cloudformation:ValidateTemplate" ], "Resource":"*" }] }

有关可以允许或拒绝的所有 AWS CloudFormation 操作的列表,请参阅 AWS CloudFormation API Reference

AWS CloudFormation 控制台特定的操作

使用 AWS CloudFormation 控制台的 IAM 用户需要使用 AWS Command Line Interface或 AWS CloudFormation API 时不需要的其他权限。与 CLI 和 API 比较,控制台提供了需要额外权限的其他功能,如将模板上传到 AWS 特定的参数类型的 Amazon S3 存储桶和下拉列表。

对于所有以下操作,授予对所有资源的权限;不限制对特定堆栈或存储桶的操作。

以下必需操作仅由 AWS CloudFormation 控制台使用,未记录在 API 参考中。该操作允许用户将模板上传到 Amazon S3 存储桶。

cloudformation:CreateUploadBucket

当用户上传模板时,他们需要以下 Amazon S3 权限:

s3:PutObject s3:ListBucket s3:GetObject s3:CreateBucket

对于具有 AWS 特定的参数类型的模板,用户需要进行对应的描述 API 调用的权限。例如,如果模板包含 AWS::EC2::KeyPair::KeyName 参数类型,用户需要调用 EC2 DescribeKeyPairs 操作的权限 (该操作是控制台获取参数下拉列表的值的方法)。以下示例是用户需对其他参数类型执行的操作:

ec2:DescribeSecurityGroups (for the AWS::EC2::SecurityGroup::Id parameter type) ec2:DescribeSubnets (for the Subnet::Id parameter type) ec2:DescribeVpcs (for the AWS::EC2::VPC::Id parameter type)

AWS CloudFormation 资源

AWS CloudFormation 支持资源级权限,因此您可以指定针对特定堆栈的操作,如下述策略所示:

例 拒绝 MyProductionStack 的删除和更新堆栈操作的策略示例

{ "Version":"2012-10-17", "Statement":[{ "Effect":"Deny", "Action":[ "cloudformation:DeleteStack", "cloudformation:UpdateStack" ], "Resource":"arn:aws:cloudformation:us-east-1:123456789012:stack/MyProductionStack/*" }] }

示例策略在堆栈名称末尾使用通配符,因此拒绝对整个堆栈 ID(如 arn:aws:cloudformation:us-east-1:123456789012:stack/MyProductionStack/abc9dbf0-43c2-11e3-a6e8-50fa526be49c)和堆栈名称(如 MyProductionStack)执行删除堆栈和更新堆栈操作。

目前,Resource 元素中仅支持 AWS CloudFormation 堆栈 ID。

AWS CloudFormation 条件

在 IAM 策略中,您可以指定控制策略何时生效的条件。例如,您可以定义一条策略,使 IAM 用户只能在指定了特定的模板 URL 时才能创建堆栈。您可以定义 AWS CloudFormation 特定的条件和 AWS 范围的条件,如 DateLessThan,该条件指定策略停止生效的时间。有关 AWS 范围条件列表的更多信息,请参阅 IAM 用户指南 中的 IAM 策略元素参考

注意

不要使用 aws:SourceIp AWS 范围的条件。AWS CloudFormation 通过使用其自身的 IP 地址(而不是原始请求的 IP 地址)来配置资源。例如,在创建堆栈时,AWS CloudFormation 从它的 IP 地址发送请求来启动 EC2 实例或创建 S3 存储桶,而不是来自 CreateStack 调用或 aws cloudformation create-stack 命令的 IP 地址。

下面的列表介绍特定于 AWS CloudFormation 的条件。这些条件仅在用户创建或更新堆栈时应用:

cloudformation:ChangeSetName

要与策略关联的 AWS CloudFormation 更改集名称。使用此条件可控制 IAM 用户可执行或删除的更改集。

cloudformation:ResourceTypes

要与策略关联的模板资源的类型,如 AWS::EC2::Instance。使用此条件控制 IAM 用户在创建或更新堆栈时可以使用的资源类型。系统将核对此条件和用户在 ResourceTypes 参数(当前只支持 CLI 和 API 请求)中声明的资源类型。使用此参数时,用户必须指定其模板中的所有资源类型。有关 ResourceTypes 参数的更多信息,请参阅 AWS CloudFormation API Reference 中的 CreateStack 操作。

下面的列表介绍如何定义资源类型。有关资源类型列表的信息,请参阅AWS 资源类型参考

AWS::*

指定所有 AWS 资源。

AWS::service_name::*

指定用于特定 AWS 服务的所有资源。

AWS::service_name::resource_type

指定特定的 AWS 资源类型,如 AWS::EC2::Instance(所有 EC2 实例)。

Custom::*

指定所有自定义资源。

Custom::resource_type

指定特定的自定义资源类型(在模板中定义)。

cloudformation:RoleARN

要与策略关联的 IAM 服务角色的 Amazon 资源名称 (ARN)。使用此条件可控制 IAM 用户在处理堆栈或更改集时可使用的服务角色。

cloudformation:StackPolicyUrl

要与策略关联的 Amazon S3 堆栈策略 URL。使用此条件控制在创建或更新堆栈操作期间 IAM 用户可将哪些堆栈策略关联到堆栈。有关堆栈策略的更多信息,请参阅防止更新堆栈资源

注意

要确保 IAM 用户只能使用您上传的堆栈策略创建或更新堆栈,请针对这些用户将 S3 存储桶设为 read only

cloudformation:TemplateUrl

要与策略关联的 Amazon S3 模板 URL。使用此条件控制 IAM 用户在创建或更新堆栈时可以使用的模板。

注意

要确保 IAM 用户只能使用您上传的模板创建或更新堆栈,请针对这些用户将 S3 存储桶设为 read only

示例

下面的示例策略使用户只能使用 https://s3.amazonaws.com/testbucket/test.template 模板 URL 创建或更新堆栈。

例 模板 URL 条件

{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack", "cloudformation:UpdateStack" ], "Resource" : "*", "Condition" : { "ForAllValues:StringEquals" : { "cloudformation:TemplateUrl" : [ "https://s3.amazonaws.com/testbucket/test.template" ] } } } ] }

下面的示例策略允许用户创建堆栈,但在堆栈的模板包含来自 IAM 服务的任意资源时拒绝请求。此策略还要求用户指定 ResourceTypes 参数(只适用于 CLI 和 API 请求)。此策略使用显式拒绝语句,以便在任何其他策略授予额外权限时,此策略始终保持有效(显式拒绝语句始终覆盖显式允许语句)。

例 资源类型条件

{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*" }, { "Effect" : "Deny", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*", "Condition" : { "ForAnyValue:StringLikeIfExists" : { "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ] } } }, { "Effect": "Deny", "Action" : [ "cloudformation:CreateStack" ], "Resource": "*", "Condition": { "Null": { "cloudformation:ResourceTypes": "true" } } } ] }

下面的示例策略与上一示例类似。此策略允许用户创建堆栈,但当堆栈模板包含来自 IAM 服务的任意资源时除外。它还要求用户指定 ResourceTypes 参数(只适用于 CLI 和 API 请求)。此策略更简单,但不使用显式拒绝语句。其他授予额外权限的策略可以覆盖此策略。

例 资源类型条件

{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack" ], "Resource" : "*", "Condition" : { "ForAllValues:StringNotLikeIfExists" : { "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ] }, "Null":{ "cloudformation:ResourceTypes": "false" } } } ] }

确认 AWS CloudFormation 模板中的 IAM 资源

在创建堆栈之前, AWS CloudFormation 验证您的模板后。验证期间,AWS CloudFormation 会检查模板是否具有它可能创建的 IAM 资源。IAM 资源(如具有完全访问权限的 IAM 用户)可以访问和修改您的 AWS 账户中的任何资源。因此,建议您在继续之前检查与每个 IAM 资源关联的权限,以便您不会无意中创建具有升级权限的资源。为了确保您已执行此操作,您必须确认模板包含这些资源,从而在 AWS CloudFormation 创建堆栈之前为其提供指定功能。

您可以使用 AWS CloudFormation 控制台、AWS Command Line Interface (CLI) 或 API 确认 AWS CloudFormation 模板的功能:

  • 在 AWS CloudFormation 控制台中,在“Create Stack”或“Update Stack”向导的 Review 页面上,选择 I acknowledge that this template may create IAM resources

  • 在 CLI 中,当您使用 aws cloudformation create-stackaws cloudformation update-stack 命令时,请指定 --capabilities 参数的 CAPABILITY_IAMCAPABILITY_NAMED_IAM 值。如果您的模板包含 IAM 资源,则可以指定任一功能。如果您的模板包含 IAM 资源的自定义名称,则必须指定 CAPABILITY_NAMED_IAM

  • 在 API 中,当您使用 CreateStackUpdateStack 操作时,请指定 Capabilities.member.1=CAPABILITY_IAMCapabilities.member.1=CAPABILITY_NAMED_IAM。如果您的模板包含 IAM 资源,则可以指定任一功能。如果您的模板包含 IAM 资源的自定义名称,则必须指定 CAPABILITY_NAMED_IAM

重要

如果您的模板包含自定义命名的 IAM 资源,请不要重用同一模板来创建多个堆栈。IAM 资源在您的账户内必须是全局唯一的。如果使用同一模板在不同的区域中创建多个堆栈,则您的堆栈可能会共享同一 IAM 资源,而不是每个堆栈均具有唯一资源。在堆栈之间共享资源可能会造成无法恢复的意外后果。例如,如果您在一个堆栈中删除或更新共享的 IAM 资源,则将无意中修改其他堆栈的资源。

管理 Amazon EC2 实例上运行的应用程序的凭证

如果您有应用程序在 Amazon EC2 实例上运行,并且需要向 AWS 资源(如 Amazon S3 存储桶或 DynamoDB 表)发出请求,则应用程序会要求提供 AWS 安全凭证。但是,在启动的每个实例中分配并嵌入长期安全凭证非常困难,而且存在潜在安全风险。建议您创建在启动 Amazon EC2 实例时与该实例关联的 IAM 角色,而不是使用长期凭证,如 IAM 用户凭证。然后,应用程序可以从 Amazon EC2 实例获取临时安全凭证。您不必在实例上嵌入长期凭证。此外,为简化凭证管理工作,您可以为多个 Amazon EC2 实例指定一个角色;无需为每个实例创建唯一凭证。

有关演示如何使用角色启动实例的模板代码段,请参阅 IAM 角色模板示例

注意

使用临时安全凭证的实例上的应用程序可以调用任何 AWS CloudFormation 操作。然而,因为 AWS CloudFormation 与很多其他 AWS 服务交互,您必须确定要使用的所有服务都支持临时安全凭证。有关更多信息,请参阅支持 AWS STS 的 AWS 服务

授予临时访问权限(联合访问)

在某些情况下,您可能希望授予没有 AWS 凭证的用户对您的 AWS 账户的临时访问权限。您可以使用 AWS Security Token Service (AWS STS),而不必在每次授予临时访问权限时创建和删除长期凭证。例如,您可以使用 IAM 角色。通过一个 IAM 角色,您可以通过编程方式创建并分配很多临时安全凭证(包括访问密钥、秘密访问密钥和安全令牌)。这些凭证的有效期有限,过期后不能用于访问您的 AWS 账户。您还可以创建多个 IAM 角色以授予各个用户不同级别的权限。IAM 角色对于像联合身份和单一登录这种情况十分有用。

联合身份是可以跨多个系统使用的独特身份。对于已建立本地身份系统(如 LDAP 或 Active Directory)的企业用户,可以使用本地身份系统处理所有身份验证。在对用户进行身份验证后,您可从相应的 IAM 用户或角色提供临时安全凭证。举例来说,您可以创建一个 administrators 角色和一个 developers 角色,其中,管理员对 AWS 账户拥有完全访问权限,而开发人员只拥有使用 AWS CloudFormation 堆栈的权限。经过身份验证后,管理员有权获取 administrators 角色的临时安全凭证。而开发人员只能获取 developers 角色的临时安全凭证。

您还可以授予联合用户对 AWS 管理控制台的访问权限。使用本地身份系统对用户进行身份验证后,您可以通过编程来构造一个临时 URL 以提供对 AWS 管理控制台的直接访问。用户使用临时 URL 时无需登录 AWS,因为已经过身份验证(单一登录)。此外,因为 URL 是从用户的临时安全凭证构造的,所以通过这些凭证提供的权限可确定用户在 AWS 管理控制台中拥有的权限。

您可使用多种不同的 AWS STS API 来生成临时安全凭证。有关要使用的 API 的更多信息,请参阅使用临时安全凭证中的获取临时安全凭证的方式

重要

在使用从 GetFederationToken API 生成的临时安全凭证时,您无法使用 IAM。相反,如果您需要使用 IAM,请使用来自角色的临时安全凭证。

AWS CloudFormation 与许多其他 AWS 服务交互。将临时安全凭证用于 AWS CloudFormation 时,请确认要使用的所有服务都支持临时安全凭证。有关更多信息,请参阅支持 AWS STS 的 AWS 服务

有关更多信息,请参阅使用临时安全凭证 中的以下相关资源: