

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 新增新的修補
<a name="adding-new-remediations"></a>

您可以手動新增修補，方法是更新適當的手冊檔案，或以程式設計方式將解決方案延伸到 CDK 建構模組，視您偏好的工作流程而定。

**注意**  
以下指示會利用解決方案安裝的資源做為起點。根據慣例，大多數解決方案資源名稱都包含 **ASR** 和/或 **SO0111**，以便輕鬆找到和識別它們。

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

AWS Runbook 上的自動化安全回應必須遵循下列標準命名：

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

 **標準**：安全標準的縮寫。這必須符合 ASR 支援的標準。它必須是「CIS」、「AFSBP」、「PCI」、「NIST」或「SC」之一。

 **版本**：標準的版本。同樣地，這必須符合 ASR 支援的版本和調查結果資料中的版本。

 **控制項**：要修復之控制項的控制項 ID。這必須符合調查結果資料。

1. 在成員帳戶中建立 Runbook （成員帳戶）。

1. 在成員帳戶中建立 IAM 角色 (IAM)。

1. （選用） 在管理員帳戶中建立自動修復規則。

### 步驟 1. 在成員帳戶 （多個） 中建立 Runbook
<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. 建立可修復問題清單的自動化 Runbook。在**我擁有**索引標籤中，使用`ASR-`文件索引標籤下的任何**文件**作為起點。

1. 管理員帳戶中的 AWS Step Functions 將執行您的 Runbook。您的 Runbook 必須指定修補角色，才能在呼叫 Runbook 時傳遞。

### 步驟 2. 在成員帳戶中建立 IAM 角色 (IAM)
<a name="step-2-create-iam-role-in-the-member-accounts"></a>

1. 登入 [AWS Identity and Access Management 主控台](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 Events 中檢視相同安全標準的範例規則。規則的命名標準為 `standard_control_*AutoTrigger*`。

1. 從要使用的範例複製事件模式。

1. 變更 `GeneratorId`值以符合問題清單 JSON `GeneratorId`中的 。

1. 儲存並啟用規則。

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

總之，ASR 儲存庫中的下列檔案將會修改或新增。在此範例中，ElastiCache.2 的新修補已新增至 SC 和 AFSBP 手冊。

**注意**  
所有新的修補都應新增至 SC 手冊，因為它會合併 ASR 中可用的所有修補。如果您只打算部署一組特定的手冊 （例如 AFSBP)，則除了 SC 手冊之外，您還可以：(1) **僅**將修補新增至預期的手冊 (s)，或 (2) 將修補新增至對應 Security Hub Standard 中存在的所有手冊。建議使用第二個選項來提高彈性。

在此範例中，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 4.0.1/6.3.3 版

由於 ASR 預設只會實作 AFSBP 和 NIST.800-53 的手冊，因此除了 SC 之外，我們會將此新修補新增至這些手冊。

 **Modify (修改)** 
+ source/lib/remediation-runbook-stack.ts
+ source/playbooks/AFSBP/lib/【standard name】\_remediations.ts
+ source/playbooks/NIST80053/lib/control\_runbooks-construct.ts
+ source/playbooks/NIST80053/lib/【standard name】\_remediations.ts
+ source/playbooks/SC/lib/control\_runbooks-construct.ts
+ source/playbooks/SC/lib/sc\_remediations.ts
+ source/test/regex\_registry.ts

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

**注意**  
為 Runbook 選擇的名稱可以是任何字串，只要它與所做的其餘變更一致。
+ source/playbooks/NIST80053/ssmdocs/NIST80053\_ElastiCache.2.ts
+ source/playbooks/AFSBP/ssmdocs/AFSBP\_ElastiCache.2.yaml

 **開發步驟** 

1. 建立修復 Runbook。

1. 建立 Control Runbook。

1. 將每個 Control Runbook 與 Playbook 整合。

1. 建立修復 IAM 角色和整合修復 Runbook

1. 更新單位測試

### 步驟 1：建立修復 Runbook
<a name="step-1-create-the-remediation-runbook"></a>

這是用於修復資源的 SSM 文件。它必須包含 `AutomationAssumeRole` 參數，這是具有執行修復許可的 IAM 角色。建立新的修復 Runbook 時，請檢視現有的 檔案`source/remediation_runbooks/EnableElastiCacheVersionUpgrades.yaml`做為參考。

所有新的 Runbook 都應新增至 `source/remediation_runbooks/`目錄。

### 步驟 2：建立控制 Runbook
<a name="step-2-create-the-control-runbook"></a>

控制 Runbook 是手冊特定的 Runbook，可從指定的標準剖析調查結果資料，並執行適當的修復 Runbook。由於我們會將 ElastiCache.2 修復新增至 SC、AFSBP 和 NIST80053 手冊，因此我們必須為每個手冊建立新的控制執行手冊。系統會建立下列檔案：
+ source/playbooks/SC/ssmdocs/SC\_ElastiCache.2.ts
+ source/playbooks/NIST80053/ssmdocs/NIST80053\_ElastiCache.2.ts
+ source/playbooks/AFSBP/ssmdocs/AFSBP\_ElastiCache.2.yaml

**Example**  
這些檔案的命名很重要，且必須遵循格式 <PLAYBOOK\_NAME>\_<CONTROL.ID>.ts/yaml

ASR 中的某些手冊支援 TypeScript 中的 IaC 控制 Runbook，而其他手冊必須以原始 YAML 撰寫。參考個別手冊中的現有修補做為範例。在此範例中，我們將介紹使用 IaC 的 SC 手冊。

在 SC 手冊中，您的新控制項 Runbook 應該匯出擴展 ControlRunbookDocument 並符合修復 Runbook 名稱的類別。請查看以下範例：

```
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，因為它在 [Security Hub 的合併控制項檢視](https://docs.aws.amazon.com/securityhub/latest/userguide/asff-changes-consolidation.html#securityhub-findings-format-changes-ids-titles)中定義。
+  `remediationName` 是您為修復 Runbook 選擇的名稱。
+  `scope` 是您要修復的資源範圍，指出它存在於全域還是特定區域中。
+  `resourceIdRegex` 是用來擷取您要做為參數傳遞至修復 Runbook 之資源 ID 的 regex。僅應擷取一個群組，所有其他群組應為非擷取。如果您想要傳遞整個 ARN，請省略此欄位。
+  `resourceIdName` 是您想要為使用 擷取的資源 ID 設定的名稱`resourceIdRegex`，這應與修復 Runbook 中的資源 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 控制項具有您要傳遞至修復 Runbook 的參數，您可以透過將覆寫新增至下列方法來傳遞這些參數：- `getExtraSteps`： 會定義針對 Security Hub 中針對控制項實作的每個參數的預設值

**注意**  
來自 Security Hub 的每個參數都必須指定預設值
+  `getInputParamsStepOutput`：定義控制 Runbook 的 GetInputParams 步驟的輸出
+ 每個輸出都有 `name`、 `outputType`和 `selector`。`selector` 應該是`getExtraSteps`方法覆寫中使用的相同選擇器。
+  `getRemediationParams`：定義傳遞至修復 Runbook 的參數，從 GetInputParams 步驟輸出擷取。

若要檢視範例，請導覽至 `source/playbooks/SC/ssmdocs/SC_DynamoDB.1.ts` 檔案。

### 步驟 3：將每個控制 Runbook 與 Playbook 整合
<a name="step-3-integrate-each-control-runbook-with-a-playbook"></a>

對於在上一個步驟中建立的每個控制項 Runbook，您現在必須將其與相關聯程序手冊中的基礎設施定義整合。請遵循每個控制 Runbook 的以下步驟。

**重要**  
如果您使用原始 YAML 而非 typescript IaC 建立控制項 Runbook，請跳到下一節。

在`/<playbook_name>/control_runbooks-construct.ts`匯入您新建立的控制 Runbook 檔案中，如下所示：

```
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`。您可以調整 中每個手冊成員堆疊中包含的修補數量`solution_env.sh`。

### 步驟 4：建立修補 IAM 角色並整合修補 Runbook
<a name="step-4-create-the-remediation-iam-role-integrate-remediation-runbook"></a>

每個修補都有自己的 IAM 角色，具有執行修補 Runbook 所需的自訂許可。此外，需要呼叫 `RunbookFactory.createRemediationRunbook`方法，才能將您在步驟 1 中建立的修復 Runbook 新增至解決方案的 CloudFormation 範本。

在 中`remediation-runook-stack.ts`，每個修復在 `RemediationRunbookStack`類別中都有自己的程式碼區塊。下列程式碼區塊顯示為 ElastiCache.2 修補建立新的 IAM 角色和修補 Runbook 整合：

```
    //-----------------------
    // 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` 檔案。此檔案會對解決方案 Runbook 中包含的每個新規則表達式強制執行測試。查看 `addElastiCacheClusterTestCases`函數做為範例，此函數用於測試 ElastiCache 修復中使用的規則表達式。

最後，您將需要更新每個堆疊的快照。快照是版本控制的 CloudFormation 範本定義，用於追蹤對 ASR 基礎設施所做的變更。您可以從 `deployment`目錄執行下列命令來更新這些快照檔案：

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

現在您已準備好部署新的修補！導覽至下面的**建置和部署**區段，以取得使用新變更建置和部署解決方案的指示。