本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
新增新的修補
您可以手動新增修補,方法是更新適當的手冊檔案,或以程式設計方式將解決方案延伸到 CDK 建構模組,視您偏好的工作流程而定。
注意
以下指示會利用解決方案安裝的資源做為起點。根據慣例,大多數解決方案資源名稱都包含 ASR 和/或 SO0111,以便輕鬆找到和識別它們。
手動工作流程概觀
AWS Runbook 上的自動化安全回應必須遵循下列標準命名:
ASR-<standard>-<version>-<control>
標準:安全標準的縮寫。這必須符合 ASR 支援的標準。它必須是「CIS」、「AFSBP」、「PCI」、「NIST」或「SC」之一。
版本:標準的版本。同樣地,這必須符合 ASR 支援的版本和調查結果資料中的版本。
控制項:要修復之控制項的控制項 ID。這必須符合調查結果資料。
-
在成員帳戶中建立 Runbook (成員帳戶)。
-
在成員帳戶中建立 IAM 角色 (IAM)。
-
(選用) 在管理員帳戶中建立自動修復規則。
步驟 1. 在成員帳戶 (多個) 中建立 Runbook
-
登入 AWS Systems Manager 主控台
並取得問題清單 JSON 的範例。 -
建立可修復問題清單的自動化 Runbook。在我擁有索引標籤中,使用
ASR-文件索引標籤下的任何文件作為起點。 -
管理員帳戶中的 AWS Step Functions 將執行您的 Runbook。您的 Runbook 必須指定修補角色,才能在呼叫 Runbook 時傳遞。
步驟 2. 在成員帳戶中建立 IAM 角色 (IAM)
-
從 IAM SO0111 角色取得範例,並建立新的角色。角色名稱必須以 SO0111-Remediate-
<standard>-<version>-<control>開頭。例如,如果新增 CIS v1.2.0 控制 5.6,則角色必須為SO0111-Remediate-CIS-1.2.0-5.6。 -
使用 範例,建立適當範圍的角色,只允許必要的 API 呼叫執行修復。
此時,您的修復處於作用中狀態,可從 AWS Security Hub 中的 ASR 自訂動作自動修復。
步驟 3:(選用) 在管理員帳戶中建立自動修復規則
自動 (非「自動」) 修補是 AWS Security Hub 收到調查結果後立即執行修補。使用此選項之前,請仔細考慮風險。
-
在 CloudWatch Events 中檢視相同安全標準的範例規則。規則的命名標準為
standard_control_*AutoTrigger*。 -
從要使用的範例複製事件模式。
-
變更
GeneratorId值以符合問題清單 JSONGeneratorId中的 。 -
儲存並啟用規則。
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
開發步驟
-
建立修復 Runbook。
-
建立 Control Runbook。
-
將每個 Control Runbook 與 Playbook 整合。
-
建立修復 IAM 角色和整合修復 Runbook
-
更新單位測試
步驟 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 步驟的輸出 -
每個輸出都有
name、outputType和selector。selector應該是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
現在您已準備好部署新的修補!導覽至下面的建置和部署區段,以取得使用新變更建置和部署解決方案的指示。