Jina 实例秀|基于神经搜索的网络安全威胁检测(一)

7a6d1bf001d717ed5105dc3746e4ba2d.gif

92147802402fcc268573d26c8f445d35.gif

摘要

在本文中,我们使用 Jina 演示了如何使用相似性搜索来解决网络安全这样一个常见的业务挑战。与原方案的效果相比,精确度提升了 21.3%,召回率提升了 62.1%!

088160d49594b3a4bd61515b25b56873.gif

前言

根据 IBM 的研究¹,网络攻击导致的数据泄露给企业造成的平均成本为 386 万美元,并且企业平均需要花费 280 天的时间来识别和遏制网络攻击。

那么,什么是网络攻击?我们如何利用像 Jina 这样的下一代搜索工具来减轻我们的网络安全威胁呢?

网络攻击就是恶意行为者利用网络存在的漏洞和安全缺陷,对系统和资源进行攻击。恶意流量识别是维护网络空间安全的重要手段。

在一个包含 100-1000 维度的数据集会带来相当棘手的挑战,好比大海捞针。而相似性检索技术能够破解高维数据的处理难题,其工作原理是,对于给定的样本对象,在集合中查找与之内容最相似的对象。你可以把它看作是一个最近邻(KNN)问题,其相似性由欧式距离来衡量。

2e4844ed918eabbc32fc1063e2a2fba1.png

相似度检索技术²

2464ba3eda75fee28f086b8d8fc867a1.gif

目标

在本课程项目中,我们将利用 Jina 搭建一个由深度学习驱动的网络安全仪表板,模拟网络流量,实时监测恶意事件。我们的目标是开发一个可靠、可扩展,并且高性能的入侵检测系统,实时预测攻击是否发生。

为了实现这一目标,我们将对预训练的神经网络执行“网络手术”,移除分类层,并将神经网络重新用作特征提取器。也就是说,我们的网络最终输出的是特征,而不是标签。

82af6f8a1cf9368590d3fb836e865f44.png

“网络手术”示意图

接着,我们使用特征提取器所生成的 128 维嵌入,并通过 Jina Flow 对它们进行索引,使其可搜索。通过索引数千个这些 128 维向量及其标签(良性/恶意),我们就可以依据它们的距离,来判断它们的相似性。

288232d7f85b0c1632634c94d60aff90.gif

可视化嵌入

我们能够从不同的日期,获取没见过的网络流量数据,提取其特征。接着依据最近邻的类别,来确定它是良性还是恶意的。简单来说,我们微调了预训练的神经网络,把一个二分类任务,转化为相似性检索任务,以模拟实时检测恶意网络流量。

1b789cff1d647117619171045c6111a0.png

把相似度检索作为分类基础

以下是具体步骤:

1. 使用神经网络作为特征提取器,生成网络流量的向量表示。

2. 确认相似性度量标准,使相似事物的向量表示更接近。

3. 找到查找对象的最近邻,并返回良性或恶意的结果,以识别出恶意流量。

b8ab3d228da146be733008dc7facdf3a.gif

数据集

在数据科学领域里,收集和预处理数据可是个苦差事,通常是构建应用程序中最耗时、最具挑战性的一步。在网络安全领域更是如此,因为很难找到针对自己任务的数据集🥲。

由于我们无法在一篇文章中涵盖所有内容,所以假设我们在这个已经预处理完的 CSV 数据集上碰了壁。它有 79 列的数值特征(例如,端口、协议、转发数据包等)和一个分类标签(0表示良性,1表示恶意),记录了某一天的网络流量,共 15,000 行。

2783aacbd20d4aaf500cda871c10fa38.png

数据集

8b31e47daab2f6c3f3bc6ae389c2f6f2.gif

初选方案

一开始,我用 Keras 在数据集上训练了一个简单的前馈神经网络来检测恶意流量,精确度和召回率实在不太理想。

c25bcaa02a341407b7ed695a55b0a6ab.png

模型训练脚本

75e0119c409d95515fa663932a0428df.png

be79e09f4456ed313cc29208c9b0619c.png

左右滑动查看数据表现

可以看到,初选方案在恶意流量的分类上表现很差。

5df5d543c7190a704eefc734b8467233.gif

Jina 来救援!优化方案

于是我对原始模型做了一次“网络手术”,剔出分类层,并将神经网络重新用作特征提取器,将二分类问题转变为相似性检索问题。

正好机缘巧合下,我了解到了 Jina,我想试试看能否通过将编码特征索引到 DocumentArray,根据它在向量空间中的最近邻的类别,将网络流量分类为良性/恶意,来获得更好的结果。现在模型采用 79 维的输入特征,运行后输出一个良性或恶意的分类结果。

f1a7597febe3677858060ddff1dd0cc6.png

“网络手术”后的模型

082531aca27b4b07398bb21c3812c504.gif

索引

我们通过特征提取器,以向量嵌入的形式生成了丰富的、数学化的网络流量数据。接下来就进入到索引阶段了。计算得出的向量的余弦相似度,用距离最近的样本数据来代表目标数据的分类。

为此,我们需要定义我们的索引 Flow 👇

Flows 是 Jina 生态系统的“木偶大师”,它将多个 Executor 连接起来,协调成流水线(Pipeline),进出 Flow 的所有内容都必须是 Document。

e199ff538036821abe57fcabe9732c59.png

定义 Flow

Flow 默认每个 Executor 都依赖之前添加的 Executor 。但是因为 Flows 在内部被建模为图,所以 Flow 并不局限于顺序执行。Flow 可以表示任何复杂的、非循环的拓扑结构来索引或查询文档。

如图所示,Flow 的典型用例是具有标准预处理部分,但不同的索引器分隔了 embedding 和数据的拓扑结构。它还可以用于构建类似交换机的节点,其中一些 Documents 通过 Flow 的一个并行分支,而其他 Documents 通过不同的分支。

a8e7da79ddfdfc64f6ec724383c4829c.png

Flow 的拓扑结构

我们微调了 Flow 拓扑结构,并用它来索引我们的网络流量 embedding。如下图所示,Document 不是“按顺序”访问我们 Flow 中定义的每个 Executor,而是从一个叫 ITPrepper 的 Executor 开始。然后,文档将被并行发送到 DocArrayIndexer 和 WeaviateIndexer,Flow 确保每个源自 ITPrepper 的文档都只到达每个索引器一次。最后一个执行器 DummyExecutor ,将接收两个 DocumentArrays 并自动合并它们。

847880151a8d838f9b26cbe8f44cff94.png

本应用的 Flow

为什么要使用两个不同的索引器呢?因为这样能利用不同搜索算法的不同索引器,实现各自独立查询。并在查询时,从使用不同的搜索算法的索引里创建预测的集合。

聊完了 Flow 拓扑结构,现在最重要的就是——当我们的神经网络模型被用作特征提取器时的性能表现。相比于原始神经网络的分类输出,使用相似性检索是否能获得更好的精确度、召回率等。

5d51e235127962227923d621006e77c7.gif

结果

由于我们现在有两个独立的索引(DocArrayIndexer, WeaviateIndexer)。其中包含我们的网络流量 embedding 及其在 DocumentArrays 中的相关标签。下图是良性和恶意的样本,注意“know_label”(已知标签)和匹配的区别。

deace2a5254b84754f3620fecbaba51e.png

c6a35be9325c1d1ef9717d8ed49ec08d.png

左右滑动查看

现在我们分别加载每个索引,将其与自身匹配以获得最近邻,并遍历每个文档,将它们的已知和预测标签附加到预先初始化的 Python 列表中。我们将采用余弦相似度作为度量标准,使用 scikit-learn 计算准确度、精确度、召回率和 F1 值。

74e997d2de87b792bc62896d86ebeb39.png

DocumentArray 索引的评估指标

通过比较每个 Document 的 embedding 和索引中的每个embedding,取距离最近,相似度最高的那一个,并根据其最近邻的“known_label”将其分类为良性或恶意。

以下是两次方案的评估指标数据。可以看到,相较于使用实际神经网络输出的原方案,使用 Jina 以相似性检索作为分类基础的优化方案,在准确率和召回率上均得到了大幅提升。

d67e7e16b132abaeeefbc4a09e9c54cf.png

之前😣

e746c7cbe95d33eebd7de77568fcbbe9.jpeg

之后...哎哟不错🤠!

之后,我们【将此模型用作更广泛的恶意流量类别的特征提取器,来提取训练期间未发现的恶意流量。这就是所谓的迁移学习,我们使用预训练的神经网络作为起点,找到已有知识和新知识之间的相似性,从最初未训练的数据中学习模式。

项目代码👇

github.com/k-zehnder/cybersecurity-jina

英文原文👇(或阅读原文)

medium.com/jina-ai/it-threat-detection-using-neural-search-3f3ff03caade

2a3f36ee404357a6fc0081bf4749f0e6.gif

结论

在本文中,我们使用 Jina 演示了如何使用相似性搜索来解决网络安全这样一个常见的商业业务挑战。我们通过从预训练的神经网络开发一个特征提取器来实现目标,根据与其他已知训练样本的相似性,而不是网络的输出标签来预测网络流量是否是恶意的。

在本系列文章中,我们将继续探讨如何让 Jina 后端和 Streamlit 前端更好的结合,让我们可以轻松地通过浏览器实时模拟网络流量监控!

参考资料

[1]Cost of a Data Breach Report 2022.IBM Com.

[2]https://youtu.be/ainS3BBn7rs

[3]https://medium.com/jina-ai/search-tattoos-with-text-an-open-source-project-made-with-jina-12ac54ac1f78 

c4080e4073abd41f43d522285295dcd5.png

神经搜索、多模态应用

教程、干货分享

扫码备注加入讨论组

更多精彩内容(点击图片阅读)

5e4fac4c8bff50204f88f62cc8523a8c.jpeg

2d1c8a4ed822caff39f6fdf302c9237e.jpeg

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建 Jina 搜图,需要遵循以下步骤: 1. 安装 Jina 首先,你需要安装 Jina。你可以通过 pip 安装它: ``` pip install jina ``` 2. 准备数据 接下来,你需要准备一些数据,以便 Jina 可以对其进行搜索。数据可以是图像、文本或任何其他类型的数据。你需要将这些数据存储在一个文件夹中。 3. 编写 Flow 使用 Jina 搜图的核心是创建一个流程(Flow)。流程定义了如何处理和搜索数据。你可以使用 JinaPython API 来定义流程。 例如,要创建一个简单的流程,可以使用以下代码: ```python from jina import Flow f = Flow().add(name='my_encoder', uses='jinahub+docker://MyAwesomeEncoder') ``` 在这个示例中,我们定义了一个流程,它使用名为 `my_encoder` 的编码器,并从 `jinahub` 中下载 Docker 镜像。 4. 运行 Flow 在定义了流程后,你可以使用以下命令运行它: ``` f.run() ``` 这将启动流程,并开始处理和搜索数据。 5. 搜索数据 一旦流程启动,你可以使用 Jina 的客户端 API 来搜索数据。例如,要搜索一个图像,可以使用以下代码: ```python from jina import Client, Document client = Client() image = Document(uri='path/to/image.jpg') response = client.search(inputs=[image]) ``` 在这个示例中,我们定义了一个 Jina 客户端,并搜索了一个名为 `image.jpg` 的图像。 这些是搭建 Jina 搜图的基本步骤。你可以根据自己的需求和数据类型来进一步定制和优化流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值