首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用Neo4j和G.V()可视化攻击图以增强网络安全

使用Neo4j和G.V()可视化攻击图以增强网络安全

原创
作者头像
qife122
发布2026-02-10 17:40:38
发布2026-02-10 17:40:38
480
举报

用攻击者思维加固你的系统

从恶意软件加密挖矿攻击到勒索软件团伙,网络攻击的目标往往与任何盗窃行为相同:找到通往有价值物品的最短路径并迅速撤离。这本质上就是路径查找,这就是为什么长期以来,网络攻击者经常将他们的目标可视化为图网络,也称为攻击图。

为了保护你自己的系统,防御者需要像攻击者一样思考。例如,Wiz最近以攻击者的思维方式发现了一个Ingress NGINX控制器中的漏洞。

即使你的系统在日常运营中仅使用常规的关系型数据库,你的网络安全团队也需要一种方法来预见最有可能的潜在攻击路径并快速做出反应。对于复杂的互联系统,图数据库技术以及伴随的图可视化和分析,是识别网络攻击风险的关键工具。

幸运的是,Neo4j实例是进行此类网络安全分析的完美环境。你甚至可以将Neo4j实例与G.V()这样的图可视化工具结合起来——这将帮助你以最少的查询编写,快速轻松地识别系统中的漏洞。如果你使用G.V()的Graph Data Explorer,你可能完全不需要编写任何代码。

让我们更深入地了解一下。

像攻击者一样思考

攻击者首先从他们能进入的任何地方获取对你系统的访问权限。一旦进入内部,他们就会尝试在你的网络中推进。

攻击者通常事先并不知道你网络的结构,因此他们通常会使用一套多功能技术工具包和一种“试试看”的方法。他们很少会立即找到他们想要的东西。相反,他们会探索你的网络,从一个位置跳到另一个位置。

攻击者成功获取访问权限的任何东西都是一个资源——这可能是一个新位置的访问权、一段新代码、登录凭证,或者仅仅是有用的信息,例如另一个资源的位置。攻击者用来从一个资源转移到另一个资源的任何技术都是一次攻击

目标是找到有价值的东西——我们称之为关键资产。关键资产是一个刻意模糊的概念,可能是很多东西,但重要的是要知道它是攻击者想要而防御者无法承受失去的东西。

例如,关键资产可能是给予攻击者系统完全控制权的资源。

你可以立刻看出为什么黑客倾向于将计算机网络可视化为图。攻击者可能对理解你系统的每个部分或查看每个资源不感兴趣。相反,攻击者关心的是在所有其他资源中找到通往关键资产的可行路径。将系统想象成一个图有助于他们快速找到并概念化这些路径。

这是一个攻击图

在伪Cypher中,我们可以如你所料地表示攻击图——我们使用(⬤ 资源)(⬤ 关键资产)节点来表示每个实体。我们将攻击者可能在两个节点之间进行的任何假设性移动表示为 攻击 关系。

一个良好的系统图模型——加上良好的数据可视化和分析——能让防御者获得优于攻击者的优势。记住,攻击者通常事先不知道系统的布局,但防御者知道!

为Kubernetes集群建模

在实践中,一个网络将包含许多种资源和关键资产节点。它们可能拥有自己的属性,这将影响可能的攻击路径类型。

在本次讨论中,我们选择使用一个说明Kubernetes集群的示例数据集,并采用KubeHound对该集群的描述。

以下是我们示例系统中存在的节点类型:

  • (⬤ Volume) —— 集群内存储持久内存的位置。
  • (⬤ Node) —— Kubernetes集群中运行Pod的工作机器。
  • (⬤ Pod) —— 节点内运行一个或多个容器的可部署单元。
  • (⬤ Container) —— 包含应用程序的小型环境。
  • (⬤ PermissionSet) —— 允许给定用户/身份执行的一组操作,也是系统中唯一的关键资产节点。
  • (⬤ Identity) —— 认证后授予的用户或服务账户。
  • (⬤ Endpoint) —— Pod的连接点。

注意: 术语“node”既指“图中的实体”,也指“集群中的工作机器”,因此我会通过使用“节点”指代前者,使用(⬤ Node)指代后者来澄清我指的是哪种类型。

这是一个高度简化的数据模型版本,展示了一些示例攻击类型。有些很简单,有些则高度抽象。例如,可以想象这样一个通用概念:攻击者可能通过暴露的端点获取对你系统的访问权限。我们用ENDPOINT_EXPLOIT攻击来表示这个概念,而不过多担心其机制。其他攻击,如TOKEN_STEAL,描述的则是更具体的攻击:窃取已挂载的服务账户令牌。

某些节点类型移动到其他节点类型需要不同类型的攻击。在完整的分析中,你会考虑哪些攻击类型更可能发生,或者哪些会使你的关键资产最脆弱。

当然,这里展示的可能网络攻击类型要多得多。理解单个攻击类型在后续解释和应对你的网络安全图时非常重要。这将让你能够处理在系统中发现的漏洞。

但现在,我们只专注于识别危险路径,因此不必过于担心对不同类型进行分类。我们只需要知道存在多种关系类型。

下载示例数据集

现在我们理解了数据模型,我们将在Neo4j中管理我们的示例安全集群。我们还将引导你了解如何在G.V()中将其可视化。

这里的一切你都可以自己完成。示例数据集以ZIP格式在GitHub上提供,可以在Neo4j Sandbox中使用。你可以通过数据导入器直接上传数据。只需在Neo4j Sandbox中选择“Open model (with data)”并选择ZIP文件。我们还以CSV格式提供了原始数据。

如果你还没有安装G.V(),请前往下载门户,因为你需要它来继续操作。

下载并打开G.V()后,点击“New Database Connection”。

接下来,你只需要选择Neo4j作为你的图数据库类型,并输入你的Bolt地址和端口。完成后,系统会提示你输入用户名和密码。

输入你的详细信息并提交连接——就这么简单!

使用G.V()进行图可视化

为了节省大量时间,让我向你介绍G.V()新的Graph Data Explorer。传统上,如果你想查看图数据库中的所有数据,你必须运行一个Cypher查询。类似这样:

代码语言:cypher
复制
MATCH p=()-[]-() RETURN p LIMIT 10000

虽然G.V()完全兼容Cypher,并且你绝对可以在查询编辑器中运行此查询,但Graph Data Explorer消除了为直观数据探索而构建此类基于代码的查询的需要。事实上,我们即将在不编写任何代码的情况下进行一些网络安全分析。但无论如何,我们还是会包含Cypher命令——以防你更愿意以那种方式跟进。

让我们尝试查找图中连接到另一个节点的任何节点。

现在我们有了一个总体情况概览。我们系统中所有的攻击路径都一目了然,我们可以使用力导向布局来很好地概览节点之间的关系,或者使用社区布局来查看我们系统中存在哪些类型的资源。

由于(⬤ Endpoint)图节点是最常见的攻击入口点之一,我们已将其高亮显示,并关闭了所有其他节点的标签。这让你可以一目了然地看到来自暴露端点的攻击可能从哪里开始。

如果你想调查特定的图节点或关系是否存在漏洞,只需点击几下即可高亮显示感兴趣的节点。让我们看看名称为kubehound.test.local-control-plane的工作机器(⬤ Node)

我们可以看到进出该工作机器(⬤ Node)的所有不同类型的攻击。

上面的图可视化让我们可以描绘出这个资源的心理图景:

  • 众多目标 —— 如果攻击者成功执行了VOLUME_ACCESS或POD_ATTACH攻击,则有大量(⬤ Volume)(⬤ Pod)资源可以直接访问。
  • 暴露的身份 —— 存在一个相邻的(⬤ Identity)资源,容易受到IDENTITY_ASSUME攻击。
  • 容器威胁 —— 有一条关系通向该资源。攻击者可以使用CE_PRIV_MOUNT攻击,从相邻的(⬤ Container)图节点获取对该节点资源的访问权限。

在实施安全措施时,也很容易进一步修改我们的图以反映这些措施。

例如,假设我们已经做了很多工作来保护我们的卷,使它们不那么容易受到卷访问攻击。既然我们现在不那么担心这类攻击,我们希望专注于其他领域。

我们有两种方法可以做到这一点。第一种是关闭VOLUME_ACCESS关系。这使得卷节点仍然可见,以便我们确保没有其他类型的攻击进出这些资源。

如果——并且仅当——我们确信卷资源现在已有效地与我们的工作机器(⬤ Node)资源隔离,我们可以直接完全关闭(⬤ Volume)节点。这让我们可以完全专注于其他资源。

你可以选择从关系(攻击路径)或节点(资源)的角度来评估你的攻击图。你的可视化和解释选择将取决于你选择分析系统的哪些部分。

但是关键资产呢?

回想一下,我们所有的关键资产都是(⬤ PermissionSet)类型。正如我们所见,在我们的工作机器(⬤ Node)的最近邻居中没有这种节点。但是,如果我们允许多跳,仍然可能通过更远的邻居找到通往关键资产的路径。我们想看看是否存在这样的路径。

假设我们想检查我们的工作机器(⬤ Node)是否在10跳或更少跳数内连接到任何关键资产:

代码语言:cypher
复制
MATCH path = (start {name: 'kubehound.test.local-control-plane'}) -[*1..10]->(end)
WHERE (end.critical=True AND ALL(n IN NODES(path)[1..] WHERE n <> start))
RETURN path

我们可以看到,从我们的资源出发,有几条可行的路径暴露了多个关键资产!这里显示的每条路径都代表了我们系统的一个假设性风险。

让我们只高亮显示一条攻击路径。

由于system:coredns (⬤ PermissionSet)是一个关键资产,让我们特别关注这个节点。我们不再从我们的起始资源——即我们有点随机选择的(⬤ Node)——查看路径,而是希望了解这个关键资产总体上有多脆弱。

攻击者通常从端点开始攻击,所以让我们寻找可能使该资产暴露给端点攻击的关系。

我们可以反转之前的查询,查看所有从该资产到(⬤ Endpoint)的连接:

代码语言:cypher
复制
MATCH path = (start:PermissionSet {role: 'system:coredns'}) -[*1..10]-(end)
where (end.label='Endpoint' AND ALL(n IN NODES(path)[1..] WHERE n <> start))
RETURN path

我们可以立刻看到,如果我们正在分析来自端点的攻击,我们实际上不必太担心kubehound.test.local-control-plane (⬤ Node),因为没有路径将该图节点连接到端点路径。然而,我们可以看到,存在一些我们可能关心的容器、卷和身份节点。

为了更全面地概览我们的系统,我们可以查看所有在少于十跳内将端点连接到任何关键资产的路径:

代码语言:cypher
复制
MATCH path = (start:Endpoint) -[*1..10]->(end:PermissionSet)
WHERE (end.critical=true AND ALL(n IN nodes(path) WHERE size([m IN nodes(path) WHERE m = n]) = 1))
RETURN DISTINCT path LIMIT 1000

我们可以寻找所有从端点导致关键资产的路径。

我们可以看到有两(个独立的)类攻击路径:

  • 类别 #1: 攻击者可以通过两个coredns (⬤ Container)节点中的任何一个进行。
  • 类别 #2: 攻击者可以通过工作机器(⬤ Node)kubehound.text.local-worker2进行。

尽管类别1和2都包含许多子路径,但通过专注于像这样的阻塞点,我们可以极大地增强我们的安全系统并切断大部分攻击路径。

通过将精力集中在真正重要的路径上,防御者可以确保系统的最大安全性。这是一项图可视化特别适合的任务。强大的攻击图能够一目了然地识别漏洞,为防御者提供他们所需的情报和时间来加强防御。

总结

你现在已经体验到图可视化在网络安全的领域有多么强大。但这仅仅是个开始:Neo4j与G.V()的结合是一个强大的组合,可以从各个角度和规模深入洞察你系统的优势和脆弱性。

无论网络攻击多么复杂,它们总是遵循规则,这使得它们是可以预测的。拥有一个强大的图数据模型和一个勤勉的网络安全团队,没有哪条攻击路径是你预见不到的。FINISHED

CSD0tFqvECLokhw9aBeRqiK65lS164AuOwRpGElQ/J1I67XH0xjN3ntmGKL6/fqt/0LG+ziLqow4rZTDcQnq2HWaK/BNyTS5YvV5sj4GvMm27den3F/DPLhRKkrz0qVhPWXQFhmgJaFtDSa908jeBA2vpF0Jt5HzRPRRwlrdUnY=

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用攻击者思维加固你的系统
  • 像攻击者一样思考
  • 为Kubernetes集群建模
  • 下载示例数据集
  • 使用G.V()进行图可视化
  • 但是关键资产呢?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档