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

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

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

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

有关您可以控制访问权限的所有服务的更多信息,请参阅《IAM 用户指南》中的支持 IAM 的 AWS 服务

CloudFormation 操作

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

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

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

重要

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

除 CloudFormation 操作之外,创建或删除堆栈的用户还需要额外的权限,具体取决于堆栈模板。例如,如果您有一个描述 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":"*" }] }

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

CloudFormation 控制台专用操作

使用 CloudFormation 控制台的用户需要额外的权限,但使用 AWS Command Line Interface 或 CloudFormation API 时将不需要这些额外权限。与 AWS CLI 和 API 相比,控制台提供了需要额外权限的其他功能,如将模板上传到 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)

CloudFormation 资源

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) 执行删除堆栈和更新堆栈操作。

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

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

授予服务托管的堆栈集权限的示例策略

以下示例 IAM policy 向委托人实体(用户、角色或组)授予服务托管的堆栈集权限。具有此策略的用户只能对其模板包含 Amazon S3 资源类型(AWS::S3::*)或 AWS::SES::ConfigurationSet 资源类型的堆栈集执行操作。如果使用 ID 123456789012 登录到组织管理账户,则用户还可以仅对以 OU(ID 为 ou-1fsfsrsdsfrewr)为目标的堆栈集执行操作,并可以对以 AWS 账户(ID 为 987654321012)为目标的堆栈集(ID 为 stack-set-id)执行操作。

如果堆栈集模板包含除策略中指定的资源类型以外的其他资源类型,或者如果部署的目标 OU 或账户 ID 不是在对应管理账户和堆栈集的策略中指定的内容,则堆栈集操作将失败。

这些策略限制仅在堆栈集操作以 us-east-1us-west-2eu-west-2 AWS 区域 为目标时适用。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": [ "arn:aws:cloudformation:*:*:stackset/*", "arn:aws:cloudformation:*:*:type/resource/AWS-S3-*", "arn:aws:cloudformation:us-west-2::type/resource/AWS-SES-ConfigurationSet", "arn:aws:cloudformation:*:123456789012:stackset-target/*/ou-1fsfsrsdsfrewr", "arn:aws:cloudformation:*:123456789012:stackset-target/stack-set-id/987654321012" ], "Condition": { "ForAllValues:StringEqualsIgnoreCase": { "cloudformation:TargetRegion": [ "us-east-1", "us-west-2", "eu-west-1" ] } } } ] }

CloudFormation 条件

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

注意

不要使用 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 参数。

示例

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

例 模板 URL 条件
{ "Version":"2012-10-17", "Statement":[ { "Effect" : "Allow", "Action" : [ "cloudformation:CreateStack", "cloudformation:UpdateStack" ], "Resource" : "*", "Condition" : { "StringEquals" : { "cloudformation:TemplateUrl" : [ "https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template" ] } } } ] }

以下示例策略允许用户完成导入操作以外的所有 CloudFormation 操作。

例 导入资源类型条件
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllStackOperations", "Effect": "Allow", "Action": "cloudformation:*", "Resource": "*" }, { "Sid": "DenyImport", "Effect": "Deny", "Action": "cloudformation:*", "Resource": "*", "Condition": { "ForAnyValue:StringLike": { "cloudformation:ImportResourceTypes": [ "*" ] } } } ] }

以下示例策略允许所有堆栈操作以及仅针对指定资源(在该示例中为 AWS::S3::Bucket)的导入操作。

例 导入资源类型条件
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowImport", "Effect": "Allow", "Action": "cloudformation:*", "Resource": "*" "Condition": { "ForAllValues:StringEqualsIgnoreCase": { "cloudformation:ImportResourceTypes": [ "AWS::S3::Bucket" ] } } } ] }

以下示例策略允许用户创建堆栈,但在堆栈的模板包含来自 IAM 服务的任意资源时拒绝请求。此策略还要求用户指定 ResourceTypes 参数(仅适用于 AWS 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 参数(仅适用于 AWS CLI 和 API 请求)。此策略更简单,但不使用显式拒绝语句。其他授予额外权限的策略可以覆盖此策略。

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

确认 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 用户指南》中的以下相关资源: