如何为异常检测准备/构建特征(网络安全数据)

机器算法验证 特征选择 异常值 无监督学习 特征工程
2022-03-07 17:37:14

我的目标是使用集群/异常检测来分析网络日志(例如,Apache、syslog、Active Directory 安全审计等),以达到入侵检测的目的。

从日志中,我有很多文本字段,例如 IP 地址、用户名、主机名、目标端口、源端口等(总共 15-20 个字段)。我不知道日志中是否有一些攻击,并希望突出显示最可疑的事件(异常值)。

通常,异常检测将具有低概率/频率的点标记为异常。但是,一半的日志记录包含唯一的字段组合。因此,数据集中一半的记录将具有尽可能低的频率。

如果我使用基于聚类的异常检测(例如,找到聚类,然后选择远离所有聚类中心的点),我需要找到不同点之间的距离。由于我有 15-20 个字段,这将是一个多维空间,其中维度是用户名、端口、IP 地址等。然而,马氏距离只能应用于正态分布的特征。这意味着没有办法找到数据点之间的距离并构建集群......

例如,假设我在 20 条记录的数据集中有用户 Alice、Bob、Carol、Dave、Eve 和 Frank。它们在数据库中的出现次数可能如下:2,5,2,5,1,5。如果我只是将用户名映射到数字,例如

Alice --> 1
Bob --> 2
Carol --> 3
Dave --> 4
Eve --> 5
Frank --> 6

然后,我的用户名概率分布如下所示:

p(1) = 0.1, p(2) = 0.25, p(3) = 0.1, p(4) = 0.25, p(5) = 0.05, p(6) = 0.25

当然,这不是一个正态分布,这也没有多大意义,因为我可以用任何不同的方式映射用户名......

因此,用户名、操作、端口号、IP 地址等字段到数字的简单映射不会带来任何东西。

因此,我想问一下,通常如何处理文本字段/构建特征以使无监督异常/异常值检测成为可能?

编辑:数据结构。

我在数据库表中有大约 100 列,其中包含来自 Active Directory 事件的信息。从这 100 列中,我选择了最重要的(从我的角度来看):SubjectUser、TargetUser、SourceIPaddress、SourceHostName、SourcePort、Computer、DestinationIPaddress、DestinationHostName、DestinationPort、Action、Status、FilePath、EventID、WeekDay、DayTime。

事件是 Active Directory 事件,其中 EventID 定义记录的内容(例如,创建 Kerberos 票证、用户登录、用户注销等)。

数据示例如下所示:

+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+
|ID |SubjectUser|TargetUser|SourceIPaddress|SourceHostName |SourcePort|计算机|DestinationIPaddress|DestinationHostName |DestinationPort|Action |状态|FilePath|EventID|WeekDay|DayTime|
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+
|171390673 |? |?|?|?|?|domaincontroller1.domain.com|1.1.1.1 |domaincontroller1.domain.com|? |/认证/验证|/成功|? |4624 |1 |61293 |
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+
|173348232 |? |?|?|?|?|domaincontroller2.domain.com|2.2.2.2 |domaincontroller2.domain.com|? |/认证/验证|/成功|? |4624 |1 |61293 |
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+
|180176916 |? |?|?|?|?|domaincontroller2.domain.com|2.2.2.2 |domaincontroller2.domain.com|? |/认证/验证|/成功|? |4624 |1 |61293 |
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+
|144144725 |? |John.Doe |3.3.3.3 |domaincontroller3.domain.com|2407 |domaincontroller3.domain.com|3.3.3.4 |domaincontroller3.domain.com|? |/认证/验证|/成功|? |4624 |3 |12345 |
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -+

总之,我有大约 1.5 亿个事件。不同的事件填写不同的字段,并非所有事件都与用户登录/注销有关。

4个回答

首先,我认为有些事情你可能不得不接受。

我在这个问题上看到的一个硬约束是,您可能应该准备好接受相当高的误报率。据我所知,作为网络异常一部分的记录的基本比率非常低(需要引用)。为了争论,我们称其为 1000:1 赔率。然后,即使您观察到一个模式,如果记录是入侵,那么如果它是合法的,那么发生的可能性是其 100 倍,贝叶斯规则说,后验概率是 10:1,流量仍然是合法的。

另一个问题是即使在原则上也很难检测到一些入侵例如,如果有人通过社交手段将我交给他们我的电脑,然后他们登录该服务并下载了我一直在处理的绝密文件,这将很难找到。基本上,一个足够坚定的攻击者可以使他们的侵入行为几乎任意接近系统的正常行为。

此外,您的对手是聪明的,而不是统计过程,因此如果您开始检测某种模式并将其拒之门外,他们可能只是不再遵循该模式来做出回应。这就是为什么,例如,你会看到很多垃圾邮件,所有字母之间都有空格(提供给你“ V I A G R A”或其他)。垃圾邮件过滤器发现字符串“viagra”是垃圾邮件,因此攻击者开始做其他事情。

正因为如此,我认为值得认真思考一下您认为值得付出努力才能检测到的信任类型。这里肯定有一些唾手可得的成果,所以不要让完美成为优秀的敌人,并尝试提出一种可以检测所有入侵的算法。


除此之外,让我们谈谈唾手可得的果实。在这里,我认为将您的分析单元从单个记录转移到一记录可能会很有成效。

例如,您说所有记录中有一半具有唯一的字段组合。但是,例如,大多数源 IP 可能出现在不止一个记录中——请求中的其他字段正在发生变化并使组合变得唯一。如果您按 IP 对请求进行分组,则可以提出以下问题:

  • 是否某些 IP 似乎以异常多(或异常少)的用户身份进行身份验证?
  • 某些 IP 是否存在异常大量的身份验证失败?
  • 某些 IP 是否具有不寻常的访问时间模式(例如,在其时区凌晨 3 点左右有大量活动,或者全天每 1 秒请求一次)?

您可以对其他分组执行类似的操作,例如用户名:

  • 当此用户之前使用同一台计算机处理所有请求时,他们是否从另一台计算机进行身份验证?
  • 这个用户是否突然接触了他们以前从未接触过的文件系统的一部分?

我不知道有任何现成的分类器似乎特别适合于此,因为您的用户的潜在行为如此多样,而且您可能最感兴趣的是随着时间的推移行为的变化这意味着您可能想要为每个用户/IP/未来可能做的事情建立某种模型,并标记与此模型的任何偏差。但是,如果您的用户有不同的行为模式,那将是一个相当密集的过程!

由于这个困难,我认为现在进行我上面概述的那种探索模式分析可能会更有成效。这可能会告诉您哪些类型的模式是最有趣的,然后您可以开始使用花哨的统计算法来检测这些模式。

我绝对不是异常检测方面的专家。然而,这是一个有趣的领域,这是我的两分钱。首先,考虑到您的注释“马氏距离只能应用于正态分布的特征”。我遇到了一些研究,这些研究认为在非正态数据的情况下仍然可以使用该指标。看看这篇论文这份技术报告

我还希望您会发现以下资源IT 网络安全环境中的无监督异常检测 (AD)有用,使用各种方法和方法:本文,呈现无监督 AD 的几何框架本文采用基于密度和基于网格的聚类方法;此演示文稿幻灯片,其中提到了使用 AD 的自组织地图

最后,我建议您看一下我的以下答案,我认为这些答案与该主题相关,因此可能会有所帮助:关于聚类方法的答案,关于非基于距离的聚类的答案和关于软件选项的答案广告

我认为首先你需要有一个数据集来记录一段没有攻击的数据。该数据集应捕获正常运行的系统所固有的变化。我想强调一点,这与拥有带注释的数据集无关。

接下来,我会尝试将所有(或子集)指标合并为一个。这个新指标应该反映“惊喜”的数量。例如,低值意味着系统运行正常,高值峰值/平台意味着存在一些快速变化。在这里,我正在考虑 CUSUM 或 Shewhart 图表样式图表。

你能提供一些可用数据的例子吗?主要是字符串、数字、1/0指标吗?

一种可能性是在没有攻击的情况下在给定一些背景数据的情况下学习特征之间的贝叶斯网络。学习贝叶斯网络很有用,因为它带来了特征之间的条件独立性。因此,您不是在处理每个可能的功能组合。例如,如果特征 A 影响 B 和 C,而特征 B 和 C 一起影响 D,那么您只需学习 A 如何影响 B、如何影响 C 以及 B 和 C 如何共同影响 D 的模型。这个模型需要的数量要少得多参数而不是整个概率分布,这是使用贝叶斯网络而不是仅仅存储整个联合概率分布的主要原因。要测试给定贝叶斯网络的异常情况,请使用学习的贝叶斯网络模型计算传入数据点的概率。如果概率非常低,