View a markdown version of this page

新增新的修補 - AWS 上的自動化安全回應

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

新增新的修補

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

注意

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

手動工作流程概觀

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

ASR-<standard>-<version>-<control>

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

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

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

  1. 在成員帳戶中建立 Runbook (成員帳戶)。

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

  3. (選用) 在管理員帳戶中建立自動修復規則。

步驟 1. 在成員帳戶 (多個) 中建立 Runbook

  1. 登入 AWS Systems Manager 主控台並取得問題清單 JSON 的範例。

  2. 建立可修復問題清單的自動化 Runbook。在我擁有索引標籤中,使用ASR-文件索引標籤下的任何文件作為起點。

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

步驟 2. 在成員帳戶中建立 IAM 角色 (IAM)

  1. 登入 AWS Identity and Access Management 主控台

  2. 從 IAM SO0111 角色取得範例,並建立新的角色。角色名稱必須以 SO0111-Remediate-<standard>-<version>-<control> 開頭。例如,如果新增 CIS v1.2.0 控制 5.6,則角色必須為 SO0111-Remediate-CIS-1.2.0-5.6

  3. 使用 範例,建立適當範圍的角色,只允許必要的 API 呼叫執行修復。

此時,您的修復處於作用中狀態,可從 AWS Security Hub 中的 ASR 自訂動作自動修復。

步驟 3:(選用) 在管理員帳戶中建立自動修復規則

自動 (非「自動」) 修補是 AWS Security Hub 收到調查結果後立即執行修補。使用此選項之前,請仔細考慮風險。

  1. 在 CloudWatch Events 中檢視相同安全標準的範例規則。規則的命名標準為 standard_control_*AutoTrigger*

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

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

  4. 儲存並啟用規則。

CDK 工作流程概觀

總之,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。

  2. 建立 Control Runbook。

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

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

  5. 更新單位測試

步驟 1:建立修復 Runbook

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

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

步驟 2:建立控制 Runbook

控制 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

範例

這些檔案的命名很重要,且必須遵循格式 <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 的合併控制項檢視中定義。

  • 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 步驟的輸出

  • 每個輸出都有 nameoutputTypeselectorselector 應該是getExtraSteps方法覆寫中使用的相同選擇器。

  • getRemediationParams:定義傳遞至修復 Runbook 的參數,從 GetInputParams 步驟輸出擷取。

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

步驟 3:將每個控制 Runbook 與 Playbook 整合

對於在上一個步驟中建立的每個控制項 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

每個修補都有自己的 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:更新單位測試

建議您在新增修補之後更新並執行單元測試。

首先,您必須將任何新的規則表達式 (尚未新增) 新增至 source/test/regex_registry.ts 檔案。此檔案會對解決方案 Runbook 中包含的每個新規則表達式強制執行測試。查看 addElastiCacheClusterTestCases函數做為範例,此函數用於測試 ElastiCache 修復中使用的規則表達式。

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

./run-unit-tests.sh update

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