异常检测与威胁狩猎:使用Anomalize工具识别安全日志中的异常活动

本文详细介绍了如何利用R语言中的anomalize包,通过STL和Twitter等时间序列分解方法,在海量安全事件日志中高效检测异常登录行为,为蓝队进行威胁狩猎和安全监控提供了具体的技术实现与代码示例。

工具介绍:Anomalize

当我在此前的工具文章中基于“为R语言调查者提供更深层功能”这一前提重新定义DFIR时,我发现这只是“冰山一角”。为此,我想通过一项额外的发现和机会来重新探讨这个概念。实际上,这是在原始且至关重要的DFIR(数字取证/事件响应)常规实践中,嵌套了另一种DFIR(为R语言调查者提供更深层功能)的案例。

正如之前所讨论的,我们这些从事DFIR实践以及广义蓝队工作的人,都被数据和规模所淹没。真正的成功需要算法方法。如果你尚未涉足此领域,我将通过anomalize进行整洁异常检测,为你提供一个可直接应用的案例研究。

首先,请允许我将接下来的工作完全归功于其原作者。我所讨论和提供的一切都直接源自Business Science(@bizScienc),特别是Matt Dancho(@mdancho84)。他创建了anomalize——“一个基于时间(构建于tibbletime之上)的整洁异常检测算法,可从单个扩展到多个时间序列”——当时一位客户要求Business Science构建一个满足其需求的开源异常检测算法。我得说他的回应非常出色。当他的博文通过R-Bloggers进入我的视野时,它作为一个打开的标签页在我的浏览器中停留了一个多月,直到催生了这篇工具文章。请务必将Matt的帖子作为此过程的第一步进行阅读。在转换上下文之前,我将特别引用Matt的话:“我们的客户面临一个挑战:大规模检测每日或每周时间序列中的异常。异常指示了特殊事件,可能是营销领域增加的网络流量,也可能是IT领域服务器故障。无论如何,标记这些不寻常的发生对于确保业务平稳运行都很重要。其中一个挑战是,客户需要分析的并非一个时间序列,而是成千上万个需要分析这些极端事件的时间序列。”

关键要点:大规模检测每日或每周时间序列数据中的异常。异常指示特殊事件。

现在,请与我一起将上下文转换到特定于安全的事件和事件,因为它们涉及安全监控、事件响应和威胁狩猎。在我2017年11月的文章中,记得我讨论了使用Holt-Winters方法的时间序列回归,重点关注季节性和趋势。不幸的是,我当时无法分享我们如何应用TSR的代码,但指出了替代方法,包括使用Loess的季节和趋势分解(STL):

  • 处理任何类型的季节性~可以随时间变化
  • 趋势周期的平滑度也可以由用户控制
  • 对异常值具有鲁棒性

现在,Matt创造了一种方法,可以立即应用STL方法以及Twitter方法(参考页面),作为其time_decompose()函数的一部分,这是anomalize包特有的三个函数之一。 除了time_decompose()(它将时间序列分解为季节性、趋势和余数分量)之外,anomalize还包括:

  • anomalize():将异常检测方法应用于余数分量。
  • time_recompose():计算分离“正常”数据与异常的界限。

anomalize()中使用的方法,包括IQR和GESD,在Matt的参考页面中有描述。Matt最终着手构建了Twitter的AnomalyDetection包的可扩展改编版,以应对其客户在处理并非一个而是数千个需要分析极端事件的时间序列时所面临的挑战。你会注意到,Matt使用从CRAN下载的15个tidyverse包的每日下载计数数据集来描述anomalize,这很相关,因为他利用了tidyverse包。我最初尝试调整Matt的演示,以模拟从CRAN下载特定于安全的R包(是的,确实有这些东西),包括RAppArmor、net.security、securitytxt和cynruservices,后两个来自我们挚爱的《数据驱动安全:分析、可视化和仪表板》的Bob Rudis(@hrbrmstr)。唉,这仅仅是复制和替换,并没有在应得的、多样化的、真正特定于安全的上下文中展示anomalize的使用。也就是说,我能够这样做立即生成结果,如图1所示。

图1:初始实验

应用于真实安全数据场景

我想针对真实的安全数据场景运行anomalize,所以我回到了原始DFIR文章中的数据集,在该数据集中,我使用了给定服务器集上每个用户每天的4624事件ID计数。如最初使用的那样,我仅表示了一个设备和用户的结果,但这就是anomalize的魅力所在。我们可以在多个时间序列(多个系统/用户)中快速获得结果。这个前提只是将时间序列分析和季节性应用于安全数据的众多场景之一。

我最初尝试将log.csv中的日志数据直接写入anomalize.R脚本,使用logs = read_csv("log.csv")读取到tibble中(准备好你的关于tibble的笑话),但这没有被准确解析,特别是时间属性。为了纠正这一点,我从Matt的Github中获取了tidyverse_cran_downloads.R,并修改如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
library(dplyr)
library(tibbletime)

setwd("C:/coding/R/anomalize/")
logs <- read_csv("log.csv")
security_access_logs <- logs %>%
  group_by(server) %>%
  as_tbl_time(date)
security_access_logs

由于tibbletime包,这有很大帮助,tibbletime包“是一个允许创建时间感知tibble的扩展。它的一些直接优势包括:能够对tibble执行基于时间的子集划分,按时间段快速汇总和聚合结果。”猜猜怎么着,Matt也写了tibbletime。:-)

然后,我按照Matt在Business Science上发布的序列,但将我的日志定义为Security_Access_Logs_Function.R中的一个函数。接下来,我将为你提供代码片段,这些片段是从Matt的示例中修改而来的,然后是它们各自处理我的事件ID 4624每日计数日志的具体结果。

首先,让我们总结四个月内三台服务器的每日登录计数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
library(tidyverse)
library(anomalize)

security_access_logs %>%
  ggplot(aes(date, count)) +
  geom_point(color = "#2c3e50", alpha = 0.25) +
  facet_wrap(~ server, scale = "free_y", ncol = 3) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
  labs(title = "Server Logon Counts",
       subtitle = "Data from Security Event Logs, Event ID 4624")

结果如图2所示。

图2:服务器登录计数可视化

接下来,让我们使用Matt的三个主要函数time_decompose()anomalize()time_recompose(),以及可视化函数plot_anomalies(),来确定四个月内三台服务器的哪些每日下载登录是异常的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
security_access_logs %>%
  # Data Manipulation / Anomaly Detection
  time_decompose(count, method = "stl") %>%
  anomalize(remainder, method = "iqr") %>%
  time_recompose() %>%
  # Anomaly Visualization
  plot_anomalies(time_recomposed = TRUE, ncol = 3, alpha_dots = 0.25) +
  labs(title = "Security Event Log Anomalies", subtitle = "STL + IQR Methods")

结果如图3所示。

图3:安全事件日志异常

按照Matt使用Twitter的AnomalyDetection包的方法,结合time_decompose(method = "twitter")anomalize(method = "gesd"),同时调整trend = "4 months"来调整中值跨度,我们将只关注SERVER-549521。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
# Get only SERVER549521 access
SERVER549521 <- security_access_logs %>%
  filter(server == "SERVER-549521") %>%
  ungroup()

# Anomalize!!
SERVER549521 %>%
  # Twitter + GESD
  time_decompose(count, method = "twitter", trend = "4 months") %>%
  anomalize(remainder, method = "gesd") %>%
  time_recompose() %>%
  # Anomaly Visualization
  plot_anomalies(time_recomposed = TRUE) +
  labs(title = "SERVER-549521 Anomalies", subtitle = "Twitter + GESD Methods")

在图4中,你会注意到SERVER-549521在6月份存在异常的登录计数。

图4:使用Twitter和GESD方法的SERVER-549521登录异常

我们可以将Twitter(time_decompose)和GESD(anomalize)方法与STL(time_decompose)和IQR(anomalize)方法进行比较,这些方法使用不同的分解和异常检测方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
SERVER549521 %>%
  # STL + IQR Anomaly Detection
  time_decompose(count, method = "stl", trend = "4 months") %>%
  anomalize(remainder, method = "iqr") %>%
  time_recompose() %>%
  # Anomaly Visualization
  plot_anomalies(time_recomposed = TRUE) +
  labs(title = "SERVER-549521 Anomalies", subtitle = "STL + IQR Methods")

同样,我们注意到6月份的异常,如图5所示。

图5:使用STL和IQR方法的SERVER-549521登录异常

显然,结果非常相似,正如人们所希望的那样。最后,让我们使用Matt的plot_anomaly_decomposition()来可视化算法如何检测SERVER-549521余数中的异常的内部工作原理。

1
2
3
4
5
6
7
8
9
# Created from Anomalize project, Matt Dancho
# https://github.com/business-science/anomalize
security_access_logs %>%
  filter(server == "SERVER549521") %>%
  ungroup() %>%
  time_decompose(count) %>%
  anomalize(remainder) %>%
  plot_anomaly_decomposition() +
  labs(title = "Decomposition of Anomalized SERVER-549521 Downloads")

结果是一个四部分的可视化,包括观测值、季节性、趋势和余数,如图6所示。

图6:SERVER-549521登录的分解

我真的很期待在更大的规模上、跨越更广泛的事件日志数据集应用这些方法。我坚定地断言,蓝队在对抗自动化对手战术和纯粹的数据规模问题方面已经远远落后……如此……多的数据。只有通过像Matt的anomalize这样的战术,以及其他类似的工具,防御者才有希望成功。请务必观看Matt关于anomalize的YouTube视频,Business Science正在构建一系列视频,所以请密切关注那里以及他们的GitHub,以获取更多我们可以应用于蓝队/防御者背景的优秀工作。

所有代码片段都在我的GitHubGist中,示例日志文件、单个R脚本和Jupyter Notebook都可以在我的GitHub上的toolsmith_r中找到。我希望你会发现anomalize和我一样令人兴奋和有用,Matt的工作很棒,期待看到Business Science的下一个作品。

干杯……直到下次。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计