

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

# 添加新的补救措施
<a name="adding-new-remediations"></a>

补救措施可以通过更新相应的 playbook 文件手动添加，也可以通过编程方式通过 CDK 构造扩展解决方案，具体取决于您的首选工作流程。

**注意**  
随后的说明利用解决方案安装的资源作为起点。按照惯例，大多数解决方案资源名称都包含 **ASR and/or ** **SO0111**，以便于查找和识别它们。

## 手动工作流程概述
<a name="remediation-overview"></a>

AWS 运行手册上的自动安全响应必须遵循以下标准命名：

ASR-{{<standard>}}--{{<version>}} {{<control>}} 

 **标准**：安全标准的缩写。这必须符合 ASR 支持的标准。它必须是 “CIS”、“AFSBP”、“PCI”、“NIST” 或 “SC” 之一。

 **版本**：标准的版本。同样，这必须与 ASR 支持的版本和查找数据中的版本相匹配。

 **控制**：要修复的控件的控制 ID。这必须与发现数据相匹配。

1. 在成员账户中创建运行手册。

1. 在成员账户中创建 IAM 角色。

1. （可选）在管理员帐户中创建自动修复规则。

### 步骤 1：在成员账户中创建运行手册
<a name="step-1-create-a-runbook-in-the-member-accounts"></a>

1. 登录 [AWS Systems Manager 控制台](https://console.aws.amazon.com/systems-manager/home)并获取查找结果的 JSON 示例。

1. 创建修复发现的自动化操作手册。在 Ow **ned by me** 选项卡中，使用 “`ASR-`**文档**” 选项卡下的任何文档作为起点。

1. 管理员账户中的 AWS Step Functions 将运行你的运行手册。您的运行手册必须指定修正角色，以便在调用 runbook 时传递。

### 步骤 2：在成员账户中创建 IAM 角色
<a name="step-2-create-iam-role-in-the-member-accounts"></a>

1. 登录 [AWS Identity and Access 管理控制台](https://console.aws.amazon.com/iam/home)。

1. 从 IAM **SO0111** 角色中获取示例并创建一个新角色。角色名称必须以 so0111-remediate---开头。{{<standard>}} {{<version>}} {{<control>}}例如，如果添加 CIS v1.2.0 控件 5.6，则角色必须是。`SO0111-Remediate-CIS-1.2.0-5.6`

1. 使用该示例，创建一个范围适当的角色，该角色仅允许必要的 API 调用来执行修复。

此时，您的补救处于活动状态，可以通过 AWS Security Hub 中的 ASR 自定义操作进行自动修复。

### 步骤 3：（可选）在管理员帐户中创建自动补救规则
<a name="step-3-create-an-automatio-remediation-rule-in-the-admin-account"></a>

自动（不是 “自动”）补救是指在 AWS Security Hub 收到结果后立即执行补救。在使用此选项之前，请仔细考虑风险。

1. 在 “ CloudWatch 事件” 中查看相同安全标准的示例规则。规则的命名标准是`standard_control_*AutoTrigger*`。

1. 复制示例中的事件模式以供使用。

1. 更改该`GeneratorId`值以匹配您的查找 JSON `GeneratorId` 中的值。

1. 保存并激活规则。

## CDK 工作流程概述
<a name="cdk-remediation-overview"></a>

总而言之，将修改或添加 ASR 存储库中的以下文件。在此示例中，在 SC 和 AFSBP 剧本中添加了针对 ElastiCache .2 的新补救措施。

**注意**  
所有新的补救措施都应添加到 SC 行动手册中，因为它整合了 ASR 中可用的所有补救措施。如果您只打算部署一组特定的攻略手册（例如 AFSBP），则可以：(1) **仅**将补救措施添加到预期的剧本中，或者 (2) 将补救措施添加到相应 Security Hub 标准中存在的所有 playbook 中，以及 SC 剧本。为了灵活起见，建议使用第二种选择。

在此示例中， ElastiCache.2 包含在以下 Security Hub 标准中：
+ AFSBP
+ nist.800-53.r5 SI-2
+ nist.800-53.r5 SI-2 (2)
+ nist.800-53.r5 SI-2 (4)
+ nist.800-53.r5 SI-2 (5)
+ PCI DSS v4.0.1/6.3.3

由于默认情况下，ASR 仅为 AFSBP 和 NIST.800-53 实现剧本，因此除了 SC 之外，我们还将在这些剧本中添加这个新的补救措施。

 **Modify** 
+ source/lib/remediation-runbook-stack.ts
+ source/playbooks/AFSBP/lib/[标准名称] \_remediations.ts
+ source/playbooks/NIST80053/lib/control\_runbooks-construct.
+ source/playbooks/NIST80053/lib/[标准名称] \_remediations.ts
+ source/playbooks/SC/lib/control\_runbooks-construct.
+ source/playbooks/SC/lib/sc\_remediations.t
+ source/test/regex\_registry.t

 **Add** 
+ source/playbooks/SC/ssmdocs/SC\_ ElastiCache .2.ts
+ source/playbooks/SC/ssmdocs/descriptions/ElastiCache.2.md
+ source/remediation\_runbooks/EnableElastiCacheVersionUpgrades.yaml

**注意**  
为运行手册选择的名称可以是任何字符串，只要它与所做的其余更改一致。
+ source/playbooks/NIST80053/ssmdocs/NIST80053\_ .2. ElastiCache ts
+ source/playbooks/AFSBP/ssmdocs/AFSBP\_ ElastiCache .2.yaml

 **开发步骤** 

1. 创建《修复运行手册》。

1. 创建控制运行手册。

1. 将每个控制运行手册与行动手册集成。

1. 创建修复 IAM 角色并集成修复运行手册

1. 更新单元测试

### 步骤 1：创建修复运行手册
<a name="step-1-create-the-remediation-runbook"></a>

这是用于修复资源的 SSM 文档。它必须包含`AutomationAssumeRole`参数，即有权执行修复的 IAM 角色。创建新的修复运行手册时，请查看现有文件`source/remediation_runbooks/EnableElastiCacheVersionUpgrades.yaml`作为参考。

所有新的运行手册都应添加到该`source/remediation_runbooks/`目录中。

### 步骤 2：创建控制运行手册
<a name="step-2-create-the-control-runbook"></a>

控制运行手册是特定于剧本的运行手册，它解析给定标准中的发现数据并执行相应的修复运行手册。由于我们要在 SC、AFSBP 和 NIST8 0053 剧本中添加 ElastiCache .2 补救措施，因此我们必须为每个剧本创建一个新的控制运行手册。创建了以下文件：
+ source/playbooks/SC/ssmdocs/SC\_ ElastiCache .2.ts
+ source/playbooks/NIST80053/ssmdocs/NIST80053\_ .2. ElastiCache ts
+ source/playbooks/AFSBP/ssmdocs/AFSBP\_ ElastiCache .2.yaml

**Example**  
这些文件的命名很重要，必须遵循格式 <PLAYBOOK\_NAME>\_ <CONTROL.ID>.ts/yaml

ASR 中的某些 playbook 支持 IaC 控制运行手册 TypeScript，而另一些则必须使用原始 YAML 编写。以相应行动手册中的现有补救措施为例。在本示例中，我们将介绍使用 IaC 的 SC 剧本。

在 SC 剧本中，您的新控制运行手册应导出一个扩展 ControlRunbookDocument 并与修复运行手册名称相匹配的类。看看下面的例子：

```
export class EnableElastiCacheVersionUpgrades extends ControlRunbookDocument {
  constructor(scope: Construct, id: string, props: ControlRunbookProps) {
    super(scope, id, {
      ...props,
      securityControlId: 'ElastiCache.2',
      remediationName: 'EnableElastiCacheVersionUpgrades',
      scope: RemediationScope.REGIONAL,
      resourceIdRegex: <Regex>,
      resourceIdName: 'ClusterId',
      updateDescription: new StringFormat('Automatic minor version upgrades enabled for cluster %s.', [
        StringVariable.of(`ParseInput.ClusterId`),
      ]),
    });
  }
}
```
+  `securityControlId`是您要添加的补救措施的控件 ID，正如在 Sec [urity Hub 的合并控制视图中](https://docs.aws.amazon.com/securityhub/latest/userguide/asff-changes-consolidation.html#securityhub-findings-format-changes-ids-titles)定义的那样。
+  `remediationName`是您为修复运行手册选择的名称。
+  `scope`是您正在修复的资源的范围，表示该资源是全球存在还是存在于特定区域。
+  `resourceIdRegex`是用于捕获要作为参数传递给修复运行手册的资源 ID 的正则表达式。只应捕获一个群组，所有其他群组都应处于非捕获状态。如果您想传递整个 ARN，请省略此字段。
+  `resourceIdName`是您要为使用捕获的资源 ID 设置的名称`resourceIdRegex`，它应与修复运行手册中的资源 ID 参数名称相匹配。
+  `updateDescription`是您希望在修复成功后分配给 Security Hub 中调查结果的 “注释” 部分的字符串。

您还必须导出一个名为的函数`createControlRunbook`，该函数会返回您的类的新实例。对于 ElastiCache .2，这看起来像：

```
export function createControlRunbook(scope: Construct, id: string, props: PlaybookProps): ControlRunbookDocument {
  return new EnableElastiCacheVersionUpgrades(scope, id, { ...props, controlId: 'ElastiCache.2' });
}
```

其中，`controlId`是安全标准中定义的与操作手册相关的控件 ID。

如果 Security Hub 控件包含要传递给修复运行手册的参数，则可以通过向以下方法添加替代来传递这些参数：-`getExtraSteps`: 定义在 Security Hub 中为控件实现的每个参数的默认值

**注意**  
必须为 Security Hub 中的每个参数指定一个默认值
+  `getInputParamsStepOutput`: 定义控制运行手 GetInputParams 册步骤的输出
+ 每个输出都有`name``outputType`、和`selector`。`selector`应与`getExtraSteps`方法重写中使用的选择器相同。
+  `getRemediationParams`：定义传递给修复运行手册的参数，这些参数从 GetInputParams 步骤输出中获取。

要查看示例，请导航到该`source/playbooks/SC/ssmdocs/SC_DynamoDB.1.ts`文件。

### 第 3 步：将每个控制运行手册与攻略手册集成
<a name="step-3-integrate-each-control-runbook-with-a-playbook"></a>

对于在上一步中创建的每个控制运行手册，您现在必须将其与相关行动手册中的基础架构定义集成。针对每个控制运行手册，请按照以下步骤操作。

**重要**  
如果您使用原始 YAML 而不是 typescript IaC 创建控制运行手册，请跳到下一节。

在 “`/<playbook_name>/control_runbooks-construct.ts`导入” 新创建的控制运行手册文件中，例如：

```
import * as elasticache_2 from '../ssmdocs/SC_ElastiCache.2';
```

接下来，转到阵列中查看

```
const controlRunbooksRecord: Record<string, any>
```

并添加一个将控件 ID（特定于剧本）映射到您创建的`createControlRunbook`方法的新条目：

```
'ElastiCache.2': elasticache_2.createControlRunbook,
```

将剧本特定的控件 ID 添加到补救措施列表中，如下所示：` <playbook_name>\_remediations.ts`

```
{ control: 'ElastiCache.2', versionAdded: '2.3.0' },
```

该`versionAdded`字段应为解决方案的最新版本。如果添加补救措施违反了模板大小限制，请增加`versionAdded`。您可以调整中每个 playbook 成员堆栈中包含的修正次数。`solution_env.sh`

### 步骤 4：创建修复 IAM 角色并集成修复运行手册
<a name="step-4-create-the-remediation-iam-role-integrate-remediation-runbook"></a>

每个补救措施都有自己的 IAM 角色，该角色具有执行修复运行手册所需的自定义权限。此外，需要调用该`RunbookFactory.createRemediationRunbook`方法，将您在步骤 1 中创建的修复运行手册添加到解决方案的 CloudFormation 模板中。

在中`remediation-runook-stack.ts`，每个补救措施在`RemediationRunbookStack`类中都有自己的代码块。以下代码块显示了为 ElastiCache .2 修正创建新的 IAM 角色和补救运行手册集成的过程：

```
    //-----------------------
    // EnableElastiCacheVersionUpgrades
    //
    {
      const remediationName = 'EnableElastiCacheVersionUpgrades'; // should match the name of your remediation runbook
      const inlinePolicy = new Policy(props.roleStack, `ASR-Remediation-Policy-${remediationName}`);

      const remediationPolicy = new PolicyStatement();
      remediationPolicy.addActions('elasticache:ModifyCacheCluster');
      remediationPolicy.effect = Effect.ALLOW;
      remediationPolicy.addResources(`arn:${this.partition}:elasticache:*:${this.account}:cluster:*`);
      inlinePolicy.addStatements(remediationPolicy);

      new SsmRole(props.roleStack, 'RemediationRole ' + remediationName, { // creates the remediation IAM role
        solutionId: props.solutionId,
        ssmDocName: remediationName,
        remediationPolicy: inlinePolicy,
        remediationRoleName: `${remediationRoleNameBase}${remediationName}`,
      });

      RunbookFactory.createRemediationRunbook(this, 'ASR ' + remediationName, { // adds the remediation runbook to the solution's cloudformation templates
        ssmDocName: remediationName,
        ssmDocPath: ssmdocs,
        ssmDocFileName: `${remediationName}.yaml`,
        scriptPath: `${ssmdocs}/scripts`,
        solutionVersion: props.solutionVersion,
        solutionDistBucket: props.solutionDistBucket,
        solutionId: props.solutionId,
        namespace: namespace,
      });
    }
```

### 步骤 5：更新单元测试
<a name="step-5-update-unit-tests"></a>

我们建议在添加新的补救措施后更新并运行单元测试。

首先，必须向`source/test/regex_registry.ts`文件中添加任何新的正则表达式（尚未添加）。此文件强制测试解决方案运行手册中包含的每个新正则表达式。以该`addElastiCacheClusterTestCases`函数为例，该函数用于测试 ElastiCache 修正中使用的正则表达式。

最后，你需要更新每个堆栈的快照。快照是版本控制的 CloudFormation 模板定义，用于跟踪对 ASR 基础架构所做的更改。您可以通过在`deployment`目录中运行以下命令来更新这些快照文件：

```
./run-unit-tests.sh update
```

现在，您已准备好部署新的补救措施了！导航到下面的 “**生成和部署**” 部分，获取有关使用新更改构建和部署解决方案的说明。