View a markdown version of this page

添加新的补救措施 - AWS 上的自动安全响应

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

添加新的补救措施

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

注意

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

手动工作流程概述

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

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

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

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

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

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

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

  3. (可选)在管理员帐户中创建自动修复规则。

步骤 1:在成员账户中创建运行手册

  1. 登录 AWS Systems Manager 控制台并获取查找结果的 JSON 示例。

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

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

步骤 2:在成员账户中创建 IAM 角色

  1. 登录 AWS Identity and Access 管理控制台

  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 事件” 中查看相同安全标准的示例规则。规则的命名标准是standard_control_*AutoTrigger*

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

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

  4. 保存并激活规则。

CDK 工作流程概述

总而言之,将修改或添加 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. 创建《修复运行手册》。

  2. 创建控制运行手册。

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

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

  5. 更新单元测试

步骤 1:创建修复运行手册

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

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

步骤 2:创建控制运行手册

控制运行手册是特定于剧本的运行手册,它解析给定标准中的发现数据并执行相应的修复运行手册。由于我们要在 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

这些文件的命名很重要,必须遵循格式 <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 的合并控制视图中定义的那样。

  • 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 册步骤的输出

  • 每个输出都有nameoutputType、和selectorselector应与getExtraSteps方法重写中使用的选择器相同。

  • getRemediationParams:定义传递给修复运行手册的参数,这些参数从 GetInputParams 步骤输出中获取。

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

第 3 步:将每个控制运行手册与攻略手册集成

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

重要

如果您使用原始 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 角色并集成修复运行手册

每个补救措施都有自己的 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:更新单元测试

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

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

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

./run-unit-tests.sh update

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