

# 使用 Amazon Identity and Access Management 控制 CloudFormation 访问权限
使用 IAM 控制访问权限

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

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

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

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


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

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

如果您刚接触 IAM ，则需要先熟悉 IAM JSON 策略的要素。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM JSON 策略元素参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html)。要了解如何创建 IAM 策略，请完成 IAM 文档中的教程[创建并附加您的第一个客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_managed-policies.html)。

**Topics**
+ [

### CloudFormation 的策略操作
](#using-iam-actions)
+ [

### CloudFormation 的控制台特定操作
](#console-specific-actions)
+ [

### CloudFormation 的策略资源
](#resource-level-permissions)
+ [

### CloudFormation 的策略条件键
](#using-iam-conditions)

### CloudFormation 的策略操作


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

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

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

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

```
"Action": "cloudformation:Get*"
```

要查看与 `cloudformation` 服务前缀相关的操作的完整列表，请参阅*《服务授权参考》*中 Amazon CloudFormation 的操作、资源和条件密钥[以及 Amazon 云端控制 API 的操作、资源和条件密钥](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awscloudcontrolapi.html)。

#### 示例


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

**Example 1：授予查看堆栈权限的示例策略**    
****  

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

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

**Example 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 的控制台特定操作


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

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

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

当用户上传模板时，还需要以下 Amazon S3 权限：
+ `s3:PutObject`
+ `s3:ListBucket`
+ `s3:GetObject`
+ `s3:CreateBucket`

要查看具有 Amazon 特定参数类型的模板的参数下拉列表中的值，用户需要有进行对应的描述 API 调用的权限。例如，在模板中使用这些参数类型时需要以下权限：
+  `ec2:DescribeKeyPairs` – `AWS::EC2::KeyPair::KeyName` 参数类型所必需。
+ `ec2:DescribeSecurityGroups` – `AWS::EC2::SecurityGroup::Id` 参数类型所必需。
+ `ec2:DescribeSubnets` – `AWS::EC2::Subnet::Id` 参数类型所必需。
+ `ec2:DescribeVpcs` – `AWS::EC2::VPC::Id` 参数类型所必需。

有关 Amazon 特定类型的更多信息，请参阅 [使用 CloudFormation 提供的参数类型在运行时指定现有资源](cloudformation-supplied-parameter-types.md)。

### CloudFormation 的策略资源


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

有关 CloudFormation 资源类型及其 ARN 的完整列表，请参阅*服务授权参考*中 [Amazon CloudFormation 定义的资源类型](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awscloudformation.html#awscloudformation-resources-for-iam-policies)。要了解您可以通过每个资源的 ARN 指定哪些操作，请参阅 [Amazon CloudFormation 定义的操作](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awscloudformation.html#awscloudformation-actions-as-permissions)。

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

**Example 1：拒绝指定堆栈的删除和更新堆栈操作的策略示例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "cloudformation:DeleteStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "arn:aws:cloudformation:us-east-1:111122223333: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` 资源级权限，如以下策略所示。

**Example 2：允许为指定转换执行创建更改集操作的示例策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateChangeSet"
            ],
            "Resource": "arn:aws:cloudformation:us-east-1:aws:transform/Serverless-2016-10-31"
        }
    ]
}
```

### CloudFormation 的策略条件键


在 IAM 策略语句中，您可以选择性地指定控制策略生效时间的条件。例如，您可以定义一条策略，使用户只能在指定了特定的模板 URL 时才能创建堆栈。您可以定义特定于 CloudFormation 的条件和 Amazon 范围的条件，例如指定策略停止生效的时间的 `DateLessThan` 条件。有关 Amazon 范围条件列表的更多信息，请参阅《IAM 用户指南》中 [IAM 策略元素参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html#Condition)中的“条件”。**

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

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

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

`cloudformation:ImportResourceTypes`  
要与策略关联的模板资源类型，如 `AWS::EC2::Instance`。可以使用该条件控制在 用户将资源导入到堆栈时可以使用的资源类型。系统将核对此条件和用户在 `ResourcesToImport` 参数（当前只支持 Amazon CLI 和 API 请求）中声明的资源类型。在使用该参数时，必须指定您希望用户在导入操作期间控制的所有资源类型。有关 `ResourcesToImport` 参数的更多信息，请参阅《Amazon CloudFormation API 参考》**中的 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html) 操作。  
有关可能的 `ResourcesToImport` 列表，请参阅[资源类型支持](resource-import-supported-resources.md)。  
使用包含三个部分的资源命名约定来指定用户可以使用的资源类型，上至组织中的所有资源，下至单个资源类型。    
`organization::*`  
指定给定组织的所有资源类型。  
`organization::service_name::*`  
指定给定组织内指定服务的所有资源类型。  
`organization::service_name::resource_type`  
指定一个特定的资源类型。
例如：    
`AWS::*`  
指定所有支持的 Amazon 资源类型。  
`AWS::service_name::*`  
为特定的 Amazon 服务指定所有支持的资源。  
`AWS::service_name::resource_type`  
指定特定的 Amazon 资源类型，如 `AWS::EC2::Instance`（所有 EC2 实例）。

`cloudformation:ResourceTypes`  
要与策略关联的模板资源的类型，如 `AWS::EC2::Instance`。使用此条件控制 用户在创建或更新堆栈时可以使用的资源类型。系统将核对此条件和用户在 `ResourceTypes` 参数（当前只支持 Amazon CLI 和 API 请求）中声明的资源类型。使用此参数时，用户必须指定其模板中的所有资源类型。有关 `ResourceTypes` 参数的更多信息，请参阅《Amazon CloudFormation API 参考》**中的 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateStack.html) 操作。  
要查看资源类型的列表，请参阅《[Amazon CloudFormation 模板参考指南》](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/introduction.html)。  
使用包含三个部分的资源命名约定来指定用户可以使用的资源类型，上至组织中的所有资源，下至单个资源类型。    
`organization::*`  
指定给定组织的所有资源类型。  
`organization::service_name::*`  
指定给定组织内指定服务的所有资源类型。  
`organization::service_name::resource_type`  
指定一个特定的资源类型。
例如：    
`AWS::*`  
指定所有支持的 Amazon 资源类型。  
`AWS::service_name::*`  
为特定的 Amazon 服务指定所有支持的资源。  
`AWS::service_name::resource_type`  
指定特定的 Amazon 资源类型，如 `AWS::EC2::Instance`（所有 EC2 实例）。  
`Alexa::ASK::*`  
指定 Alexa Skill Kit 中的所有资源类型。  
`Alexa::ASK::Skill`  
指定单个 [Alexa::ASK::Skill](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/alexa-resource-ask-skill.html) 资源类型。  
`Custom::*`  
指定所有自定义资源。  
有关更多信息，请参阅 [使用自定义资源创建自定义预置逻辑](template-custom-resources.md)。  
`Custom::resource_type`  
指定特定的自定义资源类型。  
有关更多信息，请参阅 [使用自定义资源创建自定义预置逻辑](template-custom-resources.md)。

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

`cloudformation:StackPolicyUrl`  
要与策略关联的 Amazon S3 堆栈策略 URL。使用此条件控制在创建或更新堆栈操作期间 用户可将哪些堆栈策略关联到堆栈。有关堆栈策略的更多信息，请参阅[防止更新堆栈资源](protect-stack-resources.md)。  
要确保用户只能使用您上传的堆栈策略创建或更新堆栈，请针对这些用户将 S3 存储桶设为只读。

`cloudformation:TemplateUrl`  
要与策略关联的 Amazon S3 模板 URL。使用此条件控制 用户在创建或更新堆栈时可以使用的模板。  
要确保用户只能使用您上传的模板创建或更新堆栈，请针对这些用户将 S3 存储桶设为只读。
以下 CloudFormation 特定条件适用于同名的 API 参数：  
+ `cloudformation:ChangeSetName`
+ `cloudformation:RoleARN`
+ `cloudformation:StackPolicyUrl`
+ `cloudformation:TemplateUrl`
例如，`cloudformation:TemplateUrl` 仅适用于 `CreateStack`、`UpdateStack` 和 `CreateChangeSet` API 的 `TemplateUrl` 参数。

有关使用条件密钥控制访问的 IAM 策略示例，请参阅 [CloudFormation 基于 IAM 身份的策略示例](security_iam_id-based-policy-examples.md)。

## 确认 CloudFormation 模板中的 IAM 资源


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

您可以使用 CloudFormation 控制台、Amazon Command Line Interface（Amazon CLI）或 API 来确认 CloudFormation 模板的功能：
+ 在 CloudFormation 控制台中，在“创建堆栈”或“更新堆栈”向导的**配置堆栈选项**页面上，选择**我确认此模板可能创建 IAM 资源**。
+ 在 Amazon CLI 中，当您使用 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack.html) 和 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack.html) 命令时，请指定 `--capabilities` 选项的 `CAPABILITY_IAM` 或 `CAPABILITY_NAMED_IAM` 值。如果您的模板包含 IAM 资源，则可以指定任一功能。如果您的模板包含 IAM 资源的自定义名称，则必须指定 `CAPABILITY_NAMED_IAM`。
+ 在 API 中，当您使用 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateStack.html) 和 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_UpdateStack.html) 操作时，请指定 `Capabilities.member.1=CAPABILITY_IAM` 或 `Capabilities.member.1=CAPABILITY_NAMED_IAM`。如果您的模板包含 IAM 资源，则可以指定任一功能。如果您的模板包含 IAM 资源的自定义名称，则必须指定 `CAPABILITY_NAMED_IAM`。

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

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


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

有关演示如何使用角色启动实例的模板代码段，请参阅 [IAM 角色模板示例](quickref-iam.md#scenarios-iamroles)。

**注意**  
实例上使用临时安全凭证的应用程序可以调用任何 CloudFormation 操作。但由于 CloudFormation 会与多种其他 Amazon 服务交互，您必须确定要使用的所有服务都支持临时安全凭证。有关接受临时安全凭证的服务列表，请参阅 *IAM 用户指南*中的[使用 IAM 的 Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## 授予临时访问权限（联合访问）


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

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

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

您可使用多种不同的 Amazon STS API 来生成临时安全凭证。有关使用哪个 API 的更多信息，请参阅《IAM 用户指南》中的 [比较 Amazon STS 凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_sts-comparison.html)**。

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

CloudFormation 会与多种其他 Amazon 服务交互。将临时安全凭证用于 CloudFormation 时，请确认要使用的所有服务都支持临时安全凭证。有关接受临时安全凭证的服务列表，请参阅 *IAM 用户指南*中的[使用 IAM 的 Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

有关更多信息，请参阅《IAM 用户指南》**中的以下相关资源：
+ [临时凭证的常见情形](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp.html#sts-introduction)
+ [使自定义身份凭证代理程序能够访问 Amazon 控制台](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html)

# CloudFormation 基于 IAM 身份的策略示例
基于身份的策略示例

默认情况下，用户和角色没有创建或修改 CloudFormation 资源的权限。他们也无法使用 Amazon Web Services 管理控制台、Amazon Command Line Interface (Amazon CLI) 或 Amazon API 执行任务。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。管理员随后可以向角色添加 IAM 策略，用户可以代入角色。有关更多信息，请参阅 [为 CloudFormation 定义基于 IAM 身份的策略](control-access-with-iam.md#iam-id-based-policies)。

以下示例介绍了您可用于允许或拒绝使用一个或多个 CloudFormation 操作的权限的策略语句。

**Topics**
+ [

## 需要特定的模板 URL
](#w2aac43c23c17b9)
+ [

## 拒绝所有 CloudFormation 导入操作
](#w2aac43c23c17c11)
+ [

## 允许对特定资源类型进行导入操作
](#w2aac43c23c17c13)
+ [

## 拒绝堆栈模板中的 IAM 资源
](#w2aac43c23c17c15)
+ [

## 允许使用特定资源类型创建堆栈
](#w2aac43c23c17c17)
+ [

## 根据资源变更型 API 操作控制访问权限
](#w2aac43c23c17c19)
+ [

## 根据区域和资源类型限制堆栈集操作
](#resource-level-permissions-service-managed-stack-set)
+ [

## 允许所有 IaC 生成器操作
](#iam-policy-example-for-iac-generator)

## 需要特定的模板 URL


以下策略只授予使用 `https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template` 模板 URL 创建或更新堆栈的权限。

------
#### [ JSON ]

****  

```
{
    "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 导入操作


以下策略授予完成 CloudFormation 所有操作（导入操作除外）的权限。

------
#### [ JSON ]

****  

```
{ 
  "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`）进行导入操作的权限。

------
#### [ JSON ]

****  

```
{ 
  "Version":"2012-10-17",		 	 	  
  "Statement": [ 
    { 
      "Sid": "AllowImport",
      "Effect": "Allow", 
      "Action": "cloudformation:*", 
      "Resource": "*",
      "Condition": { 
        "ForAllValues:StringEqualsIgnoreCase": {
          "cloudformation:ImportResourceTypes": [ 
            "AWS::S3::Bucket" 
          ] 
        } 
      } 
    } 
  ] 
}
```

------

## 拒绝堆栈模板中的 IAM 资源


以下策略授予创建堆栈的权限，但如果堆栈模板包含 IAM 服务中的任何资源，则拒绝请求。此策略还要求用户指定 `ResourceTypes` 参数（仅适用于 Amazon CLI 和 API 请求）。此策略使用显式拒绝语句，以便在任何其他策略授予额外权限时，此策略始终保持有效（显式拒绝语句始终覆盖显式允许语句）。

------
#### [ JSON ]

****  

```
{
  "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` 参数（仅适用于 Amazon CLI 和 API 请求）。此策略更简单，但不使用显式拒绝语句。其他授予额外权限的策略可以覆盖此策略。

------
#### [ JSON ]

****  

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

------

## 根据资源变更型 API 操作控制访问权限


以下策略授予根据资源变更型 API 操作名称筛选访问的权限。这可以控制 IAM 用户可以使用哪些 API 在堆栈或堆栈集上添加或删除标签。用于添加或删除标签的操作应作为条件键的值进行添加。以下策略会授予对变更操作 `CreateStack` 的 `TagResource` 权限和 `UntagResource` 权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "CreateActionConditionPolicyForTagUntagResources",
        "Effect": "Allow",
        "Action": [
            "cloudformation:TagResource",
            "cloudformation:UntagResource"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "cloudformation:CreateAction": [
                    "CreateStack"
                ]
            }
        }
    }]
}
```

------

## 根据区域和资源类型限制堆栈集操作


以下策略授予服务托管堆栈集权限。具有此策略的用户只能对其模板包含 Amazon S3 资源类型（`AWS::S3::*`）或 `AWS::SES::ConfigurationSet` 资源类型的堆栈集执行操作。如果使用 ID `123456789012` 登录到组织管理账户，则用户还可以仅对以 OU（ID 为 `ou-1fsfsrsdsfrewr`）为目标的堆栈集执行操作，并可以仅对以 Amazon Web Services 账户（ID 为 `987654321012`）为目标的堆栈集（ID 为 `stack-set-id`）执行操作。

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

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

------
#### [ JSON ]

****  

```
{
    "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:111122223333:type/resource/AWS-SES-ConfigurationSet",
                "arn:aws:cloudformation:*:111122223333:stackset-target/*/ou-1fsfsrsdsfrewr",
                "arn:aws:cloudformation:*:111122223333:stackset-target/stack-set-id/444455556666"
            ],
            "Condition": {
                "ForAllValues:StringEqualsIgnoreCase": {
                    "cloudformation:TargetRegion": [
                        "us-east-1",
                        "us-west-2",
                        "eu-west-1"
                    ]
                }
            }
        }
    ]
}
```

------

## 允许所有 IaC 生成器操作


以下策略允许访问与 IaC 生成器资源扫描和模板管理相关的 CloudFormation 操作。第一条语句授予描述、列出和启动资源扫描的权限。它还允许访问其他必要的权限（`cloudformation:GetResource`、`cloudformation:ListResources` 和 `cloudformation:ListTypes`）、使 IaC 生成器能够检索有关资源和可用资源类型的信息。第二条语句授予创建、删除、描述、列出和更新所生成模板的全部权限。

您还必须向使用 IaC 生成器扫描资源的任何人授予目标 Amazon 服务的读取权限。有关更多信息，请参阅 [扫描资源所需的 IAM 权限](generate-IaC.md#iac-generator-permissions)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"ResourceScanningOperations",
            "Effect":"Allow",
            "Action":[
                "cloudformation:DescribeResourceScan",
                "cloudformation:GetResource",
                "cloudformation:ListResources",
                "cloudformation:ListResourceScanRelatedResources",
                "cloudformation:ListResourceScanResources",
                "cloudformation:ListResourceScans",
                "cloudformation:ListTypes",
                "cloudformation:StartResourceScan"
            ],
            "Resource":"*"
        },
        {
            "Sid":"TemplateGeneration",
            "Effect":"Allow",
            "Action":[
                "cloudformation:CreateGeneratedTemplate",
                "cloudformation:DeleteGeneratedTemplate",
                "cloudformation:DescribeGeneratedTemplate",
                "cloudformation:GetResource",
                "cloudformation:GetGeneratedTemplate",
                "cloudformation:ListGeneratedTemplates",
                "cloudformation:UpdateGeneratedTemplate"
            ],
            "Resource":"*"
        }
    ]
}
```

------

# 适用于 Amazon CloudFormation 的 Amazon 托管式策略
Amazon 托管策略

Amazon 托管式策略是由 Amazon 创建和管理的独立策略。Amazon 托管式策略旨在为许多常见使用案例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住，Amazon 托管式策略可能不会为您的特定使用案例授予最低权限，因为它们可供所有 Amazon 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 Amazon 托管式策略中定义的权限。如果 Amazon 更新在 Amazon 托管策略中定义的权限，则更新会影响该策略所附加到的所有主体身份（用户、组和角色）。当新的 Amazon 服务启动或新的 API 操作可用于现有服务时，Amazon 最有可能更新 Amazon 托管策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## Amazon 托管式策略：AWSCloudFormationFullAccess
AWSCloudFormationFullAccess

您可以将 `AWSCloudFormationFullAccess` 附加到您的用户、组和角色。

此策略授予的权限允许针对所有 CloudFormation 操作和资源的完全访问。

**权限详细信息**

该策略包含以下权限。
+ `cloudformation` – 允许主体对所有资源执行所有 CloudFormation 操作。

要查看此策略的权限，请参阅《Amazon 托管式策略参考指南》**中的 [AWSCloudFormationFullAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSCloudFormationFullAccess.html)。

## Amazon 托管式策略：AWSCloudFormationReadOnlyAccess
AWSCloudFormationReadOnlyAccess

您可以将 `AWSCloudFormationReadOnlyAccess` 附加到您的用户、组和角色。

此策略授予的权限允许针对 CloudFormation 操作和资源的只读访问。

**权限详细信息**

该策略包含以下权限。
+ `cloudformation` – 允许主体执行只读 CloudFormation 操作，例如描述堆栈、列出资源和查看模板，但不允许创建、更新或删除堆栈。

要查看此策略的权限，请参阅《Amazon 托管式策略参考指南》**中的 [AWSCloudFormationReadOnlyAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSCloudFormationReadOnlyAccess.html)。

## CloudFormation 对 Amazon 托管式策略的更新
策略更新

查看有关 CloudFormation 的 Amazon 托管式策略更新的详细信息（从该服务开始跟踪这些更改开始）。有关此页面更改的自动提示，请订阅 CloudFormation 文档历史记录页面上的 RSS 源。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 更新现有策略  |  CloudFormation 添加了新权限，以允许使用 `cloudformation:BatchDescribe*` 操作执行批量描述操作。  | 2026 年 1 月 30 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 更新现有策略  |  CloudFormation 添加了新权限，以允许使用 `cloudformation:Detect*` 操作来使用堆栈偏差检测功能。  | 2019 年 11 月 13 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 更新现有策略  |  CloudFormation 添加了新权限，以允许 `cloudformation:EstimateTemplateCost`、`cloudformation:Get*` 和 `cloudformation:ValidateTemplate` 操作。  | 2017 年 11 月 2 日 | 
|  [AWSCloudFormationFullAccess](#security-iam-awsmanpol-AWSCloudFormationFullAccess) – 新策略  |  CloudFormation 添加了新的 Amazon 托管式策略，此策略提供对 CloudFormation 操作和资源的完全访问权限。  | 2019 年 7 月 26 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 更新现有策略  |  CloudFormation 添加了新权限，以允许使用 `cloudformation:DetectStackDrift` 和 `cloudformation:DetectStackResourceDrift` 操作来进行堆栈偏差检测。  | 2019 年 2 月 6 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 新策略  |  CloudFormation 添加了新的 Amazon 托管式策略，此策略提供对 CloudFormation 操作和资源的只读访问权限。  | 2015 年 2 月 6 日 | 
|  CloudFormation 开启了更改跟踪。  |  CloudFormation 为其 Amazon 托管式策略开启了更改跟踪。  | 2015 年 2 月 6 日 | 

# Amazon CloudFormation 服务角色


*服务角色*是一个 Amazon Identity and Access Management（IAM）角色，允许 CloudFormation 代表您调用堆栈中的资源。您可以指定一个将允许 CloudFormation 创建、更新或删除堆栈资源的 IAM 角色。默认情况下，CloudFormation 会使用根据您的用户凭证为堆栈操作生成的临时会话。如果指定了服务角色，CloudFormation 将使用该角色的凭证。

使用服务角色可以显式指定 CloudFormation 可执行的操作，这些操作可能不会总是与您或其他用户可执行的操作相同。例如，您可能具有管理员权限，但您可以限制 CloudFormation 的访问权限以仅允许 Amazon EC2 操作。

您可以使用 IAM 服务创建服务角色及其权限策略。有关创建服务角色的更多信息，请参阅《IAM 用户指南》**中的[创建向 Amazon 服务委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-service.html)。将 CloudFormation (`cloudformation.amazonaws.com`) 指定为可代入该角色的服务。

要将服务角色与堆栈关联，请在创建堆栈时指定角色。有关更多信息，请参阅 [配置堆栈选项](cfn-console-create-stack.md#configure-stack-options)。您还可以在控制台中更新堆栈时或通过 API [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_DeleteStack.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_DeleteStack.html) 堆栈时更改服务角色。在指定服务角色之前，请确保您具有传递该角色的权限 (`iam:PassRole`)。`iam:PassRole` 权限指定您可以使用哪些角色。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予权限以将角色传递给 Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**重要**  
在您指定服务角色后，CloudFormation 在该堆栈上执行的所有操作将始终使用该角色。创建堆栈后，无法删除附加到堆栈的服务角色。拥有权限，可对此堆栈执行操作的其他用户可以使用该角色，无论这些用户是否拥有 `iam:PassRole` 权限。如果该角色包含用户不应具有的权限，则您可能无意中提升了用户的权限。确保该角色授予最小权限。有关更多信息，请参阅《*IAM 用户指南*》中的[应用最低权限许可](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

# 防止跨服务混淆代理
防止跨服务混淆代理

混淆代理问题是一个安全性问题，即不具有某操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在 Amazon 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*) 调用另一项服务（*所谓的服务*)时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为了防止这种情况，Amazon 提供可帮助您保护所有服务的服务委托人数据的工具，这些服务委托人有权限访问账户中的资源。

建议在资源策略中使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 Amazon CloudFormation 为其他服务提供的对特定资源（例如 Amazon CloudFormation 扩展）的访问权限。如果您只希望将一个资源与跨服务访问相关联，请使用。`aws:SourceArn`如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用。`aws:SourceAccount`

确保 `aws:SourceArn` 的值为 Amazon CloudFormation 存储的资源的 ARN。

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符（`*`）的 `aws:SourceArn` 全局上下文条件键。例如 `arn:aws:cloudformation:*:123456789012:*`。

如果 `aws:SourceArn` 值不包含账户 ID，则您必须使用两个全局条件上下文键来限制权限。

以下示例演示如何使用 Amazon CloudFormation 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

## 使用 `aws:SourceArn` 和 `aws:SourceAccount` 条件键的信任策略示例


对于注册表服务，Amazon CloudFormation 调用 Amazon Security Token Service（Amazon STS）以在您的账户中担任服务角色。此角色是为 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_RegisterType.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_RegisterType.html) 操作中的 `ExecutionRoleArn` 以及 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_LoggingConfig.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_LoggingConfig.html) 操作中的 `LogRoleArn` 集而配置。有关更多信息，请参阅 [配置具有 IAM 权限的执行角色和公有扩展访问权限的信任策略](registry-public.md#registry-public-enable-execution-role)。

此示例角色信任策略使用条件语句，将服务角色的 `AssumeRole` 功能限制为只能对指定账户中的指定 Amazon CloudFormation 扩展执行操作。`aws:SourceArn` 和 `aws:SourceAccount` 条件会得到独立评估。使用服务角色的任何请求都必须满足这两个条件。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "resources.cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:cloudformation:us-east-1:123456789012:type/resource/Organization-Service-Resource"
        }
      }
    }
  ]
}
```

------

## 附加信息


有关对 StackSets 使用的服务角色使用 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键的策略示例，请参阅[设置全局键以缓解混淆代理问题](stacksets-prereqs-self-managed.md#confused-deputy-mitigation)。

有关更多信息，请参阅《IAM 用户指南》**中[更新角色信任策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_update-role-trust-policy.html)。

# 转发访问会话（FAS）请求和权限评估
FAS 请求和权限评估

用户在创建、更新和删除 CloudFormation 堆栈时可以选择指定 IAM 角色 ARN。如果用户未提供任何角色，CloudFormation 会使用默认服务机制与其他 Amazon 服务进行交互。在这种情况下，调用者必须拥有对所管理资源的必要权限。如果用户提供自己的 IAM 角色，CloudFormation 会担任该角色代表用户执行服务交互。

无论用户是否提供 IAM 角色，CloudFormation 都会为每个资源操作生成一个新的范围缩小的 FAS 令牌。因此，在这两种情况下，都会填充 [FAS 相关条件键](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_forward_access_sessions.html#access_fas_policy_conditions)（包括 `aws:ViaAWSService`）。

FAS 的使用会影响 CloudFormation 操作期间 IAM 策略的评估方式。如果有资源受到 FAS 相关条件键的影响，使用包含该资源的模板创建堆栈时，可能会发生权限被拒绝的情况。

**示例 IAM 策略**  
可考虑使用以下 IAM 策略。`Statement2` 会始终阻止在 CloudFormation 中创建 `AWS::KMS::Key` 资源。无论用户在堆栈操作期间是否提供 IAM 角色，系统都会始终强制执行该限制。这是因为由于 FAS 的使用，`aws:ViaAWSService` 条件键会始终设置为 `true`。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "kms:CreateKey"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Statement2",
            "Effect": "Deny",
            "Action": [
                "kms:CreateKey"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "Bool": {
                    "aws:ViaAWSService": "true"
                }
            }
        }
    ]
}
```

------

**示例堆栈模板**  
例如，如果用户使用以下示例模板创建堆栈，`aws:ViaAWSService` 设置为 `true`，角色权限会被 FAS 策略覆盖。拒绝 `CreateKey` 操作的 IAM 策略的 `Statement2` 会影响堆栈创建。这会导致出现权限被拒绝的错误。

```
Resources:
  myPrimaryKey:
    Type: AWS::KMS::Key
    Properties:
      Description: An example multi-Region primary key
      KeyPolicy:
        Version: '2012-10-17'
        Id: key-default-1
        Statement:
          - Sid: Enable IAM User Permissions
            Effect: Allow
            Principal:
              AWS: !Join
                - ''
                - - 'arn:aws:iam::'
                  - !Ref AWS::AccountId
                  - ':root'
            Action: kms:*
            Resource: '*'
```

有关 FAS 的更多信息，请参阅《IAM 用户指南》**中的[转发访问会话](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_forward_access_sessions.html)。

**注意**  
大多数资源都遵循此模式。但是，如果您在创建、更新或删除资源时遇到意外成功或失败，并且您的 IAM 策略包含 FAS 相关条件键，则该资源很可能是不遵循此标准模式的一小部分资源。