

# CloudFormation 中的安全性
<a name="security"></a>

AWS 的云安全性的优先级最高。为了满足对安全性最敏感的组织的需求，我们打造了具有超高安全性的数据中心和网络架构。作为 AWS 的客户，您也可以从这些数据中心和网络架构受益。

安全性是 AWS 和您的共同责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云的安全性和云*中**的*安全性：
+ **云安全性** – AWS 负责保护在 AWS 云中运行 AWS 服务的基础结构。AWS 还向您提供可安全使用的服务。作为[AWS 合规性计划](https://aws.amazon.com/compliance/programs/)的一部分，第三方审计人员将定期测试和验证安全性的有效性。要了解适用于 CloudFormation 的合规性计划，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云中的安全性**——您的责任由您使用的 AWS 服务决定。您还需要对其他因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

此文档将帮助您了解如何在使用 CloudFormation 时应用责任共担模型。以下主题说明如何配置 CloudFormation 以实现您的安全性和合规性目标。您还会了解如何使用其他 AWS 服务以帮助您监控和保护 CloudFormation 资源。

**Topics**
+ [CloudFormation 堆栈的删除保护](using-cfn-protect-stacks.md)
+ [防止更新堆栈资源](protect-stack-resources.md)
+ [CloudFormation 中的数据保护](security-data-protection.md)
+ [使用 AWS Identity and Access Management 控制 CloudFormation 访问权限](control-access-with-iam.md)
+ [使用 AWS CloudTrail 记录 CloudFormation API 调用](cfn-api-logging-cloudtrail.md)
+ [CloudFormation 中的基础结构安全性](infrastructure-security.md)
+ [CloudFormation 中的故障恢复能力](disaster-recovery-resiliency.md)
+ [的合规性验证 CloudFormation](cloudformation-compliance.md)
+ [CloudFormation 中的配置和漏洞分析](vulnerability-analysis-and-management.md)
+ [CloudFormation 的安全最佳实践](security-best-practices.md)
+ [使用接口端点 (AWS PrivateLink) 访问 CloudFormation](vpc-interface-endpoints.md)

# CloudFormation 堆栈的删除保护
<a name="using-cfn-protect-stacks"></a>

您可以通过在堆栈上启用终止保护来防止堆栈被意外删除。如果用户尝试删除已启用终止保护的堆栈，则删除操作会失败，并且堆栈及其状态将保持不变。可在创建堆栈时对其启用终止保护。默认情况下，堆栈上的终止保护是禁用的。您可以为状态为 `DELETE_IN_PROGRESS` 或 `DELETE_COMPLETE` 之外任何状态的堆栈设置终止保护。

如果在堆栈上启用或禁用终止保护，则也会将相同的选择传递给属于该堆栈的任何嵌套堆栈。不能直接在嵌套堆栈上启用或禁用终止保护。如果用户尝试直接删除一个属于已启用终止保护的堆栈的嵌套堆栈，则操作会失败，并且嵌套堆栈将保持不变。

但是，如果用户执行会删除嵌套堆栈的堆栈更新，则 CloudFormation 会相应地删除嵌套堆栈。

终止保护不同于禁用回滚。终止保护仅适用于尝试删除堆栈的情况，而禁用回滚适用于创建堆栈失败时的自动回滚。

**在创建堆栈时启用终止保护**  
在 **Create stack**（创建堆栈）向导中的 **Specify stack options**（指定堆栈选项）页面上，在 **Advanced options**（高级选项）下，展开 **Termination Protection**（终止保护）部分，然后选择 **Enable**（启用）。有关更多信息，请参阅 [配置堆栈选项](cfn-console-create-stack.md#configure-stack-options)。

**在现有堆栈上启用或禁用终止保护**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您的 AWS 区域。

1. 选择想要设置的堆栈。
**注意**  
如果堆栈名称旁边显示 **NESTED**，则该堆栈为嵌套堆栈。您只能在该嵌套堆栈所属的根堆栈上更改终止保护。

1. 在堆栈详细信息窗格中，选择 **Stack actions (堆栈选项)**，然后选择 **Edit termination protection (编辑终止保护)**。

   CloudFormation 会显示**编辑终止保护**对话框。

1. 选择 **Enable (启用)** 或 **Disable (禁用)**，然后选择 **Save (保存)**。

**在嵌套堆栈上启用或禁用终止保护**

如果堆栈名称旁边显示 **NESTED**，则该堆栈为嵌套堆栈。您只能在该嵌套堆栈所属的根堆栈上更改终止保护。在根堆栈上更改终止保护：

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您的 AWS 区域。

1. 选择想要设置的嵌套堆栈。

1. 在 **Stack info (堆栈信息)** 窗格中，在**概述**部分中，选择作为**根堆栈**列出的堆栈名称。

   CloudFormation 会显示根堆栈的堆栈详细信息。

1. 依次选择 **Stack actions (堆栈选项)**、**Edit termination protection (编辑终止保护)**。

   CloudFormation 会显示**编辑终止保护**对话框。

1. 选择 **Enable (启用)** 或 **Disable (禁用)**，然后选择 **Save (保存)**。

**使用命令行启用或禁用终止保护**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-termination-protection.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-termination-protection.html) 命令。

## 控制谁可以在堆栈上更改终止保护
<a name="protect-stacks-perms"></a>

要在堆栈上启用或禁用终止保护，用户需要拥有进行 `cloudformation:UpdateTerminationProtection` 操作的权限。例如，以下策略允许用户在堆栈上启用或禁用终止保护。

有关在 CloudFormation 中指定权限的更多信息，请参阅[使用 AWS Identity and Access Management 控制 CloudFormation 访问权限](control-access-with-iam.md)。

**Example 授予更改堆栈终止保护权限的示例策略**    
****  

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

# 防止更新堆栈资源
<a name="protect-stack-resources"></a>

在创建堆栈时，允许对所有资源执行所有更新操作。默认情况下，具有堆栈更新权限的任何人均可更新堆栈中的所有资源。在更新期间，一些资源可能需要中断或可能已完全替换，这会生成新的物理 ID 或全新的存储。使用堆栈策略可以防止堆栈资源在堆栈更新过程中被意外更新或删除。堆栈策略是一个 JSON 文档，该文档定义可对指定资源执行的更新操作。

设置堆栈策略后，默认情况下将保护堆栈中的所有资源。要允许对特定资源进行更新，您可在堆栈策略中为这些资源指定明确的 `Allow` 语句。您只能为每个堆栈定义一个堆栈策略，但在一个策略中可以保护多个资源。堆栈策略适用于所有尝试更新堆栈的 CloudFormation 用户。您不能将不同的堆栈策略与不同的用户关联。

堆栈策略仅在堆栈更新过程中适用。与 AWS Identity and Access Management（IAM）策略不同，它不提供访问控制。仅将堆栈策略用作故障保护功能来防止意外更新特定堆栈资源。要控制对 AWS 资源或操作的访问，请使用 IAM。

**Topics**
+ [示例堆栈策略](#stack-policy-intro-example)
+ [定义堆栈策略](#stack-policy-reference)
+ [设置堆栈策略](#protect-stack-resources-protecting)
+ [更新受保护资源](#protect-stack-resources-updating)
+ [修改堆栈策略](#protect-stack-resources-modifying)
+ [更多示例堆栈策略](#stack-policy-samples)

## 示例堆栈策略
<a name="stack-policy-intro-example"></a>

下面的示例堆栈策略阻止更新 `ProductionDatabase` 资源：

```
{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    },
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "LogicalResourceId/ProductionDatabase"
    }
  ]
}
```

当您设置堆栈策略时，将默认保护所有资源。为了允许对所有资源进行更新，我们添加了一个 `Allow` 语句来允许对所有资源执行的所有操作。虽然 `Allow` 语句指定所有资源，但显式 `Deny` 语句将为具有 `ProductionDatabase` 逻辑 ID 的资源覆盖前者。此 `Deny` 语句阻止对 `ProductionDatabase` 资源进行的所有更新操作，例如替换或删除。

需要 `Principal` 元素，但仅支持通配符 (`*`)，这意味着语句适用于所有[委托人](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#principal)。

**注意**  
在堆栈更新期间，CloudFormation 会自动更新依赖其他更新的资源的资源。例如，CloudFormation 会更新引用所更新的资源的资源。CloudFormation 不会对自动更新的资源进行任何物理更改（例如，资源的 ID），但如果这些资源关联了堆栈策略，则您必须具有更新这些资源的权限。

## 定义堆栈策略
<a name="stack-policy-reference"></a>

在创建堆栈时，未设置堆栈策略，因此允许对所有资源执行所有更新操作。要阻止对堆栈资源执行更新操作，可定义一个堆栈策略，然后对堆栈设置该策略。堆栈策略是一个 JSON 文档，用于定义 CloudFormation 用户可以执行的 CloudFormation 堆栈更新操作以及这些操作应用到的资源。在创建堆栈时，可通过指定一个包含堆栈策略的文本文件或键入该策略来设置堆栈策略。在堆栈上设置堆栈策略时，默认情况下会拒绝未显式允许的任何更新。

您可定义一个带 5 个元素的堆栈策略：`Effect`、`Action`、`Principal`、`Resource` 和 `Condition`。下面的伪代码显示了堆栈策略语法。

```
{
  "Statement" : [
    {
      "Effect" : "Deny_or_Allow",
      "Action" : "update_actions",
      "Principal" : "*",
      "Resource" : "LogicalResourceId/resource_logical_ID",
      "Condition" : {
        "StringEquals_or_StringLike" : {
          "ResourceType" : [resource_type, ...]
        }
      }
    }
  ]
}
```

`Effect`  
确定是拒绝还是允许对指定资源执行指定的操作。您只能指定 `Deny` 或 `Allow`，例如：  

```
"Effect" : "Deny"
```
如果堆栈策略包含重叠语句 (同时允许和拒绝对资源进行更新)，则 `Deny` 语句始终将覆盖 `Allow` 语句。要确保某一资源受到保护，请对该资源使用 `Deny` 语句。

Action  
指定拒绝或允许的更新操作：    
更新:修改  
指定在对资源应用更改期间不会中断或有某些中断的更新操作。所有资源都保持其物理 ID。  
更新:替换  
指定会重新创建资源的更新操作。CloudFormation 使用指定的更新创建新资源，然后删除旧资源。由于资源是重新创建的，因此新资源的物理 ID 可能不相同。  
更新:删除  
指定删除资源的更新操作。从堆栈模板中完全删除资源的更新都需要此操作。  
更新:\$1  
指定所有更新操作。星号是通配符，代表所有更新操作。
以下示例说明如何只指定替换和删除操作：  

```
"Action" : ["Update:Replace", "Update:Delete"]
```
要允许除某个更新操作之外的所有更新操作，请使用 `NotAction`。例如，要允许除 `Update:Delete` 之外的所有更新操作，请使用 `NotAction`，如本示例中所示：  

```
{
  "Statement" : [
    {
      "Effect" : "Allow",
      "NotAction" : "Update:Delete",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

Principal  
`Principal` 元素指定策略应用于的实体。需要此元素，但仅支持通配符 (`*`)，这意味着策略应用于所有[主体](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#principal)。

资源  
指定将应用策略的资源的逻辑 ID。要指定资源类型，请使用 `Condition` 元素。  
要指定一个资源，请使用其逻辑 ID。例如：  

```
"Resource" : ["LogicalResourceId/myEC2instance"]
```
您可以对逻辑 ID 使用通配符。例如，如果您对所有相关资源使用一个通用逻辑 ID 前缀，则可使用通配符指定所有资源：  

```
"Resource" : ["LogicalResourceId/CriticalResource*"]
```
您还可以对资源使用 `Not` 元素。例如，要允许对所有资源执行除某个更新之外的所有更新，请使用 `NotResource` 元素保护该资源：  

```
{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "NotResource" : "LogicalResourceId/ProductionDatabase"
    }
  ]
}
```
设置堆栈策略时，会拒绝未显式允许的任何更新。通过允许更新 `ProductionDatabase` 资源之外的所有资源，会拒绝更新 `ProductionDatabase` 资源。

Conditions  
指定应用策略的资源类型。要指定特定资源的逻辑 ID，请使用 `Resource` 元素。  
您可以指定资源类型（如所有 EC2 和 RDS 数据库实例），如以下示例所示：  

```
{
  "Statement" : [
  {
    "Effect" : "Deny",
    "Principal" : "*",
    "Action" : "Update:*",
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "ResourceType" : ["AWS::EC2::Instance", "AWS::RDS::DBInstance"]
      }
    }
  },
  {
    "Effect" : "Allow",
    "Principal" : "*",
    "Action" : "Update:*",
    "Resource" : "*"
  }
  ]
}
```
`Allow` 语句授予对所有资源的更新权限，而 `Deny` 语句拒绝对 EC2 和 RDS 数据库实例的更新。`Deny` 语句始终覆盖允许操作。  
您可以对资源类型使用通配符。例如，您可以使用通配符拒绝所有 Amazon EC2 资源（如实例、安全组和子网）的更新权限，如以下示例所示：  

```
"Condition" : {
  "StringLike" : {
    "ResourceType" : ["AWS::EC2::*"]
  }
}
```
使用通配符时，必须使用 `StringLike` 条件。

## 设置堆栈策略
<a name="protect-stack-resources-protecting"></a>

您可以使用控制台或 AWS CLI 在创建堆栈时应用堆栈策略。您也可以使用 AWS CLI 将堆栈策略应用于现有堆栈。应用堆栈策略后，无法将其从堆栈中删除，但您可以使用 AWS CLI 修改该策略。

堆栈策略适用于所有尝试更新堆栈的 CloudFormation 用户。您不能将不同的堆栈策略与不同的用户关联。

有关如何编写堆栈策略的信息，请参阅[定义堆栈策略](#stack-policy-reference)。

**在创建堆栈时设置堆栈策略（控制台）**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择 AWS 区域以在其中创建堆栈。

1. 在 **CloudFormation Stacks (CloudFormation 堆栈)** 页上，选择 **Create stack (创建堆栈)**。

1. 在“创建堆栈”向导的 **Configure stack options (配置堆栈选项)** 页面上，展开**高级**部分，然后选择 **Stack policy (堆栈策略)**。

1. 指定堆栈策略：
   + 要在控制台中直接编写策略，请选择 **Enter stack policy (输入堆栈策略)**，然后在文本字段中直接键入堆栈策略。
   + 要使用在单独的文件中定义的策略，请依次选择 **Upload a file (上传文件)**、**Choose file (选择文件)**，以选择包含堆栈策略的文件。

**在创建堆栈时设置堆栈策略（AWS CLI）**
+ 将 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) 命令与 `--stack-policy-body` 选项结合使用可键入修改的策略，或将此命令与 `--stack-policy-url` 选项结合使用可指定包含策略的文件。

**在现有堆栈上设置堆栈策略（仅限 AWS CLI）**
+ 将 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/set-stack-policy.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/set-stack-policy.html) 命令与 `--stack-policy-body` 选项结合使用可键入修改的策略，或将此命令与 `--stack-policy-url` 选项结合使用可指定包含策略的文件。
**注意**  
要将策略添加到现有堆栈中，您必须有权执行 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html) 操作。

## 更新受保护资源
<a name="protect-stack-resources-updating"></a>

要更新受保护的资源，可创建一个覆盖堆栈策略并允许对这些资源进行更新的临时策略。在更新堆栈时指定覆盖策略。覆盖策略不会永久更改堆栈策略。

要更新受保护的资源，您必须有权使用 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html) 操作。有关设置 CloudFormation 权限的信息，请参阅[使用 AWS Identity and Access Management 控制 CloudFormation 访问权限](control-access-with-iam.md)。

**注意**  
在堆栈更新期间，CloudFormation 会自动更新依赖其他更新的资源的资源。例如，CloudFormation 会更新引用所更新的资源的资源。CloudFormation 不会对自动更新的资源进行任何物理更改（例如，资源的 ID），但如果这些资源关联了堆栈策略，则您必须具有更新这些资源的权限。

**更新受保护的资源（控制台）**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择要更新的堆栈，然后依次选择 **Stack actions (堆栈操作)** 和 **Update Stack (更新堆栈)**。

1. 如果您*尚未*修改堆栈模板，请选择 **Use current template (使用当前模板)**，然后单击 **Next (下一步)**。如果您已修改模板，请选择 **Replace current template (替换当前模板)**，然后指定在 **Specify template (指定模板)** 中指定更新模板的位置：
   + 对于在计算机本地存储的模板，选择 **Upload a template file (上传模板文件)**。选择 **Choose File** 以导航到文件并选中它，然后单击 **Next**。
   + 对于存储在 Amazon S3 存储桶中的模板，请选择 **Amazon S3 URL**。输入或粘贴模板的 URL，然后单击 **Next (下一步)**。

     如果模板位于启用了版本控制的存储桶中，则可以通过在 URL 后附加 `?versionId=version-id` 来指定模板的具体版本。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用启用版本控制的存储桶中的对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-objects-versioned-bucket.html)**。

1. 如果您的模板包含参数，则在 **Specify stack details (指定堆栈详细信息)** 页上，输入或修改参数值，然后选择 **Next (下一步)**。

   CloudFormation 使用当前在堆栈中设置的值填充每个参数，使用 `NoEcho` 属性声明的参数除外。可以选择**使用现有值**来对这些参数使用当前值。

   有关使用 `NoEcho` 来遮蔽敏感信息以及使用动态参数管理密钥的更多信息，请参阅 [请勿将凭证嵌入您的模板](security-best-practices.md#creds) 最佳实践。

1. 指定覆盖堆栈策略。

   1. 在 **Configure stack options (配置堆栈选项)** 页上的**高级选项**部分中，选择 **Stack policy (堆栈策略)**。

   1. 选择 **Upload a file (上传文件)**。

   1. 单击 **Choose file (选择文件)**，然后导航到包含覆盖堆栈策略的文件或键入策略。

   1. 选择**下一步**。

   覆盖策略必须为您要更新的受保护资源指定 `Allow` 语句。例如，要更新所有受保护资源，可以指定允许所有更新的临时覆盖策略：

   ```
   {
     "Statement" : [
       {
         "Effect" : "Allow",
         "Action" : "Update:*",
         "Principal": "*",
         "Resource" : "*"
       }
     ]
   }
   ```
**注意**  
CloudFormation 仅在此更新期间应用覆盖策略。覆盖策略不会永久更改堆栈策略。要修改堆栈策略，请参阅[修改堆栈策略](#protect-stack-resources-modifying)。

1. 审查提交的堆栈信息和更改。

   检查您是否已提交正确的信息，例如正确的参数值或模板 URL。如果模板包含 IAM 资源，请选择 **I acknowledge that this template may create IAM resources (我确认该模板可能会创建 IAM 资源)** 以指定您要在模板中使用 IAM 资源。有关更多信息，请参阅 [确认 CloudFormation 模板中的 IAM 资源](control-access-with-iam.md#using-iam-capabilities)。

   在**预览您的更改**部分中，检查 CloudFormation 是否会进行所需的所有更改。例如，检查 CloudFormation 是否添加、移除和修改了您要添加、移除或修改的资源。CloudFormation 通过为堆栈创建更改集来生成此预览。有关更多信息，请参阅 [使用更改集更新 CloudFormation 堆栈](using-cfn-updating-stacks-changesets.md)。

1. 如果您对所做更改感到满意，请单击 **Update (更新)**。
**注意**  
此时，您还可以选择查看更改集以更全面地查看建议的更新。要执行此操作，请单击 **View change set**（查看更改集）而不是 **Update**（更新）。CloudFormation 会显示根据您的更新生成的更改集。准备好执行堆栈更新后，请单击 **Execute (执行)**。

   CloudFormation 会显示您的堆栈的 **Stack details (堆栈详细信息)** 页面。堆栈现在的状态为 `UPDATE_IN_PROGRESS`。CloudFormation 成功完成堆栈更新后，会将堆栈状态设置为 `UPDATE_COMPLETE`。

   如果堆栈更新失败，CloudFormation 会自动回滚更改，并将状态设置为 `UPDATE_ROLLBACK_COMPLETE`。

**更新受保护资源（AWS CLI）**
+ 将 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack.html) 命令与 `--stack-policy-during-update-body` 选项结合使用可键入修改的策略，或将此命令与 `--stack-policy-during-update-url` 选项结合使用可指定包含策略的文件。
**注意**  
CloudFormation 仅在此更新期间应用覆盖策略。覆盖策略不会永久更改堆栈策略。要修改堆栈策略，请参阅[修改堆栈策略](#protect-stack-resources-modifying)。

## 修改堆栈策略
<a name="protect-stack-resources-modifying"></a>

要保护其他资源或从资源中删除保护，请修改堆栈策略。例如，当您将要保护的数据库添加到堆栈时，会将该数据库的 `Deny` 语句添加到堆栈策略。要修改策略，您必须有权使用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetStackPolicy.html) 操作。

使用 AWS CLI 修改堆栈策略。

**修改堆栈策略（AWS CLI）**
+ 将 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/set-stack-policy.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/set-stack-policy.html) 命令与 `--stack-policy-body` 选项结合使用可键入修改的策略，或将此命令与 `--stack-policy-url` 选项结合使用可指定包含策略的文件。

您无法删除堆栈策略。要从所有资源删除全部保护，您可修改策略以明确允许对所有资源执行全部操作。以下策略允许对所有资源进行全部更新：

```
{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

## 更多示例堆栈策略
<a name="stack-policy-samples"></a>

以下示例策略说明如何阻止对所有堆栈资源和特定资源进行更新，并阻止特定类型的更新。

### 阻止对所有堆栈资源的更新
<a name="w2aac43c15c21b5"></a>

要阻止对所有堆栈资源的更新，以下策略为所有资源的所有更新操作指定 `Deny` 语句。

```
{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

### 阻止对单个资源的更新
<a name="w2aac43c15c21b7"></a>

以下策略拒绝对带 `MyDatabase` 逻辑 ID 的数据库执行的所有更新操作。它使用 `Allow` 语句允许对所有其他堆栈资源进行全部更新操作。`Allow` 语句不应用于 `MyDatabase` 资源，因为 `Deny` 语句始终覆盖允许操作。

```
{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "LogicalResourceId/MyDatabase"
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

您可以使用默认拒绝来获得与上一示例相同的结果。设置堆栈策略时，CloudFormation 会拒绝未显式允许的任何更新。以下策略允许对除 `ProductionDatabase` 资源 (默认情况下，拒绝更新此资源) 之外的所有资源进行的更新。

```
{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "NotResource" : "LogicalResourceId/ProductionDatabase"
    }
  ]
}
```

**重要**  
使用默认拒绝存在风险。如果您策略中的其他位置具有 `Allow` 语句 (例如，使用通配符的 `Allow` 语句)，则可能意外授予 (原本不打算授予) 对资源的更新权限。由于显式拒绝将覆盖任何允许操作，因此可以使用 `Deny` 语句确保保护资源。

### 阻止对资源类型的所有实例进行更新
<a name="w2aac43c15c21b9"></a>

以下策略拒绝针对 RDS 数据库实例资源类型的所有更新操作。它使用 `Allow` 语句允许对所有其他堆栈资源进行全部更新操作。`Allow` 语句不应用于 RDS 数据库实例资源，因为 `Deny` 语句始终覆盖允许操作。

```
{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*",
      "Condition" : {
        "StringEquals" : {
          "ResourceType" : ["AWS::RDS::DBInstance"]
        }
      }
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

### 阻止针对实例的替换更新
<a name="w2aac43c15c21c11"></a>

以下策略拒绝会导致替换具有 `MyInstance` 逻辑 ID 的实例的更新。它使用 `Allow` 语句允许对所有其他堆栈资源进行全部更新操作。`Allow` 语句不应用于 `MyInstance` 资源，因为 `Deny` 语句始终覆盖允许操作。

```
{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:Replace",
      "Principal": "*",
      "Resource" : "LogicalResourceId/MyInstance"
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

### 阻止对嵌套堆栈进行更新
<a name="w2aac43c15c21c13"></a>

以下策略将拒绝针对 CloudFormation 堆栈资源类型（嵌套堆栈）的所有更新操作。它使用 `Allow` 语句允许对所有其他堆栈资源进行全部更新操作。`Allow` 语句不会应用于 CloudFormation 堆栈资源，因为 `Deny` 语句始终会覆盖 allow 操作。

```
{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*",
      "Condition" : {
        "StringEquals" : {
          "ResourceType" : ["AWS::CloudFormation::Stack"]
        }
      }
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}
```

# CloudFormation 中的数据保护
<a name="security-data-protection"></a>

AWS [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于 AWS CloudFormation 中的数据保护。如该模式中所述，AWS 负责保护运行所有 AWS 云 的全球基础架构。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management（IAM）设置单个用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 使用 SSL/TLS 与 AWS 资源进行通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用 AWS CloudTrail 设置 API 和用户活动日记账记录。有关使用 CloudTrail 跟踪来捕获 AWS 活动的信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 CloudTrail 跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及 AWS 服务中的所有默认安全控制。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果在通过命令行界面或 API 访问 AWS 时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅[《美国联邦信息处理标准（FIPS）第 140-3 版》](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括使用控制台、API、AWS CLI 或 AWS SDK 处理 CloudFormation 或其他 AWS 服务时。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供网址，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

## 静态加密
<a name="security-data-protection-encryption-at-rest"></a>

按照 AWS 责任共担模式，CloudFormation 会存储您的静态加密的数据。客户负责为其账户中存储的数据设置加密和存储策略。例如，我们建议对存储在 S3 存储桶或 SNS 主题中的模板和其他数据启用静态加密。客户同样为 CloudFormation 预置的任何数据存储系统定义加密设置。

## 传输中加密
<a name="security-data-protection-encryption-in-transit"></a>

在责任共担模式下，CloudFormation 使用加密通道进行服务通信。

## 互联网络流量隐私
<a name="security-data-protection-internetwork-traffic-privacy"></a>

默认情况下，区域或可用区之间的 CloudFormation 服务通信是安全加密的。

# 使用 AWS Identity and Access Management 控制 CloudFormation 访问权限
<a name="control-access-with-iam"></a>

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

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

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

## 为 CloudFormation 定义基于 IAM 身份的策略
<a name="iam-id-based-policies"></a>

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

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

如果您刚接触 IAM ，则需要先熟悉 IAM JSON 策略的要素。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。要了解如何创建 IAM 策略，请完成 IAM 文档中的教程[创建并附加您的第一个客户管理型策略](https://docs.aws.amazon.com/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 的策略操作
<a name="using-iam-actions"></a>

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

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

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

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

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

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

#### 示例
<a name="using-iam-actions-examples"></a>

以下内容介绍了授予查看 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 的控制台特定操作
<a name="console-specific-actions"></a>

除了 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:DescribeKeyPairs` – `AWS::EC2::KeyPair::KeyName` 参数类型所必需。
+ `ec2:DescribeSecurityGroups` – `AWS::EC2::SecurityGroup::Id` 参数类型所必需。
+ `ec2:DescribeSubnets` – `AWS::EC2::Subnet::Id` 参数类型所必需。
+ `ec2:DescribeVpcs` – `AWS::EC2::VPC::Id` 参数类型所必需。

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

### CloudFormation 的策略资源
<a name="resource-level-permissions"></a>

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

有关 CloudFormation 资源类型及其 ARN 的完整列表，请参阅*服务授权参考*中 [CloudFormation 定义的资源类型](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscloudformation.html#awscloudformation-resources-for-iam-policies)。要了解您可以通过每个资源的 ARN 指定哪些操作，请参阅 [CloudFormation 定义的操作](https://docs.aws.amazon.com/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 的策略条件键
<a name="using-iam-conditions"></a>

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

**注意**  
不要使用 `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 参考》**中的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html) 操作。  
有关可能的 `ResourcesToImport` 列表，请参阅[资源类型支持](resource-import-supported-resources.md)。  
使用包含三个部分的资源命名约定来指定用户可以使用的资源类型，上至组织中的所有资源，下至单个资源类型。    
`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 参考》**中的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) 操作。  
要查看资源类型的列表，请参阅《[CloudFormation 模板参考指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/introduction.html)。  
使用包含三个部分的资源命名约定来指定用户可以使用的资源类型，上至组织中的所有资源，下至单个资源类型。    
`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](https://docs.aws.amazon.com/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 资源
<a name="using-iam-capabilities"></a>

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

您可以使用 CloudFormation 控制台、AWS Command Line Interface（AWS CLI）或 API 来确认 CloudFormation 模板的功能：
+ 在 CloudFormation 控制台中，在“创建堆栈”或“更新堆栈”向导的**配置堆栈选项**页面上，选择**我确认此模板可能创建 IAM 资源**。
+ 在 AWS CLI 中，当您使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack.html) 命令时，请指定 `--capabilities` 选项的 `CAPABILITY_IAM` 或 `CAPABILITY_NAMED_IAM` 值。如果您的模板包含 IAM 资源，则可以指定任一功能。如果您的模板包含 IAM 资源的自定义名称，则必须指定 `CAPABILITY_NAMED_IAM`。
+ 在 API 中，当您使用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) 和 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/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 实例上运行的应用程序的凭证
<a name="using-iam-manage-creds"></a>

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

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

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

## 授予临时访问权限（联合访问）
<a name="using-iam-grant-access"></a>

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

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

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

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

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

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

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

# CloudFormation 基于 IAM 身份的策略示例
<a name="security_iam_id-based-policy-examples"></a>

默认情况下，用户和角色没有创建或修改 CloudFormation 资源的权限。他们也无法使用 AWS 管理控制台、AWS Command Line Interface (AWS CLI) 或 AWS 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
<a name="w2aac43c23c17b9"></a>

以下策略只授予使用 `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 导入操作
<a name="w2aac43c23c17c11"></a>

以下策略授予完成 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": [ 
            "*" 
          ] 
        } 
      } 
    } 
  ] 
}
```

------

## 允许对特定资源类型进行导入操作
<a name="w2aac43c23c17c13"></a>

以下策略授予所有堆栈操作权限，以及仅对指定资源（本例中为 `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 资源
<a name="w2aac43c23c17c15"></a>

以下策略授予创建堆栈的权限，但如果堆栈模板包含 IAM 服务中的任何资源，则拒绝请求。此策略还要求用户指定 `ResourceTypes` 参数（仅适用于 AWS 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"
        }
      }
    }
  ]
}
```

------

## 允许使用特定资源类型创建堆栈
<a name="w2aac43c23c17c17"></a>

以下策略与上一示例类似。除非堆栈模板包含 IAM 服务中的任何资源，否则该策略将授予创建堆栈的权限。它还要求用户指定 `ResourceTypes` 参数（仅适用于 AWS 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 操作控制访问权限
<a name="w2aac43c23c17c19"></a>

以下策略授予根据资源变更型 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"
                ]
            }
        }
    }]
}
```

------

## 根据区域和资源类型限制堆栈集操作
<a name="resource-level-permissions-service-managed-stack-set"></a>

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

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

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

------
#### [ 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 生成器操作
<a name="iam-policy-example-for-iac-generator"></a>

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

您还必须向使用 IaC 生成器扫描资源的任何人授予目标 AWS 服务的读取权限。有关更多信息，请参阅 [扫描资源所需的 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":"*"
        }
    ]
}
```

------

# 适用于 AWS CloudFormation 的 AWS 托管式策略
<a name="security-iam-awsmanpol"></a>

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

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

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

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

## AWS 托管式策略：AWSCloudFormationFullAccess
<a name="security-iam-awsmanpol-AWSCloudFormationFullAccess"></a>

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

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

**权限详细信息**

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

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

## AWS 托管式策略：AWSCloudFormationReadOnlyAccess
<a name="security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess"></a>

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

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

**权限详细信息**

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

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

## CloudFormation 对 AWS 托管式策略的更新
<a name="security-iam-awsmanpol-updates"></a>

查看有关 CloudFormation 的 AWS 托管式策略更新的详细信息（从该服务开始跟踪这些更改开始）。有关此页面更改的自动提示，请订阅 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 添加了新的 AWS 托管式策略，此策略提供对 CloudFormation 操作和资源的完全访问权限。  | 2019 年 7 月 26 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 更新现有策略  |  CloudFormation 添加了新权限，以允许使用 `cloudformation:DetectStackDrift` 和 `cloudformation:DetectStackResourceDrift` 操作来进行堆栈偏差检测。  | 2019 年 2 月 6 日 | 
|  [AWSCloudFormationReadOnlyAccess](#security-iam-awsmanpol-AWSCloudFormationReadOnlyAccess) – 新策略  |  CloudFormation 添加了新的 AWS 托管式策略，此策略提供对 CloudFormation 操作和资源的只读访问权限。  | 2015 年 2 月 6 日 | 
|  CloudFormation 开启了更改跟踪。  |  CloudFormation 为其 AWS 托管式策略开启了更改跟踪。  | 2015 年 2 月 6 日 | 

# CloudFormation 服务角色
<a name="using-iam-servicerole"></a>

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

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

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

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

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

# 防止跨服务混淆代理
<a name="cross-service-confused-deputy-prevention"></a>

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

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

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

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

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

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

## 使用 `aws:SourceArn` 和 `aws:SourceAccount` 条件键的信任策略示例
<a name="cross-service-confused-deputy-prevention-example"></a>

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

此示例角色信任策略使用条件语句，将服务角色的 `AssumeRole` 功能限制为只能对指定账户中的指定 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"
        }
      }
    }
  ]
}
```

------

## 附加信息
<a name="cross-service-confused-deputy-prevention-additional-information"></a>

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

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

# 转发访问会话（FAS）请求和权限评估
<a name="fas-requests-and-permission-evaluation"></a>

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

无论用户是否提供 IAM 角色，CloudFormation 都会为每个资源操作生成一个新的范围缩小的 FAS 令牌。因此，在这两种情况下，都会填充 [FAS 相关条件键](https://docs.aws.amazon.com/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.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)。

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

# 使用 AWS CloudTrail 记录 CloudFormation API 调用
<a name="cfn-api-logging-cloudtrail"></a>

CloudFormation 与 AWS CloudTrail 集成，后者是一项提供用户、角色或 AWS 服务在 CloudFormation 中所执行操作的记录的服务。CloudTrail 将对 CloudFormation 的所有 API 调用均作为事件捕获，包括来自 CloudFormation 控制台的调用和对 CloudFormation API 的代码调用。如果您创建了一个跟踪，则可以使 CloudTrail 事件持续传送到 Amazon S3 存储桶（包括 CloudFormation 的事件）。如果您不配置跟踪，则仍可在 CloudTrail 控制台中的**事件历史记录**中查看最新事件。通过使用 CloudTrail 收集的信息，您可以确定向 CloudFormation 发出了什么请求、发出请求的 IP 地址、何人发出的请求、请求的发出时间以及其他详细信息。

要了解有关 CloudTrail 的更多信息，请参阅[《AWS CloudTrail 用户指南》](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

**Topics**
+ [CloudTrail 中的 CloudFormation 信息](#cloudformation_info_in_cloudtrail)
+ [了解 CloudFormation 日志文件条目](#understanding_cloudformation_entries)

## CloudTrail 中的 CloudFormation 信息
<a name="cloudformation_info_in_cloudtrail"></a>

在您创建 AWS 账户时，将在该账户上启用 CloudTrail。当 CloudFormation 中发生活动时，该活动将记录在 CloudTrail 事件中，并与其他 AWS 服务事件一同保存在**事件历史记录**中。您可以在 AWS 账户中查看、搜索和下载最新事件。有关更多信息，请参阅 [ 使用 CloudTrail 事件历史记录查看事件 ](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

要持续记录 AWS 账户中的事件（包括 CloudFront 的事件），请创建跟踪。通过跟踪，CloudTrail 可将日志文件传送至 Amazon S3 存储桶。预设情况下，在控制台中创建跟踪时，此跟踪应用于所有 区域。此跟踪记录在 AWS 分区中记录所有区域中的事件，并将日志文件传送至您指定的 Amazon S3 存储桶。此外，您可以配置其他 AWS 服务，进一步分析在 CloudTrail 日志中收集的事件数据并采取行动。有关更多信息，请参阅：
+ [创建跟踪概览](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 支持的服务和集成](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [为 CloudTrail 配置 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/configure-sns-notifications-for-cloudtrail.html)
+ [从多个区域接收 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html)和[从多个账户接收 CloudTrail 日志文件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

所有 CloudFormation 操作均由 CloudTrail and 进行记录，并记录在[《AWS CloudFormation API 参考》](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Operations.html)中。例如，对 `CreateStack`、`DeleteStack` 和 `ListStacks` 部分的调用将在 CloudTrail 日志文件中生成条目。

每个事件或日志条目都包含有关生成请求的人员信息。身份信息可帮助您确定以下内容：
+ 请求是使用根用户凭证还是 IAM 用户凭证发出的。
+ 请求是使用角色还是联合用户的临时安全凭证发出的。
+ 请求是否由其他 AWS 服务发出。

有关更多信息，请参阅 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

## 了解 CloudFormation 日志文件条目
<a name="understanding_cloudformation_entries"></a>

跟踪记录是一种配置，可用于将事件作为日志文件传送到您指定的 Simple Storage Service（Amazon S3）存储桶。CloudTrail 日志文件包含一个或多个记录条目。一个事件表示一个来自任何源的请求，包括有关所请求的操作、操作的日期和时间、请求参数等方面的信息。CloudTrail 日志文件不是公有 API 调用的有序堆栈跟踪，因此它们不会按任何特定顺序显示。

下面的示例显示了一个 CloudTrail 日志条目，该条目说明了 `CreateStack` 操作。该操作由名为 Alice 的 IAM 用户执行。

**注意**  
仅记录输入参数键名称，不记录参数值。

```
{
  "eventVersion": "1.01",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAABCDEFGHIJKLNMOPQ",
    "arn": "arn:aws:iam::012345678910:user/Alice",
    "accountId": "012345678910",
    "accessKeyId": "AKIDEXAMPLE",
    "userName": "Alice"
  },
  "eventTime": "2014-03-24T21:02:43Z",
  "eventSource": "cloudformation.amazonaws.com",
  "eventName": "CreateStack",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "127.0.0.1",
  "userAgent": "aws-cli/1.2.11 Python/2.7.4 Linux/2.6.18-164.el5",
  "requestParameters": {
    "templateURL": "templateURL",
    "tags": [
      {
        "key": "test",
        "value": "tag"
      }
    ],
    "stackName": "my-test-stack",
    "disableRollback": true,
    "parameters": [
      {
        "parameterKey": "password"
      },
      {
        "parameterKey": "securitygroup"
      }
    ]
  },
  "responseElements": {
    "stackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/my-test-stack/a38e6a60-b397-11e3-b0fc-08002755629e"
  },
  "requestID": "9f960720-b397-11e3-bb75-a5b75389b02d",
  "eventID": "9bf6cfb8-83e1-4589-9a70-b971e727099b"
}
```

以下示例显示 Alice 对 `my-test-stack` 堆栈调用了 `UpdateStack` 操作：

```
{
  "eventVersion": "1.01",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAABCDEFGHIJKLNMOPQ",
    "arn": "arn:aws:iam::012345678910:user/Alice",
    "accountId": "012345678910",
    "accessKeyId": "AKIDEXAMPLE",
    "userName": "Alice"
  },
  "eventTime": "2014-03-24T21:04:29Z",
  "eventSource": "cloudformation.amazonaws.com",
  "eventName": "UpdateStack",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "127.0.0.1",
  "userAgent": "aws-cli/1.2.11 Python/2.7.4 Linux/2.6.18-164.el5",
  "requestParameters": {
    "templateURL": "templateURL",
    "parameters": [
      {
        "parameterKey": "password"
      },
      {
        "parameterKey": "securitygroup"
      }
    ],
    "stackName": "my-test-stack"
  },
  "responseElements": {
    "stackId": "arn:aws:cloudformation:us-east-1:012345678910:stack/my-test-stack/a38e6a60-b397-11e3-b0fc-08002755629e"
  },
  "requestID": "def0bf5a-b397-11e3-bb75-a5b75389b02d",
  "eventID": "637707ce-e4a3-4af1-8edc-16e37e851b17"
}
```

以下示例显示 Alice 调用了 `ListStacks` 操作。

```
{
  "eventVersion": "1.01",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAABCDEFGHIJKLNMOPQ",
    "arn": "arn:aws:iam::012345678910:user/Alice",
    "accountId": "012345678910",
    "accessKeyId": "AKIDEXAMPLE",
    "userName": "Alice"
  },
  "eventTime": "2014-03-24T21:03:16Z",
  "eventSource": "cloudformation.amazonaws.com",
  "eventName": "ListStacks",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "127.0.0.1",
  "userAgent": "aws-cli/1.2.11 Python/2.7.4 Linux/2.6.18-164.el5",
  "requestParameters": null,
  "responseElements": null,
  "requestID": "b7d351d7-b397-11e3-bb75-a5b75389b02d",
  "eventID": "918206d0-7281-4629-b778-b91eb0d83ce5"
}
```

以下示例显示 Alice 对 `my-test-stack` 堆栈调用了 `DescribeStacks` 操作。

```
{
  "eventVersion": "1.01",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAABCDEFGHIJKLNMOPQ",
    "arn": "arn:aws:iam::012345678910:user/Alice",
    "accountId": "012345678910",
    "accessKeyId": "AKIDEXAMPLE",
    "userName": "Alice"
  },
  "eventTime": "2014-03-24T21:06:15Z",
  "eventSource": "cloudformation.amazonaws.com",
  "eventName": "DescribeStacks",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "127.0.0.1",
  "userAgent": "aws-cli/1.2.11 Python/2.7.4 Linux/2.6.18-164.el5",
  "requestParameters": {
    "stackName": "my-test-stack"
  },
  "responseElements": null,
  "requestID": "224f2586-b398-11e3-bb75-a5b75389b02d",
  "eventID": "9e5b2fc9-1ba8-409b-9c13-587c2ea940e2"
}
```

以下示例显示 Alice 对 `my-test-stack` 堆栈调用了 `DeleteStack` 操作。

```
{
  "eventVersion": "1.01",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAABCDEFGHIJKLNMOPQ",
    "arn": "arn:aws:iam::012345678910:user/Alice",
    "accountId": "012345678910",
    "accessKeyId": "AKIDEXAMPLE",
    "userName": "Alice"
  },
  "eventTime": "2014-03-24T21:07:15Z",
  "eventSource": "cloudformation.amazonaws.com",
  "eventName": "DeleteStack",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "127.0.0.1",
  "userAgent": "aws-cli/1.2.11 Python/2.7.4 Linux/2.6.18-164.el5",
  "requestParameters": {
    "stackName": "my-test-stack"
  },
  "responseElements": null,
  "requestID": "42dae739-b398-11e3-bb75-a5b75389b02d",
  "eventID": "4965eb38-5705-4942-bb7f-20ebe79aa9aa"
}
```

# CloudFormation 中的基础结构安全性
<a name="infrastructure-security"></a>

作为一项托管服务，AWS CloudFormation 受 AWS 全球网络安全保护。有关 AWS 安全服务以及 AWS 如何保护基础结构的信息，请参阅 [AWS 云安全](https://aws.amazon.com/security/)。要按照基础结构安全最佳实践设计您的 AWS 环境，请参阅《安全性支柱 AWS Well‐Architected Framework》中的 [基础结构保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)**。

您可以使用 AWS 发布的 API 调用通过网络访问 CloudFormation。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

您可以从任何网络位置调用这些 API 操作，但 CloudFormation 不支持基于资源的访问策略，其中可以包含基于源 IP 地址的限制。您还可以使用 CloudFormation 策略来控制来自特定 Amazon Virtual Private Cloud (Amazon VPC) 端点或特定 VPC 的访问。事实上，这隔离了在 CloudFormation 网络中仅从特定 VPC 到给定 AWS 资源的网络访问。

# CloudFormation 中的故障恢复能力
<a name="disaster-recovery-resiliency"></a>

AWS全球基础架构围绕AWS区域和可用区构建。AWS区域提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错性和可扩展性。

有关 AWS 区域和可用区的更多信息，请参阅 [AWS全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

# 的合规性验证 CloudFormation
<a name="cloudformation-compliance"></a>

要了解某个 AWS 服务 是否在特定合规性计划范围内，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)，然后选择您感兴趣的合规性计划。有关常规信息，请参阅 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)、、。

您可以使用 AWS Artifact 下载第三方审计报告。有关更多信息，请参阅[在 AWS Artifact 中下载报告](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规性责任由您的数据的敏感性、您公司的合规性目标以及适用的法律法规决定。有关您在使用 AWS 服务时的合规责任的更多信息，请参阅 [AWS 安全性文档](https://docs.aws.amazon.com/security/)。

# CloudFormation 中的配置和漏洞分析
<a name="vulnerability-analysis-and-management"></a>

配置和 IT 控制是 AWS 和您（我们的客户）之间的共同责任。有关更多信息，请参阅 AWS[ 责任共担模型](https://aws.amazon.com/compliance/shared-responsibility-model/)。

# CloudFormation 的安全最佳实践
<a name="security-best-practices"></a>

CloudFormation 提供了在您开发和实施自己的安全策略时需要考虑的大量安全功能。以下最佳实践是一般指导原则，并不代表完整安全解决方案。这些最佳实践可能不适合环境或不满足环境要求，请将其视为有用的考虑因素而不是惯例。

**Topics**
+ [使用 IAM 控制访问](#use-iam-to-control-access)
+ [请勿将凭证嵌入您的模板](#creds)
+ [使用 AWS CloudTrail 记录 CloudFormation 调用](#cloudtrail)

## 使用 IAM 控制访问
<a name="use-iam-to-control-access"></a>

IAM 是一项可用于管理 AWS 中的用户及其权限的 AWS 服务。您可以将 IAM 与 CloudFormation 结合使用来指定用户可以执行哪些 CloudFormation 操作，例如查看堆栈模板、创建堆栈或删除堆栈。此外，管理 CloudFormation 堆栈的任何人都需要具备对这些堆栈中的资源执行操作的权限。例如，如果用户想使用 CloudFormation 启动、更新或终止 Amazon EC2 实例，则他们必须拥有调用相关 Amazon EC2 操作的权限。

在大多数情况下，用户需要完全访问权限来管理模板中的所有资源。CloudFormation 可代表用户发出调用，来创建、修改和删除这些资源。要分隔用户和 CloudFormation 服务之间的权限，请使用服务角色。CloudFormation 使用服务角色的策略发出调用，而不是通过用户的策略。有关更多信息，请参阅 [CloudFormation 服务角色](using-iam-servicerole.md)。

## 请勿将凭证嵌入您的模板
<a name="creds"></a>

我们建议您在堆栈模板中使用*动态引用*，而不是在 CloudFormation 模板中嵌入敏感信息。

动态引用提供了一种简洁、功能强大的方法，用于引用在其他服务（例如 AWS Systems Manager Parameter Store 或 AWS Secrets Manager）中存储和管理的外部值。当您使用动态引用时，CloudFormation 会在堆栈和更改集合操作期间根据需要检索指定引用的值，并将值传递到相应的资源。但是，CloudFormation 从不存储实际引用值。有关更多信息，请参阅 [使用动态引用获取存储在其他服务中的值](dynamic-references.md)。

[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 帮助您安全地加密、存储和检索数据库和其他服务的凭证。[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 提供安全的分层存储，用于配置数据管理。

有关定义模板参数的信息，请参阅[CloudFormation 模板 Parameters 语法](parameters-section-structure.md)。

## 使用 AWS CloudTrail 记录 CloudFormation 调用
<a name="cloudtrail"></a>

AWS CloudTrail 跟踪在您的 AWS 账户中进行 CloudFormation API 调用的任何人。当任何人使用 CloudFormation API、CloudFormation 控制台、后端控制台或 CloudFormation AWS CLI 命令时，系统将会记录 API 调用。启用日志记录并指定用于存储日志的 Amazon S3 存储桶。这样一来，在需要时，您可以审核在您的账户中发起 CloudFormation 调用的人员。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 CloudFormation API 调用](cfn-api-logging-cloudtrail.md)。

# 使用接口端点 (AWS PrivateLink) 访问 CloudFormation
<a name="vpc-interface-endpoints"></a>

您可以使用 AWS PrivateLink 在您的 VPC 和 CloudFormation 之间创建私有连接。您可以像在 VPC 中一样访问 CloudFormation，而无需使用互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。VPC 中的实例不需要公有 IP 地址即可访问 CloudFormation。

您可以通过创建由 AWS PrivateLink 提供支持的*接口端点*来建立此私有连接。我们将在您为接口端点启用的每个子网中创建一个端点网络接口。这些是请求者托管的网络接口，用作发往 CloudFormation 的流量的入口点。

CloudFormation 支持通过接口端点调用其所有 API 操作。

## CloudFormation VPC 端点注意事项
<a name="vpc-endpoint-considerations"></a>

请首先确认您已满足《AWS PrivateLink 指南》**中 [Access an AWS service using an interface VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) 主题描述的先决条件，然后再设置接口端点。

在为 CloudFormation 设置接口端点时，还需要满足以下其他先决条件和注意事项：
+ 如果 VPC 中有资源必须响应自定义资源请求或等待条件，请确保这些资源拥有所需 CloudFormation 特定 Amazon S3 存储桶的访问权限。CloudFormation 在每个区域都有 S3 存储桶，以监视对[自定义资源](template-custom-resources.md)请求或[等待条件](using-cfn-waitcondition.md)的响应。如果模板在 VPC 中包含有自定义资源或等待条件，则 VPC 端点策略必须允许用户向以下存储桶发送响应：
  + 对于自定义资源，允许流量前往 `cloudformation-custom-resource-response-region` 存储桶。使用自定义资源时，AWS 区域名称不包含连接号。例如 `uswest2`。
  + 对于等待条件，允许流量前往 `cloudformation-waitcondition-region` 存储桶。使用等待条件时，AWS 区域名称应包含连接号。例如 `us-west-2`。

  如果端点策略阻止前往这些存储桶的流量，则 CloudFormation 不会收到响应，堆栈操作将失败。例如，如果某个资源位于 `us-west-2` 区域的 VPC 中且必须响应等待条件，则此资源必须能够向 `cloudformation-waitcondition-us-west-2` 存储桶发送响应。

  如需了解当前提供 CloudFormation 服务的 AWS 区域列表，请参阅《Amazon Web Services 一般参考》**中的 [CloudFormation endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/cfn.html)页面。
+ VPC 端点当前不支持跨区域请求 - 确保在计划向 CloudFormation 发出 API 调用的同一区域中创建端点。
+ VPC 端点仅支持 Amazon 通过 Route 53 提供的 DNS。如果您希望使用自己的 DNS，可以使用条件 DNS 转发。有关更多信息，请参阅《Amazon VPC 用户指南》中的 [Amazon VPC 中的 DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。
+ 附加到 VPC 端点的安全组必须允许端口 443 上来自 VPC 的私有子网的传入连接。

## 为 CloudFormation 创建接口 VPC 端点
<a name="vpc-endpoint-create"></a>

您可以使用 Amazon VPC 控制台或 AWS Command Line Interface（AWS CLI）为 CloudFormation 创建 VPC 端点。有关更多信息，请参阅 *AWS PrivateLink 指南*中的[创建 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

使用以下服务名称为 CloudFormation创建接口端点：
+ **com.amazonaws.*region*.cloudformation** – 为 CloudFormation API 操作创建端点。

如果为接口端点启用私有 DNS，则可使用其默认区域 DNS 名称向 CloudFormation 发出 API 请求。例如 `cloudformation.us-east-1.amazonaws.com`。

在支持 FIPS 特定端点的 AWS 区域中，您还可以使用以下服务名称为 CloudFormation 创建接口端点：
+ **com.amazonaws.*region*.cloudformation-fips** – 为符合[联邦信息处理标准 (FIPS) 140-2](https://aws.amazon.com/compliance/fips/) 的 CloudFormation API 创建端点。

有关 CloudFormation 端点的完整列表，请参阅《*Amazon Web Services 一般参考*》中的 [CloudFormation endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/cfn.html)。

## 为 CloudFormation创建 VPC 端点策略
<a name="vpc-endpoint-policy"></a>

端点策略是一种 IAM 资源，您可以将其附加到接口端点。默认端点策略允许通过接口端点完全访问 CloudFormation API。要控制允许从 VPC 访问 CloudFormation的权限，请将自定义端点策略附加到接口端点。

端点策略指定以下信息：
+ 可执行操作的主体（AWS 账户、IAM 用户和 IAM 角色）。
+ 可执行的操作。
+ 可对其执行操作的资源。

有关更多信息，请参阅 *AWS PrivateLink 指南*中的[使用端点策略控制对 VPC 端点的访问权限](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

**示例：CloudFormation操作的 VPC 端点策略**  
下面是用于 CloudFormation 的端点策略示例。当附加到端点时，此策略会向所有资源上的所有主体授予对列出的 CloudFormation 操作的访问权限。以下示例拒绝所有用户通过 VPC 端点创建堆栈的权限，并允许对 CloudFormation 服务上的所有其他操作进行完全访问。

```
{
  "Statement": [
    {
      "Action": "cloudformation:*", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Resource": "*"
    },
    {
      "Action": "cloudformation:CreateStack", 
      "Effect": "Deny", 
      "Principal": "*", 
      "Resource": "*"
    }
  ]
}
```