可扩展的取证与事件响应基础设施
在本文中,我们做出以下假设:
- 您将创建一个Windows VM的镜像
- 您在订阅中拥有完全权限
- 您将在订阅中拥有两个资源组:一个用于模板,一个用于部署的VM
注意:本文重点介绍如何帮助您为云取证做准备。在适用的情况下,我们会链接到提供背景或更多详细信息的其他文档。
为什么云中的取证不同…以及一种适应方式
调查人员在将传统的取证调查工具和能力转移到云环境时面临一些挑战。
- 规模操作。执行本地和物理调查所需的硬件无法轻松应用于云环境(至少在没有大量时间和带宽下载和上传大量数据的情况下)。
- 距离。将所有调查资产放在一个位置不利于及时响应。即使调查能力托管在云中,从全球另一端的机器获取证据仍会有延迟。
- 更大的暴露风险。调查机器可能在调查过程中被污染或感染,尤其是在涉及恶意软件分析时。还存在聚合数据的风险,调查机器本身可能因其可能包含的信息量而成为目标。
- 维护。最后是维护。如果有一组始终开机的机器;这些机器需要修补和更新操作系统以及所有软件更新和刷新。
解决这些挑战的一种解决方案是创建一个用于调查的VM镜像,并根据需要部署。我们可以在多个区域创建几个调查VM并让它们运行以保持可用性和更新管理,但这会变得昂贵且更难管理。更好的选择是将预构建的VM镜像(最新且预部署了工具和应用程序)部署到您需要的每个区域。然后您可以根据需要从每个镜像构建多个机器。该解决方案依赖于使用Azure PowerShell cmdlet、Azure自动化和Runbooks。我们将在下一节中讨论细节。
设置调查镜像
让我们看看如何设置您的取证环境,从创建工具VM、创建自动化账户、创建Runbooks、准备脚本和存储、保护凭据、测试和调度。
步骤1:构建和准备VM
我们需要做的第一件事是创建初始VM镜像作为模板。为此,我们将部署一个资源管理的Windows 10虚拟机。遵循标准创建过程并将其部署到您的模板资源组。确保应用了网络安全组,以仅允许端点进行远程访问。
部署后,我们连接到VM并将其配置到所需状态。接下来,我们运行Sysprep以删除所有用户账户和基于用户的自定义,使其成为通用镜像。(注意,如果您正在删除或更新Windows应用商店应用程序,在尝试运行Sysprep时可能会出错。更多信息,请参见此支持文章:Sysprep fails after you remove or update Microsoft Store apps that include built-in Windows images。
复制C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /quiet
注意:要准备Linux VM进行镜像,请遵循这里的文档。
步骤2:创建自动化账户
为了启用此解决方案的自动化方面,我们需要向资源组“Templates”添加一个自动化账户。添加一个自动化账户,提供一个相关的名称,并确保“创建Azure Run As账户”设置为“是”。
有关自动化账户及其创建的更多详细信息,请参见创建Azure自动化账户。
为了在我们将创建的Runbooks中使用某些cmdlets,首先在将执行脚本的自动化账户中导入/启用模块。选择新创建的自动化账户,然后确保以下模块存在。如果不存在;使用“添加模块”命令添加它们。
- Azure
- Azure.Storage
- AzureRM.Automation
- AzureRM.Compute
- AzureRM.KeyVault
- AzureRM.Network
- AzureRM.Profile
- AzureRM.Resources
- AzureRM.Sql
- AzureRM.Storage
步骤3:创建Runbooks
现在我们需要创建Runbooks,即自动化账户将执行的PowerShell脚本。要创建Runbook,请浏览到自动化账户的Runbooks部分。资源组 > 自动化账户 > Runbooks,然后选择“创建新Runbook”。
要执行这些脚本,您需要创建一个PowerShell Runbook,但可以创建更多类型的Runbook。我们需要创建总共五个Runbook,涵盖我们想要自动化的操作。这些脚本都在我们的GitHub仓库中:
- Build New Template to Update.ps1:此脚本将从我们的一个镜像部署一个VM,准备更新。
- Invoke Updates.ps1:此脚本将在部署的VM上运行自定义脚本扩展,使其下载并执行“2a. WindowsUpdate.ps1”。
- Invoke Sysprep.ps1:此脚本将在部署的VM上运行自定义脚本扩展,使其下载并执行“3a. sysprep.ps1”。
- Snapshot and Move to SAs.ps1:此脚本将获取更新和通用化VM的磁盘快照。它将在每个可用的Azure区域创建存储账户,并将快照复制到每个存储账户。(可以修改以限制到所需区域)
- Create all Images and Cleanup:此脚本从复制到每个区域的快照创建VM镜像,然后删除在此过程中创建的所有内容,因为它们不再需要。
每个脚本都已剥离所有变量名称,因此您需要更新它们并保存Runbooks后才能运行。每个变量旁边的注释应提供每个所需内容的描述。
有关创建Runbooks和访问Runbook教程的更多信息,请参见创建Azure自动化Runbook。
步骤4:创建存储账户和脚本
为了在VM上运行脚本,我们需要使脚本可用,并位于可以独立于VM更新的位置。为此,我们将创建一个存储账户,该账户将被“2. Invoke Updates.ps1”和“3. Invoke Sysprep.ps1”访问。
在模板资源组中,创建一个存储账户,在此存储账户的“blobs”部分创建一个容器,为其命名,例如“scripts”,并从GitHub上传以下两个PowerShell文件:
- 2a. WindowsUpdate.ps1:此脚本将下载所有可用的Windows更新,并在需要时重新启动VM(参考链接)。
- 3a. sysprep.ps1:此脚本将使用“generalize”和“OOBE”(开箱即用体验)标志执行Sysprep,然后关闭VM。
由于这些脚本位于存储账户中而不是VM上,您可以随时更新它们以包含新功能,例如更新、安装或删除应用程序。
步骤5:安全存储凭据
为了管理从这些镜像部署的VM的秘密和凭据,我们将利用Azure中的Key Vault功能。我们需要在我们正在使用的两个资源组中创建Key Vault:“Templates”和“Deployed VMs”。在两个Key Vault的创建过程中,我们需要确保步骤2中创建的自动化账户作为主体添加到访问策略中,并具有秘密管理权限。
步骤6:测试流程
此时,您应该已经构建并sysprep了一个VM,一个启用了相关模块的自动化账户,五个包含所有自动化的Runbooks(变量已填充),一个包含要执行以更新模板的PowerShell脚本的存储账户,以及两个用于存储秘密的Key Vault。
在继续之前,是时候测试(并在需要时调试)您到目前为止所做的工作。导航到模板资源组,并按顺序执行以下Runbooks:
- 启动Runbook“Snapshot and Move to SAs”
- 检查“所有日志”以获取有关执行的信息
- 等待2-3小时以完成复制/移动。
- 启动Runbook“Create all Images and Cleanup”
- 检查“所有日志”以获取有关执行的信息
- 等待完成约10分钟
- 在Azure门户中,选择您刚刚创建的镜像,并按照向导从镜像部署VM
- 等待5-10分钟以部署VM
- 连接到VM并验证一切是否按预期工作。
- 删除您创建和测试的VM及相关资源(NSG、vNet等。)
- 启动Runbook“Build New Template to Update”
- 检查“所有日志”以获取有关执行的信息
- 等待VM部署约5-10分钟
- 启动Runbook“Invoke Updates”
- 检查“所有日志”以获取有关执行的信息
- 如果您想检查这是在VM上运行的,可以检查并查看C:\UpdateLogs中的日志文件
- 启动Runbook“Invoke sysprep”
- 检查“所有日志”以获取有关执行的信息
- 等待Sysprep完成约15-20分钟
- 您的VM应关闭,并且您应该在VM图中看不到任何活动,这将确认Sysprep工作正常
- 最后删除VM及相关资源(NSG、vNet等。)
如果您收到错误或失败,请调试Runbook并重新测试。
步骤7:调度流程
现在您已经将VM镜像部署到所有所需的区域,您可以设置自动化的最后一部分:配置调度以自动运行此过程。为此,导航到自动化账户和调度。在这里,添加多个调度以定义每个任务的调度。为了最小化对最终用户的干扰,选择低使用率的时间,例如周六晚上和周日早上。无论您选择哪一天,我们建议保持顺序和等待时间相同。例如:
| 名称 | 开始日期/时间 | 时区 | 重复 |
|---|---|---|---|
| Deploy_Sat_PM | 05/01/2019 23:00 | UTC | 每月的第二个星期六 |
| Update_Sun_AM_1 | 06/01/2019 00:00 | UTC | 每月的第二个星期日 |
| Update_Sun_AM_2 | 06/01/2019 01:00 | UTC | 每月的第二个星期六 |
| Sysprep_Sun_AM | 06/01/2019 02:00 | UTC | 每月的第二个星期六 |
| CopyToSAs_Sun_AM | 06/01/2019 04:00 | UTC | 每月的第二个星期六 |
| ImageAndCleanup_Sun_AM | 06/01/2019 07:00 | UTC | 每月的第二个星期六 |
将相关的Runbook分配给我们刚刚创建的调度:
| 调度名称 | 关联的Runbook |
|---|---|
| Deploy_Saturday_PM | DeployTemplateVM |
| Update_Sunday_AM_1 | InvokeUpdate |
| Update_Sunday_AM_2 | InvokeUpdate |
| Sysprep_Sunday_AM | InvokeSysprep |
| CopyToSAs_Sunday_AM | SnapshotAndCopy |
| ImageAndCleanup_Sunday_AM | ImageAndCleanup |
现在开始调查
我们刚刚创建的自动化将确保部署到所有Azure区域的VM镜像都是最新的并准备使用。
要构建其中一个VM,运行PowerShell脚本“CreateVM.ps1”(在分发之前需要配置变量)。这将要求您输入要部署到的区域和VM的唯一ID。部署后,您可以使用脚本中配置的用户名和“Deployed VMs”Key Vault中的相应密码登录。当您完成使用VM时,您可以使用DeleteVM.ps1和VM的唯一ID删除它(及其相关资源)。
您现在已经设置了VM工具箱,并需要用它做一些事情。在本系列的下一篇博客中,我们将解释如何获取用于调查的VM。
Scott Miller, 高级服务工程师, MSRC