Terrance DeJesusEric Forte

Google Cloud 用于网络数据分析

借助 Google Cloud 探索网络威胁数据海洋

阅读时长:42分钟安全研究
Google Cloud 用于网络数据分析

简介

在当今数字时代,设备和系统产生的大量数据对于安全从业人员来说既是挑战也是机遇。 分析大量数据以获得有关网络攻击趋势的有价值或可操作的见解需要精确的工具和方法。

在深入研究数据分析任务之前,您可能会问自己:

  • 我试图回答哪些具体问题?我是否掌握了必要的数据?
  • 所有相关数据位于何处?
  • 我如何才能访问这些数据?
  • 访问数据后,理解和组织数据需要哪些步骤?
  • 哪些工具对于提取、解释或可视化数据最有效?
  • 我应该立即分析原始数据还是等到数据处理完毕后再分析?
  • 最重要的是,从数据中可以得出哪些可行的见解?

如果这些问题引起了您的共鸣,那么您就走在了正确的道路上。 欢迎来到 Google Cloud 的世界,在这里我们将解答这些问题并指导您完成创建综合报告的过程。

我们的方法将包括以下几个步骤:

探索:我们首先彻底了解我们掌握的数据。 此阶段涉及识别我们想要发现的潜在见解并验证所需数据的可用性。

提取:在这里,我们收集必要的数据,重点关注与分析最相关和最新的信息。

预处理和转换:在此阶段,我们准备要分析的数据。 这涉及规范化(清理、组织和构造)数据以确保其已准备好进行进一步处理。

趋势分析:我们的大多数威胁发现和观察均源于此项努力。 我们分析处理后的数据以发现其中的模式、趋势和异常。 采用时间序列分析和聚合等技术来了解威胁随时间的演变,并突出显示各个平台上的重大网络攻击。

缩减:在此步骤中,我们将数据提炼为最相关的元素,重点关注最重要的和最有洞察力的方面。

演示:最后一步是展示我们的研究结果。 利用 Google Workspace 的工具,我们旨在以清晰、简洁且视觉上引人入胜的方式展示我们的见解。

结论:回顾这次旅程,我们将讨论拥有正确的分析工具的重要性。 我们将重点介绍 Google Cloud Platform (GCP) 如何提供用于分析网络威胁数据的理想环境,使我们能够将原始数据转化为有意义的见解。

探索:确定可用数据

在深入进行任何复杂的分析之前,我们有必要做好准备,了解我们想要研究的数据状况。

我们的方法如下:

  1. 识别可用数据:第一步是确定哪些数据可访问。 这可能包括恶意软件现象、端点异常、云信号等。确认这些数据类型的可用性至关重要。
  2. 定位数据存储:确定我们数据的确切位置。 了解我们的数据位于何处(无论是在数据库、数据湖还是其他存储解决方案中)有助于简化后续的分析过程。
  3. 访问数据:确保我们拥有访问所需数据集的必要权限或凭证非常重要。 如果我们不这样做,则需要尝试识别资源所有者并请求访问权限。
  4. 理解数据模式:理解我们数据的结构至关重要。 了解模式有助于有效地规划分析过程。
  5. 评估数据质量:与任何彻底的分析一样,评估数据的质量至关重要。 我们检查数据是否足够分段和详细,以进行有意义的趋势分析。

此阶段是为了确保我们的分析基于坚实且现实的基础。 对于《全球威胁报告》这样的报告,我们依赖丰富且相关的数据集,例如:

  • 云信号数据:这包括来自全球安全信息和事件管理 (SIEM) 警报的数据,尤其关注 AWS、GCP 和 Azure 等云平台。 这些数据通常来源于公共检测规则
  • 端点警报数据:从全局Elastic Defend警报收集的数据,结合了各种公共端点行为规则
  • 恶意软件数据:这涉及来自全球 Elastic Defend 警报的数据,并丰富了MalwareScore和公共YARA 规则

每个数据集都通过MITRE ATT&CK 、Elastic Stack 详细信息和客户洞察等框架进行分类和丰富。 Google Cloud Platform 的存储解决方案(例如 BigQuery 和 Google Cloud Storage (GCS) 存储桶)为我们的分析提供了强大的基础设施。

设置数据“新鲜度”阈值也很重要,排除年度报告内不早于 365 天的数据,以确保相关性和准确性。

最后,请记住选择提供公正观点的数据。 排除或包含内部数据应该是基于其与您的可见性的相关性而做出的有意的战略决策。

总之,选择正确的工具和数据集对于创建全面而有见地的分析至关重要。 每个选择都对数据分析的整体有效性有着独特的贡献,确保最终的见解既有价值又有影响力。

提取:数据分析的第一步

识别并找到必要的数据后,我们分析过程的下一步是从我们的存储解决方案中提取这些数据。 这个阶段非常关键,因为它为接下来的深入分析奠定了基础。

数据提取工具和技术

可以使用各种工具和编程语言进行数据提取,包括 Python、R、Go、Jupyter Notebooks 和 Looker Studio。 每种工具都有其独特的优势,选择取决于您的分析的具体需求。

在我们的数据提取工作中,我们发现最成功的方法是结合使用BigQueryColab NotebooksbucketGoogle Workspace来提取所需的数据。 Colab Notebooks 类似于 Jupyter Notebooks,在 Google 云环境中运行,可与其他 Google Cloud 服务无缝集成。

BigQuery 用于数据暂存和查询

在分析过程中,关键步骤是使用 BigQuery “分阶段”我们的数据集。 这涉及利用 BigQuery 查询来创建和保存对象,从而使它们可在我们的团队内重复使用和共享。 我们通过使用CREATE TABLE语句来实现这一点,该语句允许我们将多个数据集(例如端点行为警报、客户数据和规则数据)组合成一个综合的数据集合。

然后,将该合并的数据集存储在专门为此目的指定的 BigQuery 表中 - 在此示例中,我们将其称为“全球威胁报告”数据集。 该方法可一致应用于不同类型的数据,包括云信号和恶意软件数据集。

例如,新创建的数据表可能被命名为elastic.global_threat_report.ep_behavior_raw 。 BigQuery 定义的命名约定有助于有效地组织和定位数据集,这对于提取过程的后续阶段至关重要。

此过程中使用的 BigQuery 查询示例可能如下所示:

CREATE TABLE elastic.global_threat_report.ep_behavior_raw AS
SELECT * FROM ...

BigQuery 对导出的数据集表进行查询的图表

我们还使用 BigQuery 中的EXPORT DATA语句将表传输到其他 GCP 服务,例如以parquet 文件格式将它们导出到 Google Cloud Storage (GCS) 存储桶。

EXPORT DATA
  OPTIONS (
    uri = 'gs://**/ep_behavior/*.parquet',
    format = 'parquet',
    overwrite = true
  )
AS (
SELECT * FROM `project.global_threat_report.2023_pre_norm_ep_behavior`
)

用于加载分阶段数据集的 Colab Notebook

Colab Notebooks对于组织我们的数据提取过程起到了重要作用。 它们允许轻松访问和管理存储在 GitHub 和 Google Drive 等平台的数据脚本。

对于身份验证和授权,我们使用 Google Workspace 凭据,简化对各种 Google Cloud 服务(包括 BigQuery 和 Colab Notebooks)的访问。 以下是如何处理身份验证的基本示例:

Google Cloud 服务之间的身份验证和授权图表

对于刚接触Jupyter Notebooks或数据框的人来说,花时间熟悉这些工具是有益的。 它们是任何数据分析师工具包的基础,可实现高效的代码管理、数据分析和结构化。 掌握这些工具是有效数据分析的关键。

在 Google Colab 中创建笔记本后,我们就可以提取自定义表(例如 project.global_threat_report.ep_behavior_raw) 来自 BigQuery。 然后将这些数据加载到 Pandas Dataframes(一个有助于数据操作和分析的 Python 库)中。 虽然使用 Python 处理大型数据集可能具有挑战性,但 Google Colab 提供了强大的虚拟计算资源。 如果需要,可以通过 Google Cloud Marketplace或 Google Cloud Console 扩展这些资源,确保即使是大型数据集也能得到高效处理。

数据分析必备的 Python 库

在我们的数据分析过程中,我们使用各种 Python 库,每个库都有特定的用途:

图书馆描述
日期时间对于处理与数据中的日期和时间相关的所有操作至关重要。 它允许您操作和格式化日期和时间信息以供分析。
google.auth管理身份验证和访问权限,确保安全访问 Google Cloud 服务。 它是控制谁可以访问您的数据和服务的关键。
google.colab.auth提供在 Google Colab 笔记本中访问 Google Cloud 服务的身份验证,从而实现与基于云的资源的安全连接。
google.cloud.bigquery用于管理 Google Cloud 的 BigQuery 服务中的大型数据集的工具。 它可以有效地处理和分析大量数据。
google.cloud.storage用于在 Google Cloud Storage 中存储和检索数据。 它是处理云中各种数据文件的理想解决方案。
跨度促进与 Google 电子表格的交互,允许轻松操作和分析电子表格数据。
gspread.dataframe .set_with_dataframe在 Pandas 数据框和 Google 电子表格之间同步数据,实现这些格式之间的无缝数据传输和更新。
matplotlib.pyplot.pltMatplotlib 库中用于创建图表和图形的模块。 它有助于以图形格式可视化数据,从而更容易理解模式和趋势。
pandasPython 中用于数据操作和分析的基本工具。 它提供用于操作数字表和时间序列的数据结构和操作。
pandas.gbq.to_gbq支持将数据从 Pandas 数据框直接传输到 Google BigQuery,简化将数据移动到这个基于云的分析平台的过程。
pyarrow .parquet.pq允许以 Parquet 格式高效存储和检索数据,Parquet 格式是一种针对大型数据集使用而优化的列式存储文件格式。
西伯恩基于 Matplotlib 的 Python 可视化库,提供用于绘制有吸引力且信息丰富的统计图形的高级界面。

接下来,我们通过 BigQuery 进行身份验证,并获得访问数据集的授权,如前所示。 通过使用 Google Workspace 凭据,我们可以轻松访问 BigQuery 和其他 Google Cloud 服务。 该过程通常涉及一个简单的身份验证代码片段:

from google.colab import auth
from google.cloud import bigquery

auth.authenticate_user()
project_id = "PROJECT_FROM_GCP"
client = bigquery.Client(project=project_id)

身份验证完成后,我们就可以继续访问和处理我们的数据。 Google Colab 与 Google Cloud 服务的集成简化了这一过程,使其高效且安全。

分析之前组织 Colab Notebook

使用 Jupyter Notebooks 时,最好事先整理好你的笔记本。 需要处理和操作数据的各个阶段,保持井然有序将帮助您创建可重复的、全面的过程。

在我们的笔记本中,我们使用 Jupyter Notebook 标题来系统地组织代码。 这种结构允许清晰地划分区域并创建可折叠的部分,这在处理需要多个步骤的复杂数据操作时尤其有益。 这种有条不紊的组织有助于有效地浏览笔记本,确保数据提取和分析过程中的每个步骤都易于访问和管理。

此外,虽然笔记本中的工作流程看起来是线性的,但它通常更具动态性。 数据分析师经常进行多任务处理,根据遇到的数据或结果根据需要在不同部分之间跳转。 此外,在一个步骤中发现的新见解可能会影响另一个步骤的进程,从而导致在完成笔记本之前需要反复进行。 |

将我们的 BigQuery 数据集提取到数据框中

在建立笔记本结构并成功通过 BigQuery 身份验证后,我们的下一步是检索所需的数据集。 这一过程为报告的其余部分奠定了基础,因为来自这些来源的信息将构成我们分析的基础,类似于选择全面研究所需的关键组成部分。

以下是我们如何从 BigQuery 获取数据的示例:

import datetime

current_year = datetime.datetime.now().year
reb_dataset_id = f'project.global_threat_report.{current_year}_raw_ep_behavior'
reb_table = client.list_rows(reb_dataset_id)
reb_df = reb_table.to_dataframe()

此代码片段演示了典型的数据检索过程。 我们首先定义我们感兴趣的数据集(使用全球威胁报告,当前年份为project.global_threat_report.ep_behavior_raw )。 然后,我们使用 BigQuery 查询从该数据集中选择数据并将其加载到 Pandas DataFrame 中。 这个DataFrame将作为我们后续数据分析步骤的基础。

Colab Notebook 代码片段,用于从 BigQuery 中提取数据到 Pandas 数据框中

该过程标志着提取阶段的完成。 我们已经成功导航 BigQuery 来选择和检索必要的数据集,并将它们加载到数据框内的笔记本中。 提取阶段至关重要,因为它不仅涉及收集数据,还为更深入的分析奠定基础。 这是更大的探索之旅的第一步,将引领我们进入转型阶段,我们将从数据中发现更详细的见解。

总而言之,我们数据之旅的这一部分不仅仅是收集数据集;它还包括从结构上为接下来的深入分析做好准备。 这种组织和执行提取阶段的细致方法为我们在数据分析的后续阶段想要获得的变革性洞察奠定了基础。

预处理和转换:数据分析的关键阶段

从原始数据到可操作见解的转变涉及数据处理中的一系列关键步骤。 提取数据后,我们的重点转移到对其进行细化以进行分析。 网络安全数据集通常包含各种形式的噪声,例如误报和异常,必须解决这些问题才能确保准确和相关的分析。

数据预处理和转换的关键阶段:

  • 数据清理:此阶段涉及填充 NULL 值、纠正数据错位以及验证数据类型以确保数据集的完整性。
  • 数据丰富:在此步骤中,将额外的上下文添加到数据集中。 例如,结合第三方数据(如来自 VirusTotal 等来源的恶意软件信誉),可以增强分析的深度。
  • 规范化:此过程将数据标准化以确保一致性,这对于端点恶意软件警报等多样化数据集尤为重要。
  • 异常检测:识别和纠正异常值或误报对于保持数据集的准确性至关重要。
  • 特征提取:识别有意义、一致的数据点的过程,这些数据点可以进一步提取出来进行分析。

拥抱数据清理的艺术

数据清理是准备数据集以进行全面分析的基本步骤,尤其是在网络安全领域。 此过程涉及一系列技术检查,以确保数据的完整性和可靠性。 具体步骤如下:

  • 映射到 MITRE ATT&CK 框架:验证数据集中的所有检测和响应规则是否准确映射到 MITRE ATT&CK 框架中相应的策略和技术。 此检查包括查找 NULL 值或数据与框架一致的任何不一致之处。

  • 数据类型验证:确认数据集内的数据类型适当且一致。 例如,时间戳应该采用标准化的日期时间格式。 此步骤可能涉及将字符串格式转换为日期时间对象或验证数值是否具有正确的格式。

  • 关键数据的完整性:确保数据集中没有缺少重要信息。 这包括检查端点行为日志中是否存在诸如 SHA256 哈希或可执行文件名称等基本元素。 缺乏这些数据可能导致分析不完整或有偏差。

  • 跨数据格式的标准化:评估并实施整个数据集的数据格式标准化,以确保统一性。 这可能涉及规范文本格式、确保大小写一致或标准化日期和时间表示。

  • 重复条目识别:通过检查唯一标识符(例如 XDR 代理 ID 或集群 ID)来识别并删除重复条目。 此过程可能涉及使用函数来检测和删除重复项,以确保每个数据条目的唯一性。

  • 排除不相关的内部数据:找到并删除可能无意中包含在数据集中的任何内部数据。 此步骤至关重要,以防止内部偏见或不相关的信息影响分析。

值得注意的是,数据清理或“擦洗数据”是我们整个工作流程中的一项持续的努力。 随着我们不断剥离数据层并对其进行各种分析,我们有望发现更多变化。

利用 Pandas 进行数据清理

Python 中的Pandas库提供了多种功能,对于网络安全环境中的数据清理特别有用。 这些方法包括:

  • DataFrame.isnull()DataFrame.notnull()来识别缺失值。
  • DataFrame.drop_duplicates() 删除重复的行。
  • 数据类型转换方法(例如pd.to_datetime()用于标准化时间戳格式。
  • 利用布尔索引根据特定标准过滤掉不相关的数据。

彻底了解数据集对于确定正确的清理方法至关重要。 可能需要初步探索数据集以确定需要清理或转换的特定区域。 在Real Python 博客中可以找到列出的其他有用的方法和工作流程。

特征提取和丰富

特征提取和丰富是数据分析的核心步骤,尤其是在网络安全领域。 这些过程涉及转换和扩充数据集以增强其分析实用性。

  • 从现有数据创建新数据:这是我们修改或使用现有数据来添加额外的列或行的地方。
  • 从第三方添加新数据:在这里,我们使用现有数据作为第三方 RESTful API 的查询参考,这些 API 会响应我们可以添加到数据集的附加数据。

特征提取

让我们深入研究一个具体的例子。 想象一下,我们获得了 Elastic 与其社区共享的大量公开可用的 YARA 签名。 这些签名触发了我们数据集中的某些端点恶意软件警报。 根据规则名称可以观察到一致的命名约定,该规则名称当然会显示在原始数据中: OperationsSystem_MalwareCategory_MalwareFamily 。 这些名称可以被解构以提供更具体的见解。 利用 Pandas,我们可以熟练地对数据进行切分。 对于那些喜欢在使用 BigQuery 的数据集暂存阶段执行此操作的人来说, SPLITOFFSET子句的组合可以产生类似的结果:

df[['OperatingSystem', 'MalwareCategory', 'MalwareFamily']] = df['yara_rule_name'].str.split('_', expand=True)

使用我们的 YARA 数据进行特征提取

数据分析中还有其他方法、手段和流程可以进行特征提取。 我们建议咨询利益相关者的需求并探索您的数据,以帮助确定提取所需的内容以及如何提取。

数据扩充

数据丰富增强了网络安全数据集的深度和背景。 一种有效的方法是整合外部数据源,为现有数据提供额外的视角。 这对于理解和解释网络安全警报尤其有价值。

数据丰富的示例:集成 VirusTotal 信誉数据网络安全中数据丰富的一种常见方法是合并来自外部威胁情报服务(如VirusTotal (VT))的信誉分数。 该过程通常包括:

  1. 获取声誉数据:使用来自 VT 的 API 密钥,我们可以根据数据集中的唯一标识符(例如二进制文件的 SHA256 哈希值)查询声誉数据。
import requests

def get_reputation(sha256, API_KEY, URL):
    params = {'apikey': API_KEY, 'resource': sha256}
    response = requests.get(URL, params=params)
    json_response = response.json()
    
    if json_response.get("response_code") == 1:
        positives = json_response.get("positives", 0)
        return classify_positives(positives)
    else:
        return "unknown"

在此函数中, classify_positives是一个自定义函数,它根据将文件标记为恶意的防病毒引擎的数量对信誉进行分类。

  1. 将信誉数据添加到数据集:从 VirusTotal 获取的信誉数据随后被集成到现有数据集中。 这是通过将get_reputation函数应用于 DataFrame 中的每个相关条目来实现的。
df['reputation'] = df['sha256'].apply(lambda x: get_reputation(x, API_KEY, URL))

这里,一个名为reputation的新列被添加到数据框中,根据 VirusTotal 中的检测率提供有关每个二进制文件的额外信息层。

这种数据丰富方法只是增强网络安全威胁数据的众多选项之一。 通过利用强大的辅助功能并利用外部数据存储库,分析师可以显著丰富他们的数据集。 这种丰富使得人们能够更全面地了解数据,从而做出更明智和更细致的分析。 这里展示的技术是更广泛的先进数据处理方法的一部分,可以进一步完善网络安全数据分析。

正常化

特别是在处理网络安全中的各种数据集(例如端点警报和云 SIEM 通知)时,可能需要进行规范化才能充分利用您的数据。

理解规范化:从本质上讲,规范化就是将不同尺度上测量的值调整到一个共同的尺度,确保它们按比例表示,并减少冗余。 在网络安全环境中,这意味着以不会无意中放大或降低其重要性的方式表示事件或警报。

考虑我们的端点恶意软件数据集。 当分析趋势(例如基于恶意软件家族或类别的感染)时,我们的目标是准确的表述。 但是,根据扩展检测和响应 (XDR) 系统,端点上的单个恶意软件感染可能会生成多个警报。 如果不加以控制,这可能会严重扭曲我们对威胁形势的理解。 为了解决这个问题,我们考虑使用 Elastic 代理,将其作为 XDR 解决方案的一部分进行部署。 每个端点都有一个唯一的代理,如果检测到恶意软件,则代表一个感染实例。 因此,为了规范化该数据集,我们将根据唯一的代理 ID 对其进行“扁平化”或调整。 这意味着,对于我们的分析,我们会考虑受特定恶意软件家族或类别影响的唯一代理 ID 的数量,而不是原始警报的数量。

通过独特代理实现恶意软件警报规范化的可视化示例

如上图所示,如果我们选择不规范恶意软件数据以进行趋势分析,我们的主要发现将会描绘不准确的信息。 这种不准确性可能源于大量数据不一致,例如通用 YARA 规则、在单个端点上重复标记的程序操作等等。

方法多样化:另一方面,在处理端点行为警报或云警报(来自 AWS、GCP、Azure、Google Workspace 和 O365 等平台)时,我们的规范化方法可能会有所不同。 这些数据集可能有其自身的细微差别,并且可能不需要用于恶意软件警报的相同“扁平化”技术。

概念化规范化选项:记住规范化的目标是减少数据中的冗余。 确保你的操作尽可能的原子化,以便以后需要返回并进行调整。 在执行规范化和标准化时尤其如此。 有时这两者可能很难分开,你可能不得不在两者之间来回切换。 分析师对此有很多选择。 从最小-最大缩放(其中值被移动并重新缩放到 0 和 1 之间的范围)到Z 分数规范化(或标准化),其中值以零和平均值的标准差为中心。 技术的选择取决于数据的性质和分析的具体要求。

本质上,规范化确保我们的网络安全分析基于公平的竞争环境,让利益相关者准确了解威胁环境,而不会出现过度扭曲。 这是趋势分析之前的关键步骤。

异常检测:完善数据分析过程

在网络安全分析领域,并不存在一种通用的异常检测方法。 该过程高度依赖于手头数据的具体特征。 主要目标是识别并解决可能扭曲分析的异常值。 这需要一种动态且适应性强的方法,其中理解数据集的细微差别至关重要。

网络安全中的异常检测涉及探索各种技术和方法,每种技术和方法适用于不同类型的数据异常。 该策略不是严格地应用单一方法,而是利用对数据的深入了解来为每种情况选择最合适的技术。 重点在于灵活性和适应性,确保所选择的方法能够提供最清晰、最准确的数据洞察。

统计方法-分析的支柱:

统计分析始终是异常检测的可选方法,尤其是对于网络安全数据。 通过了解我们数据的固有分布和集中趋势,我们可以突出显示偏离常态的值。 Z 分数是一种简单但有效的方法,它用标准差来衡量数据点与平均值的距离。

import numpy as np

# Derive Z-scores for data points in a feature
z_scores = np.abs((df['mitre_technique'] - df['mitre_technique'].mean()) / df['mitre_technique'].std())

outliers = df[z_scores > 3]  # Conventionally, a Z-score above 3 signals an outlier

为什么这很重要:这种方法使我们能够定量地衡量数据点偏差的重要性。 这些异常值会严重扭曲平均值等总体指标,甚至对机器学习模型训练产生不利影响。 请记住,不应总是删除异常值;一切都与背景有关! 有时您甚至可能正在专门寻找异常值。

关键库:虽然我们上面使用了NumPy ,但SciPy也可以用于复杂的统计运算。

聚合和排序——解开层:

数据通常以层次形式呈现。 通过从高层视角开始并逐渐深入细节,我们可以发现不一致或异常的情况。 当我们按 MITRE ATT&CK 策略等类别进行聚合,然后深入研究时,我们会从技术到规则逻辑和警报上下文,逐渐发现更精细的细节和潜在异常。

# Aggregating by tactics first
tactic_agg = df.groupby('mitre_tactic').size().sort_values(ascending=False)

从这里,我们可以识别最常见的策略并选择计数最高的策略。 然后,我们过滤此策略的数据,以找出与最常见策略相关的最常见技术。 技术通常比策略更具体,因此可以对我们可能观察到的事物提供更多的解释。 按照相同的方法,我们可以过滤这种特定的技术,按规则聚合并查看该检测规则以获取更多上下文。 这里的目标是找到可能扭曲我们的数据集的“嘈杂”规则,因此需要删除相关警报。 该循环可重复进行,直到异常值被消除并且百分比看起来更加准确。

为什么这很重要:这种分层分析方法可确保不遗漏任何细节。 通过从一般到具体,我们系统地消除了不一致之处。

关键库: Pandas 仍然是英雄,能够巧妙地处理数据整理工作。

可视化——清晰度的镜头:

有时,在正确的视觉表现的帮助下,人眼可以直观地检测到最复杂的算法可能会遗漏的东西。 例如,箱线图不仅显示数据的集中趋势和分布,而且还清楚地标记异常值。

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 8))
sns.boxplot(x='Malware Family', y='Malware Score', data=df)
plt.title('Distribution of Malware Scores by Family')
plt.show()

来自示例数据集的恶意软件分布分数的可视化示例

为什么重要:可视化将抽象数据转化为切实的见解。 根据需要,它提供了整体的、细致的视角。

关键库: Seaborn 建立在 Matplotlib 之上,擅长将数据转化为视觉故事。

机器学习——先进:

当传统方法不足时,机器学习就会介入,为异常现象提供预测视角。 虽然许多算法被设计用于对已知模式进行分类,但有些算法(如深度学习中的自动编码器)会学习重新创建“正常”数据,将任何偏差标记为异常。

为什么这很重要:随着数据复杂性的增加,构成异常的界限变得越来越模糊。 机器学习提供了随数据不断发展的自适应解决方案。

关键库: Scikit-learn是用户友好的经典机器学习技术的宝库,而PyTorch则带来了深度学习的强大功能。

完善数据分析中的异常检测类似于通过练习和迭代来完善复杂的技能。 该过程通常涉及反复试验,每次迭代都会增强分析师对数据集的熟悉度。 这种渐进的理解是确保最终分析既稳健又富有洞察力的关键。 在数据分析中,探索和改进的过程与最终结果本身一样有价值。

在进行深入趋势分析之前,确保数据彻底经过预处理和转换非常重要。 正如精确度和可靠性对于任何细致的任务都至关重要一样,它们对于数据分析也同样重要。 清理、规范化、丰富和消除异常的步骤,从基础上获得有意义的见解。 如果没有这些精心的准备,分析可能会有些不准确,甚至会产生很大的误导。 只有当数据经过适当提炼且没有扭曲时,它才能显示出其真实价值,从而在趋势分析中获得可靠且可操作的见解。

趋势分析:揭示数据模式

在网络安全这个动态领域中,威胁行为者不断发展其策略、技术和程序 (TTP),因此保持领先于新兴威胁至关重要。 趋势分析在这方面起到了至关重要的作用,它提供了一种方法来识别和理解网络威胁随时间的模式和行为。

通过利用 MITRE ATT&CK 框架,网络安全专家可以采用结构化和标准化的方法来分析和分类这些不断演变的威胁。 该框架有助于系统地识别攻击方法中的模式,使防御者能够预测并有效应对对手行为的变化。

通过 MITRE ATT&CK 框架的视角,趋势分析将原始的网络安全遥测数据转化为可操作的情报。 它允许分析师跟踪攻击策略的演变并相应地调整他们的防御机制,确保在网络安全管理中采取主动立场。

从总体概述开始:聚合和排序

以鸟瞰的视角开始我们的分析至关重要。 这种全景视角使我们能够首先查明正在实施的更广泛的策略,然后再深入研究更细致的技术和底层检测规则。

顶级策略:通过汇总基于 MITRE ATT&CK 策略的数据,我们可以辨别对手倾向于采用的总体策略。 这描绘出了他们的主要目标,无论是初始访问、执行还是撤离。

top_tactics = df.groupby('mitre_tactic').size()
 .sort_values(ascending=False)

放大技术:一旦我们确定了一种突出的策略,我们就可以把注意力集中到与该策略相关的技术上。 这揭示了对手的具体作案手法。

chosen_tactic = 'Execution'

techniques_under_tactic = df[df['mitre_tactic'] == chosen_tactic]
top_techniques = techniques_under_tactic.groupby('mitre_technique').size()
 .sort_values(ascending=False)

检测规则和逻辑:我们关注的是特定的技术,现在是时候深入研究,确定触发警报的检测规则。 这不仅展示了检测到的内容,而且通过查看检测逻辑,我们还可以了解标记的精确行为和模式。

chosen_technique = 'Scripting'

rules_for_technique = techniques_under_tactic[techniques_under_tactic['mitre_technique'] == chosen_technique]

top_rules = rules_for_technique
 .groupby('detection_rule').size().sort_values(ascending=False)

这种分层的、层叠的方法类似于剥洋葱。 每层都暴露出更复杂的细节,完善我们的视角并增强我们的洞察力。

时间的力量:时间序列分析

在网络安全领域,时间不仅仅是一个指标,更是一种叙述。 时间戳常常被忽视,但它却是洞察力的金矿。 时间序列分析使我们能够绘制随时间变化的事件,揭示可能预示对手活动、特定攻击浪潮或休眠期的模式、峰值或平静期。

例如,绘制随时间推移的端点恶意软件警报可以揭示对手的操作时间或聚焦同步的多向量攻击:

import matplotlib.pyplot as plt

# Extract and plot endpoint alerts over time
df.set_index('timestamp')['endpoint_alert'].resample('D').count().plot()
plt.title('Endpoint Malware Alerts Over Time')
plt.xlabel('Time')
plt.ylabel('Alert Count')
plt.show()

时间序列分析不仅强调“何时”,而且常常能洞察某些峰值或异常背后的“原因”。 它有助于将外部事件(如新漏洞的发布)与内部数据趋势关联起来。

相关性分析

了解不同数据集之间的关系可以提供有价值的见解。 例如,一种警报的激增可能与系统中的另一种活动相关,从而揭示多阶段攻击活动或转移策略。

# Finding correlation between an increase in login attempts and data exfiltration activities
correlation_value = df['login_attempts'].corr(df['data_exfil_activity'])

在 pandas corr的帮助下,这项分析可以帮助辨别多个看似孤立的活动是否是协同攻击链的一部分。

相关性也不一定非要由指标驱动。 在分析威胁时,通过将旧发现与新发现进行比较,很容易找到价值和新见解。

机器学习和异常检测

由于数据量巨大,手动分析变得不切实际。 机器学习可以帮助识别人眼可能无法发现的模式和异常。 孤立森林K 最近邻(KNN) 等算法通常用于发现常见相关数据的偏差或聚类。

from sklearn.ensemble import IsolationForest

# Assuming 'feature_set' contains relevant metrics for analysis
clf = IsolationForest(contamination=0.05)
anomalies = clf.fit_predict(feature_set)

在这里,异常变量将标记偏离常态的数据点,帮助分析师迅速查明异常行为。

行为模式和端点数据分析

通过分析从检测规则收集的端点行为数据,我们可以发掘出可以指示更广泛的威胁形势、网络活动或不断发展的攻击者 TTP 的总体模式和趋势。

战术进展模式:通过一段时间内监控检测到的行为序列,我们可以发现对手在其攻击链中移动的模式。 例如,如果存在一种一致的趋势,即初始访问技术之后是执行,然后是横向移动,这表明正在采用常见的攻击者剧本。

命令行趋势分析:即使在恶意命令行参数中,也会出现某些模式或序列。 监控最常检测到的恶意参数可以深入了解受欢迎的攻击工具或脚本。

示例:

# Most frequently detected malicious command lines
top_malicious_commands = df.groupby('malicious_command_line').size()
 .sort_values(ascending=False).head(10)

进程交互趋势:虽然单个父子进程关系可能是恶意的,但发现这些交互中的趋势可以暗示广泛的恶意软件活动或攻击者 TTP。 例如,如果大量端点显示出相同的不寻常的过程交互,则可能表明存在共同的威胁。

时间行为模式:与其他类型的数据一样,端点行为数据的时间方面可以提供启发。 分析某些恶意行为的频率和时间可以暗示攻击者的操作时间或活动持续时间。

示例:

# Analyzing frequency of a specific malicious behavior over time
monthly_data = df.pivot_table(index='timestamp', columns='tactic', values='count', aggfunc='sum').resample('M').sum()

ax = monthly_data[['execution', 'defense-evasion']].plot(kind='bar', stacked=False, figsize=(12,6))

plt.title("Frequency of 'execution' and 'defense-evasion' Tactics Over Time")

plt.ylabel("Count")
ax.set_xticklabels([x.strftime('%B-%Y') for x in monthly_data.index])
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

注意:此图像来自示例数据,而非来自《全球威胁报告》

通过在宏观层面汇总和分析端点行为数据,我们不仅可以识别孤立的威胁,还可以发现波动、趋势和新兴模式。 这种更广阔的视角使网络安全团队能够更有效地预测、准备和应对大规模网络威胁。

虽然这些是如何进行趋势分析的一些示例,但没有正确或错误的方法。 每个分析师都有自己的偏好或他们或利益相关者可能想要问的一系列问题。 以下是分析师在进行趋势分析时可能对网络安全数据提出的一些其他问题或疑问。

  • 本季度对手所采用的三大策略是什么?
  • 哪些检测规则触发最多?是否存在共同点?
  • 端点警报中是否存在基于时间的模式,可能暗示对手的时区?
  • 随着越来越多的服务迁移到云端,云警报如何发展?
  • 哪些恶意软件家族正变得越来越普遍?其原因可能是什么?
  • 数据模式是否显示出任何季节性,例如年底活动增加?
  • 外部事件和网络活动激增之间是否存在关联?
  • 就警报和攻击而言,工作日数据与周末有何不同?
  • 哪些组织资产最容易受到攻击?它们的防御措施是否是最新的?
  • 特权账户中是否存在内部威胁或异常行为的迹象?

网络安全趋势分析是一个动态的过程。 虽然我们已经确定了一些基础技术和问题,但仍然有无数种方法可以解决这个广阔的领域。 每个分析师可能有自己的偏好、工具和方法,这完全没问题。 本质在于不断发展和适应我们的方法,同时意识到每个面临威胁的生态系统不断变化的威胁形势。

简化:简化流程,清晰易懂

在完成了数据分析的初始阶段后,我们现在进入了下一个阶段:减少。 这一步是为了将我们的综合数据提炼和浓缩为更易于理解和更集中的格式。

迄今为止的分析历程回顾:

  • 提取:初始阶段涉及设置我们的 Google Cloud 环境并选择相关数据集进行分析。
  • 预处理和转换:在此阶段,数据在我们的 Colab 笔记本中提取、处理和转换,为详细分析做好准备。
  • 趋势分析:此阶段对网络攻击策略、技术和恶意软件提供了深入的见解,构成了我们分析的核心。

虽然我们的 Colab Notebooks 中的详细数据对于分析师来说是广泛且信息丰富的,但对于更广泛的受众来说可能过于复杂。 因此,缩减阶段的重点是将这些信息提炼为更简洁、更易于理解的形式。 目的是使调查结果清晰易懂,确保能够在各个部门或利益相关者之间有效地传达和利用。

选择并汇总关键数据点

为了有效地传达我们的研究成果,我们必须根据观众的需求来定制演示文稿。 并非每个利益相关者都需要收集全部数据;许多人更喜欢突出显示最可行要点的汇总版本。 这就是数据选择和聚合发挥作用的地方,重点关注最重要的元素并以可访问的格式呈现它们。

以下是如何使用 Pandas 聚合和压缩数据集的示例,重点关注端点行为的关键方面:

required_endpoint_behavior_cols = ['rule_name','host_os_type','tactic_name','technique_name']


reduced_behavior_df = df.groupby(required_endpoint_behavior_cols).size()
 .reset_index(name='count')
 .sort_values(by="count", ascending=False)
 .reset_index(drop=True)

columns = {
    'rule_name': 'Rule Name', 
    'host_os_type': 'Host OS Type',
    'tactic_name': 'Tactic', 
    'technique_name': 'Technique', 
    'count': 'Alerts'
}

reduced_behavior_df = reduced_behavior_df.rename(columns=columns)

此代码和流程的一个显著特点是它提供的灵活性。 例如,我们可以根据需要根据各种数据点对数据进行分组。 有兴趣了解对手常用的战术吗? 按 MITRE ATT&CK 策略分组。 想要揭露伪装的恶意二进制文件吗? 重新访问提取以添加更多弹性通用模式 (ECS) 字段,例如文件路径、防御逃避过滤器以及聚合以揭示常用路径。 这种方法确保我们创建的数据集既具有启发性又不会过于丰富,并为希望了解我们分析起源的利益相关者量身定制。

此过程涉及按相关类别(例如规则名称、主机操作系统类型以及 MITRE ATT&CK 策略和技术)对数据进行分组,然后计算发生次数。 该方法有助于识别数据中最普遍的模式和趋势。

数据聚合以获取简化数据集的图表示例

将精简数据导出至 Google 表格,以方便访问

简化后的数据现在作为数据框存储在内存中,可以导出了。 我们使用 Google Sheets 作为分享这些见解的平台,因为它具有广泛的可访问性和用户友好的界面。 由于与 Google Cloud 服务的集成,将数据导出到 Google Sheets 的过程变得简单而高效。

以下是如何使用 Python 将数据从我们的 Colab 笔记本上传到 Google 表格的示例:

auth.authenticate_user()
credentials, project = google.auth.default()
gc = gspread.authorize(credentials)
workbook = gc.open_by_key("SHEET_ID")
behavior_sheet_name = 'NAME_OF_TARGET_SHEET'
endpoint_behavior_worksheet = workbook.worksheet(behavior_sheet_name)
set_with_dataframe(endpoint_behavior_worksheet, reduced_behavior_df)

只需几行简单的代码,我们就有效地将我们的数据分析结果转移到了 Google Sheets。 该方法由于其可访问性和易用性而被广泛使用。 然而,还有多种其他方法来呈现数据,每种方法都适合不同的要求和受众。 例如,有些人可能会选择像Looker这样的平台以更动态的仪表板格式呈现处理后的数据。 此方法对于创建交互式且具有视觉吸引力的数据演示特别有用。 它确保即使那些不熟悉数据分析技术方面的利益相关者(例如使用 Jupyter Notebooks 工作的利益相关者)也可以轻松理解并从洞察中获得价值。

这种简化的数据缩减和呈现过程可以应用于不同类型的数据集,例如云 SIEM 警报、端点行为警报或恶意软件警报。 目标保持不变:简化和集中数据以获得清晰且可操作的见解。

演示:展示见解

在精心完善我们的数据集之后,我们现在关注最后阶段:演示。 在这里,我们获取现在整齐地组织在 Google Sheets 或 Looker 等平台中的数据集,并将它们转换为既信息丰富又引人入胜的格式。

用于深入分析的数据透视表

使用数据透视表,我们可以全面概述趋势分析结果。 这些表格使我们能够以多维的方式显示数据,提供对网络安全各个方面的见解,例如流行的 MITRE ATT&CK 策略、选择的技术和首选的恶意软件家族。

我们的数据可视化方法包括:

  • MITRE ATT&CK 策略的广泛概述:从总体角度开始,我们使用数据透视表来概述网络威胁中采用的不同策略。
  • 详细细分:从这个全景视图开始,我们深入研究,为每种流行的策略创建单独的数据透视表,然后针对每种技术和特定的检测规则进行详细分析。

这种有条不紊的过程有助于揭示检测逻辑和警报的复杂性,有效地讲述网络威胁形势的故事。

展示汇总漏斗进入上下文报告信息的图表

各个受众的可访问性:我们的数据演示旨在满足广泛的受众的需求,从精通数据科学的受众到喜欢更直接理解的受众。 Google Workspace 生态系统促进了这些见解的共享,使得报告制作过程中涉及的所有人都能轻松访问数据透视表、简化数据集和其他元素。

将可视化效果集成到报告中:例如,在 Google Docs 中制作报告时,可以无缝集成 Google Sheets 中的图表和表格。 这种集成可确保数据集或数据透视表中的任何修改都可以轻松地在报告中更新,从而保持演示的效率和连贯性。

根据观众定制演示文稿:数据洞察的演示不仅仅是传达信息;而是以一种视觉上吸引人且易于理解的方式来传达信息。 对于更精通技术的受众来说,具有动态图表和功能的交互式 Colab Notebook 可能是理想的选择。 相比之下,对于营销或设计团队来说,Looker 中精心设计的仪表板可能更合适。 关键是要确保演示清晰、简洁、视觉上有吸引力,并根据观众的特定喜好和需求进行定制。

结论:回顾数据分析历程

总而言之,反思我们在分析网络威胁数据时所探索的领域是有价值的。 这一旅程涉及几个关键阶段,每个阶段都对我们的最终见解做出了重大贡献。

探索 Google Cloud 生态系统

我们的路径带我们体验了多项 Google Cloud 服务,包括 GCP、GCE、Colab Notebooks 和 Google Workspace。 每个人都发挥了关键作用:

数据探索:我们从一系列想要回答的网络相关问题开始,并探索我们拥有的大量数据集。 在这篇博客中,我们只关注 BigQuery 中可用的遥测。 数据提取:我们首先提取原始数据,利用 BigQuery 有效地处理大量数据。 提取操作在 BigQuery 和我们的 Colab 笔记本中均有发生。 数据整理和处理:利用 Python 和 pandas 库的强大功能来清理、汇总和细化这些数据,就像厨师熟练地准备食材一样。 趋势分析:然后,我们使用多种方法对改革后的数据集进行趋势分析,以便随着时间的推移收集有关对手的策略、技术和程序的宝贵见解。 减少:在趋势分析的基础上,我们通过目标数据点汇总不同的数据集,准备向利益相关者和同行展示。 转换到演示:在网络浏览器中从数据分析转换到演示的轻松性凸显了我们工具的灵活性,促进了无缝的工作流程。

工作流程的模块化和灵活性

我们的方法的一个重要方面是工作流程的模块化特性。 从数据提取到呈现的每个阶段都具有 Google Cloud 生态系统中可互换的组件,使我们能够根据特定需求定制流程:

多功能工具: Google Cloud Platform 提供了多种工具和选项,实现了数据存储、分析和呈现的灵活性。 定制分析路径:根据我们分析的具体要求,我们可以调整和选择不同的工具和方法,确保针对每个数据集采用量身定制的方法。 身份验证和授权:由于我们的实体位于 Google Cloud 生态系统中,因此访问不同的工具、站点、数据等都毫不费力,确保服务之间的顺利过渡。

编排和工具同步

我们的技术技能和所选工具之间的协同作用至关重要。 这种协调确保了分析过程不仅对该项目有效,而且为未来更高效、更有见地的分析奠定了基础。 这些工具用于增强我们的能力,让我们专注于获得有意义的见解,而不是陷入技术复杂性。

总之,这次数据分析之旅强调了深思熟虑的方法、利用正确的工具和技术以及满足网络威胁数据分析需求的适应性的重要性。 最终结果不仅仅是一组发现,而是一种完善的方法,可应用于不断发展的网络安全领域的未来数据分析工作。

行动呼吁:踏上您自己的数据分析之旅

您的分析工作区已准备就绪! 您能带来哪些有关 Google Cloud 或其他数据分析平台的创新方法或经验? 数据分析领域广阔且多样,尽管每个分析师都有其独特之处,但其底层方法和原则却是通用的。

目标不仅仅是让您当前的分析项目表现出色,而且还要不断增强和调整您的技术。 这种持续的改进可确保您未来在数据分析方面的努力更加富有成效、更具启发性和影响力。 使用 Google Cloud 深入探索数据分析的世界!

我们鼓励针对此主题的任何反馈和参与! 如果您愿意这样做,请随时在 Elastic 的公共#security Slack 频道中与我们联系。