

这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段，并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

AWS 云开发工具包 (AWS CDK) 是一款功能强大的工具，可供开发人员在 AWS 上配置 AWS 服务和预置基础设施。对于任何提供此类控制和功能的工具，组织均需制定策略和实践，以此确保采用安全可靠的方式使用工具。例如，组织可能希望限制开发人员对特定服务的访问权限，确保其无法篡改账户中配置的合规性或成本控制措施。

通常安全性与生产力之间可能存在矛盾，各组织均需为自己建立适当的平衡。本主题为 AWS CDK 提供安全最佳实践，您在创建和实现自己的安全策略时可以考虑。以下最佳实践是一般指导原则，并不代表完整安全解决方案。这些最佳实践可能不适合环境或不满足环境要求，请将其视为有用的考虑因素而不是惯例。

## 遵守 IAM 安全最佳实践
<a name="best-practices-security-iam"></a>

 AWS Identity and Access Management（IAM）是一项 Web 服务，可帮助您安全地控制对 AWS 资源的访问。组织、个人和 AWS CDK 使用 IAM 管理权限，这些权限决定了可对 AWS 资源执行的操作。使用 IAM 时，请遵循 IAM 安全最佳实践。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS Identity and Access Management 中的安全最佳实践和使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)。

## 管理 AWS CDK 的权限
<a name="best-practices-security-permissions"></a>

若在整个组织中使用 AWS CDK 开发和管理基础设施，需要考虑以下场景，在这些场景中，管理权限具有重要意义：
+  **AWS CDK 部署的权限** – 这些权限决定谁可以更改您的 AWS 资源以及可以进行哪些更改。
+  **资源之间的权限** – 这些权限可以实现您所创建和管理的 AWS 资源与 AWS CDK 之间的交互。

### 管理 AWS CDK 部署的权限
<a name="best-practices-security-permissions-deployments"></a>

开发人员使用 AWS CDK 在其开发计算机上本地定义基础设施。此基础设施是在 AWS 环境中通过部署实现的，这些部署通常需要使用 AWS CDK 命令行界面 (AWS CDK CLI)。通过部署，您可能需要控制开发人员可以在您的环境中进行哪些更改。例如，您可能有不希望开发人员修改的 Amazon Virtual Private Cloud (Amazon VPC)。

默认情况下，CDK CLI 将角色的安全凭证和在引导期间创建的 IAM 角色配合使用来接收部署权限。首先使用角色的安全凭证进行身份验证，然后代入 IAM 角色以在部署期间执行各种操作，例如使用 AWS CloudFormation 服务创建资源。有关 CDK 部署工作原理（包括使用的 IAM 角色）的更多信息，请参阅[部署 AWS CDK 应用程序](deploy.md)。

要限制可以执行部署的人员以及部署期间可执行的操作，请考虑以下情况：
+ 主体的安全凭证是第一组用于 AWS 身份验证的凭证。部署期间执行操作所用权限在此授予在部署工作流程中代入的 IAM 角色。您可以通过限制代入这些角色的人员来限制执行部署的人员。还可以将这些 IAM 角色替换为自己的 IAM 角色，以此限制部署期间可执行的操作。
+ 部署执行权限已授予 `DeploymentActionRole`。您可以通过限制代入该角色的人员来控制部署执行人员的权限。通过使用角色进行部署，您可以执行跨账户部署，因为该角色可以由不同账户中的 AWS 身份代入。默认情况下，同一 AWS 账户中所有具有相应 `AssumeRole` 策略语句的身份均可代入此角色。
+ 通过 AWS CloudFormation 创建和修改资源的权限已授予 `CloudFormationExecutionRole`。此角色还需要读取引导资源的权限。您可以通过将托管策略用于 `CloudFormationExecutionRole` 或配置权限边界来控制 CDK 部署所拥有的权限。默认情况下，此角色拥有的 `AdministratorAccess` 权限没有权限边界。
+ 与引导资源交互的权限已授予 `FilePublishingRole` 和 `ImagePublishingRole`。执行部署的主体必须拥有代入这些角色的权限。默认情况下，同一 AWS 账户中所有具有相应 `AssumeRole` 策略语句的身份均可代入此角色。
+ 访问引导资源以执行查找的权限已授予 `LookupRole`。执行部署的主体必须拥有代入此角色的权限。默认情况下，此角色拥有引导资源的 `readOnly` 访问权限。默认情况下，同一 AWS 账户中所有具有相应 `AssumeRole` 策略语句的身份均可代入此角色。

要为 AWS 账户的 IAM 身份配置代入这些角色的权限，请向这些身份添加包含以下策略声明的策略：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AssumeCDKRoles",
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "*",
    "Condition": {
      "StringEquals": {
        "iam:ResourceTag/aws-cdk:bootstrap-role": [
          "image-publishing",
          "file-publishing",
          "deploy",
          "lookup"
        ]
      }
    }
  }]
}
```

#### 修改部署期间代入的角色的权限
<a name="best-practices-security-permissions-deployments-roles"></a>

通过修改部署期间代入的角色的权限，您可以管理部署期间可执行的操作。要修改权限，您可以创建自己的 IAM 角色并在引导环境时指定这些角色。自定义引导时必须自定义合成。有关一般说明，请参阅[自定义 AWS CDK 引导](bootstrapping-customizing.md)。

#### 修改部署期间使用的安全凭证和角色
<a name="best-practices-security-permissions-deployments-creds"></a>

部署期间使用的角色和引导资源由您使用的 CDK 堆栈合成器决定。要修改此行为，您可以自定义合成。有关更多信息，请参阅[配置和执行 CDK 堆栈合成](configure-synth.md)。

#### 授予最低权限访问
<a name="best-practices-security-permissions-deployments-least"></a>

们建议在制定安全策略时考虑的最佳安全实践是授予最低权限访问。有关更多信息，请参阅《AWS Well-Architected Framework 指南》**中的 [SEC03-BP02 授予最低访问权限](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_permissions_least_privileges.html)。

授予最低权限访问通常涉及将 IAM 策略限制为执行给定任务所需的最低访问权限。尝试使用这种方法通过 CDK 的精细权限授予最低权限访问可能会影响 CDK 部署，并导致您必须创建的权限超出期望。若使用这种方法，需要考虑以下几点：
+ 确定允许开发人员使用 AWS CDK 通过 CloudFormation 预置基础设施的详尽权限列表是一项既困难又复杂的工作。
+ 若想实现精细化，权限可能会变得过长，以致于超出 IAM 策略文档的最大长度。
+ 提供一组不完整的权限可能会严重影响开发人员的生产力和部署。

借助 CDK，可以使用 CloudFormation 执行部署。CloudFormation 使用所提供的权限按顺序启动一组 AWS API 调用。任何时间点所需的权限均取决于多种因素：
+ 正在修改的 AWS 服务。具体而言，即是正在使用和更改的资源和属性。
+ CloudFormation 堆栈的当前状态。
+ 部署期间和需要回滚时可能出现的问题，除了 `Create` 还需要 `Delete` 权限。

如果所提供的权限不完整，则需要人工干预。以下是一些示例：
+ 若在向前滚动期间发现权限不完整，则需要暂停部署，并花时间讨论和预置新的权限，然后再继续。
+ 如果部署回滚并且缺失应用回滚的权限，则可能导致 CloudFormation 堆栈处于需要大量手动操作才能恢复的状态。

由于这种方法可能会引发复杂情况并严重限制开发人员的生产力，因此我们不建议这样做。我们建议实现防护机制并防止绕过。

#### 实现防护机制并防止绕过
<a name="best-practices-security-permissions-deployments-guardrails"></a>

您可以使用 AWS Control Tower、AWS Config、AWS CloudTrail、AWS Security Hub 等服务实现防护机制、合规性规则、审核和监控。通过这种方法，您可以向开发人员授予执行除篡改现有验证机制外的所有操作的权限。只要不违反策略，开发人员可以自由地快速实现更改。我们建议在使用 AWS CDK 时采用这种方法。有关防护机制的更多信息，请参阅 *Management and Governance Cloud Environment Guide* 中的 [Controls](https://docs.aws.amazon.com/wellarchitected/latest/management-and-governance-guide/controls.html)。

我们还建议将*权限边界*或*服务控制策略（SCP）*用作实现防护机制的一种方式。有关通过 AWS CDK 实现权限边界的更多信息，请参阅[为 AWS CDK 创建和应用权限边界](customize-permissions-boundaries.md)。

如果您正在使用任何合规性控制机制，请在引导阶段进行设置。确保 `CloudFormationExecutionRole` 或开发人员可访问的身份附加了策略或权限边界，防止绕过您设置的机制。相应策略取决于使用的特定机制。

### 管理由 AWS CDK 预置的资源之间的权限
<a name="best-practices-security-permissions-resources"></a>

如何管理由 AWS CDK 预置的资源之间的权限取决于是否允许 CDK 创建角色和策略。

若使用 AWS 构造库中的 L2 结构来定义基础设施，您可以使用所提供的 `grant` 方法预置资源之间的权限。借助 `grant` 方法，您可以指定所需资源访问权限类型，AWS CDK 为实现您的意图预置最低权限 IAM 角色。这种方法可以满足多数组织的安全要求，同时对开发人员而言也很高效。有关更多信息，请参阅[使用 AWS CDK 定义 L2 构造的权限](define-iam-l2.md)。

如需通过用手动创建的角色替换自动生成的角色来实现此功能，请考虑以下情况：
+ 需要手动创建 IAM 角色，这会减慢应用程序开发速度。
+ 如需手动创建和管理 IAM 角色，人们通常会将多个逻辑角色合并为单个角色使其更易于管理。这与最低权限原则相悖。
+ 由于这些角色需在部署之前创建，因此需引用的资源尚不存在。因此需要使用通配符，这与最低权限原则相悖。
+ 使用通配符的常见解决方法是强制为所有资源指定可预测的名称。但这会干扰 CloudFormation 在必要时更换资源的能力，并可能减慢或阻碍开发进程。因此，建议您允许 CloudFormation 为您创建唯一资源名称。
+ 由于每次部署之前均须执行手动操作，因此无法持续交付。

若组织希望阻止 CDK 创建角色，通常是为了防止开发人员创建 IAM 角色。令人担忧的是，向开发人员授予使用 AWS CDK 创建 IAM 角色的权限可能会增加他们的权限。为了减少这种情况，我们建议使用*权限边界*或*服务控制策略（SCP）*。借助权限边界，您可以为开发人员和 CDK 的权限设置限制。有关通过 CDK 使用权限边界的更多信息，请参阅[为 AWS CDK 创建和应用权限边界](customize-permissions-boundaries.md)。