使用 AWS Identity and Access Management 控制 CloudFormation 访问权限 - AWS CloudFormation

使用 AWS Identity and Access Management 控制 CloudFormation 访问权限

通过 AWS Identity and Access Management (IAM),您可以创建 IAM 用户并控制他们对 AWS 账户 中特定资源的访问。使用 IAM 时,您可以控制用户对 CloudFormation 执行的操作,例如,是否可以查看堆栈模板、创建堆栈或删除堆栈。

除了 CloudFormation 特定的操作之外,您还可以管理每个用户可以使用哪些 AWS 服务和资源。这样您可以控制用户在使用 CloudFormation 时可访问的具体资源。例如,您可以指定哪些用户可以创建 Amazon EC2 实例、终止数据库实例或更新 VPC。这些权限在他们使用 CloudFormation 执行这些操作时同样适用。

使用以下各节中的信息来控制谁可以访问 CloudFormation。我们还将探讨如何在模板中授权 IAM 资源创建,为 EC2 实例上运行的应用程序提供所需的权限,以及如何使用临时安全凭证来增强您 AWS 环境的安全性。

为 CloudFormation 定义基于 IAM 身份的策略

要访问 CloudFormation,您需要创建和分配 IAM 策略,赋予 IAM 身份(如用户或角色)调用所需 API 操作的权限。

通过使用 IAM 基于身份的策略,可以指定允许或拒绝的操作和资源以及允许或拒绝操作的条件。CloudFormation 支持特定的操作、资源和条件秘钥。

如果您刚接触 IAM ,则需要先熟悉 IAM JSON 策略的要素。有关更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略元素参考。要了解如何创建 IAM 策略,请完成 IAM 文档中的教程创建并附加您的第一个客户管理型策略

CloudFormation 的策略操作

在 IAM 策略语句的 Action 要素中,您可以指定 CloudFormation 所提供的任意 API 操作。您必须在操作名称前加上小写字符串 cloudformation:。例如:cloudformation:CreateStackcloudformation:CreateChangeSetcloudformation:UpdateStack

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

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

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

"Action": "cloudformation:Get*"

要查看与 cloudformation 服务前缀相关的操作的完整列表,请参阅《服务授权参考》中 AWS CloudFormation 的操作、资源和条件密钥以及 AWS 云端控制 API 的操作、资源和条件密钥

示例

以下内容介绍了授予查看 CloudFormation 堆栈权限的权限策略示例。

例 1:授予查看堆栈权限的示例策略
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources" ], "Resource":"*" }] }

创建或删除堆栈的用户需要根据其堆栈模板获得额外权限。例如,如果您的模板描述了 Amazon SQS 队列,则用户必须同时拥有 CloudFormation 和 Amazon SQS 操作的权限,如以下策略示例所示。

例 2:授予创建和查看堆栈操作以及所有 Amazon SQS 操作的示例策略
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "sqs:*", "cloudformation:CreateStack", "cloudformation:DescribeStacks", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResources", "cloudformation:GetTemplate", "cloudformation:ValidateTemplate" ], "Resource":"*" }] }

CloudFormation 的控制台特定操作

除了 AWS Command Line Interface 或 CloudFormation API 所需的权限外,CloudFormation 控制台的用户还需要额外的权限。这些权限支持特定于控制台的功能,例如将模板上传到 Amazon S3 存储桶以及 AWS 特定参数类型的下拉列表。

对于下面列出的所有操作,请向所有资源授予权限;不要将其限制于特定的堆栈或存储桶。

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

  • cloudformation:CreateUploadBucket

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

  • s3:PutObject

  • s3:ListBucket

  • s3:GetObject

  • s3:CreateBucket

要查看具有 AWS 特定参数类型的模板的参数下拉列表中的值,用户需要有进行对应的描述 API 调用的权限。例如,在模板中使用这些参数类型时需要以下权限:

  • ec2:DescribeKeyPairsAWS::EC2::KeyPair::KeyName 参数类型所必需。

  • ec2:DescribeSecurityGroupsAWS::EC2::SecurityGroup::Id 参数类型所必需。

  • ec2:DescribeSubnetsAWS::EC2::Subnet::Id 参数类型所必需。

  • ec2:DescribeVpcsAWS::EC2::VPC::Id 参数类型所必需。

有关 AWS 特定类型的更多信息,请参阅 使用 CloudFormation 提供的参数类型在运行时指定现有资源

CloudFormation 的策略资源

在 IAM policy 声明中,Resource 元素指定了该声明涵盖的一个或多个对象。对于 CloudFormation,每个 IAM 策略语句适用于您使用 Amazon 资源名称 (ARN) 指定的资源。具体 ARN 格式取决于资源。

有关 CloudFormation 资源类型及其 ARN 的完整列表,请参阅服务授权参考AWS CloudFormation 定义的资源类型。要了解您可以通过每个资源的 ARN 指定哪些操作,请参阅 AWS CloudFormation 定义的操作

如以下策略示例所示,您可以为特定堆栈指定操作。当您提供 ARN 时,请将 placeholder text 替换为特定于资源的信息。

例 1:拒绝指定堆栈的删除和更新堆栈操作的策略示例
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Deny", "Action":[ "cloudformation:DeleteStack", "cloudformation:UpdateStack" ], "Resource":"arn:aws:cloudformation:region:account-id:stack/MyProductionStack/*" }] }

上述策略在堆栈名称末尾使用了一个通配符,因此删除堆栈和更新堆栈都会被拒绝,无论是整个堆栈 ID(如 arn:aws:cloudformation:region:account-id:stack/MyProductionStack/abc9dbf0-43c2-11e3-a6e8-50fa526be49c)还是堆栈名称(如 MyProductionStack)。

要允许 AWS::Serverless 转换创建变更集,请包含 arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31 资源级权限,如以下策略所示。

例 2:允许为指定转换执行创建更改集操作的示例策略
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "cloudformation:CreateChangeSet" ], "Resource": "arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31" }] }

CloudFormation 的策略条件键

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

注意

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

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

cloudformation:ChangeSetName

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

cloudformation:ImportResourceTypes

要与策略关联的模板资源类型,如 AWS::EC2::Instance。可以使用该条件控制在 用户将资源导入到堆栈时可以使用的资源类型。系统将核对此条件和用户在 ResourcesToImport 参数(当前只支持 AWS CLI 和 API 请求)中声明的资源类型。在使用该参数时,必须指定您希望用户在导入操作期间控制的所有资源类型。有关 ResourcesToImport 参数的更多信息,请参阅《AWS CloudFormation API 参考》中的 CreateChangeSet 操作。

有关可能的 ResourcesToImport 列表,请参阅资源类型支持

使用包含三个部分的资源命名约定来指定用户可以使用的资源类型,上至组织中的所有资源,下至单个资源类型。

organization::*

指定给定组织的所有资源类型。

organization::service_name::*

指定给定组织内指定服务的所有资源类型。

organization::service_name::resource_type

指定一个特定的资源类型。

例如:

AWS::*

指定所有支持的 AWS 资源类型。

AWS::service_name::*

为特定的 AWS 服务指定所有支持的资源。

AWS::service_name::resource_type

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

cloudformation:ResourceTypes

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

有关资源类型列表的信息,请参阅AWS 资源和属性类型参考

使用包含三个部分的资源命名约定来指定用户可以使用的资源类型,上至组织中的所有资源,下至单个资源类型。

organization::*

指定给定组织的所有资源类型。

organization::service_name::*

指定给定组织内指定服务的所有资源类型。

organization::service_name::resource_type

指定一个特定的资源类型。

例如:

AWS::*

指定所有支持的 AWS 资源类型。

AWS::service_name::*

为特定的 AWS 服务指定所有支持的资源。

AWS::service_name::resource_type

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

Alexa::ASK::*

指定 Alexa Skill Kit 中的所有资源类型。

Alexa::ASK::Skill

指定单个 Alexa::ASK::Skill 资源类型。

Custom::*

指定所有自定义资源。

有关更多信息,请参阅 使用自定义资源创建自定义预置逻辑

Custom::resource_type

指定特定的自定义资源类型。

有关更多信息,请参阅 使用自定义资源创建自定义预置逻辑

cloudformation:RoleARN

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

cloudformation:StackPolicyUrl

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

注意

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

cloudformation:TemplateUrl

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

注意

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

注意

以下 CloudFormation 特定条件适用于同名的 API 参数:

  • cloudformation:ChangeSetName

  • cloudformation:RoleARN

  • cloudformation:StackPolicyUrl

  • cloudformation:TemplateUrl

例如,cloudformation:TemplateUrl 仅适用于 CreateStackUpdateStackCreateChangeSet API 的 TemplateUrl 参数。

有关使用条件密钥控制访问的 IAM 策略示例,请参阅 CloudFormation 基于 IAM 身份的策略示例

确认 CloudFormation 模板中的 IAM 资源

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

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

  • 在 CloudFormation 控制台中,在“创建堆栈”或“更新堆栈”向导的配置堆栈选项页面上,选择我确认此模板可能创建 IAM 资源

  • 在 AWS CLI 中,当您使用 create-stackupdate-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 角色模板示例

注意

实例上使用临时安全凭证的应用程序可以调用任何 CloudFormation 操作。但由于 CloudFormation 会与多种其他 AWS 服务交互,您必须确定要使用的所有服务都支持临时安全凭证。有关接受临时安全凭证的服务列表,请参阅 IAM 用户指南中的使用 IAM 的 AWS 服务

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

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

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

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

您可使用多种不同的 AWS STS API 来生成临时安全凭证。有关使用哪个 API 的更多信息,请参阅《IAM 用户指南》中的 比较 AWS STS 凭证

重要

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

CloudFormation 会与多种其他 AWS 服务交互。将临时安全凭证用于 CloudFormation 时,请确认要使用的所有服务都支持临时安全凭证。有关接受临时安全凭证的服务列表,请参阅 IAM 用户指南中的使用 IAM 的 AWS 服务

有关更多信息,请参阅《IAM 用户指南》中的以下相关资源: