强化网络安全:用 Neo4j 和 G.V() 可视化攻击图谱
从恶意软件加密挖矿攻击到勒索软件团伙,网络攻击的目标往往与任何抢劫案相同:找到通往贵重物品的最短路径并迅速撤离。这本质上是路径寻找问题,这就是为什么长期以来人们都知道网络攻击者经常将其目标可视化为图网络,也称为攻击图谱。
为了保护您自己的系统,防御者需要像攻击者一样思考。例如,Wiz 最近采用攻击者的思维方式,在一个 Ingress NGINX 控制器 中发现了漏洞。
即使您的系统日常操作仅使用常规的关系型数据库,您的网络安全团队也需要一种方法来预见最有可能的潜在攻击路径并快速做出反应。对于复杂的互联系统,图数据库技术以及随之而来的图可视化和分析,是识别网络攻击风险的关键工具。
幸运的是,Neo4j 实例是进行此类网络安全分析的绝佳环境。您甚至可以将您的 Neo4j 实例与 G.V() 这样的图可视化工具结合起来——这将帮助您以最少的查询编写,快速、轻松地识别系统中的漏洞。如果您使用 G.V() 的 Graph Data Explorer,您可能完全不需要编写任何代码。
让我们深入了解一下。
像攻击者一样思考
攻击者首先从他们能够进入的任何地方获取您系统的访问权限。一旦进入内部,他们就会尝试在您的网络中推进。
攻击者通常事先并不知道您网络的结构,因此他们通常会采用一套通用技术和“试试看”的方法。他们很少能立即找到他们想要的东西。相反,他们会探索您的网络,从一个位置跳到另一个位置。
攻击者成功获取访问权限的任何东西都是一个资源——这可能是一个新位置的访问权、一段新代码、登录凭证,或者只是有用的信息,例如另一个资源的位置。攻击者用来从一个资源转移到另一个资源的任何技术都是一次攻击。
目标是找到有价值的东西——我们称之为关键资产。关键资产是一个故意模糊的概念,可能是很多东西,但重要的是要知道它是攻击者想要而防御者无法承受失去的东西。
例如,关键资产可能是让攻击者完全控制系统权限的资源。
您立刻就能明白为什么黑客倾向于将计算机网络可视化为图。攻击者可能对理解您系统的每个部分或查看每个资源不感兴趣。相反,攻击者关心的是通过所有其他资源找到通往关键资产的可行路径。将系统想象成一个图有助于他们快速找到并概念化这些路径。
这就是攻击图谱。
用类 Cypher 伪代码表示,我们可以如您所料地表示攻击图谱——我们使用 (⬤ Resource) 和 (⬤ Critical asset) 节点来表示每个实体。我们将攻击者可能在两个节点之间进行的任何假设性移动表示为 [ATTACK] 关系。
一个好的系统图模型——结合良好的数据可视化和分析——能给防御者带来优于攻击者的优势。记住,攻击者通常事先不知道系统的布局,但防御者知道!
对 Kubernetes 集群进行建模
在实践中,网络将包含多种类型的资源和关键资产节点。它们很可能拥有自己的属性,这将影响可能存在的攻击路径类型。
在本次讨论中,我们选择使用一个说明 Kubernetes 集群的样本数据集,并采用了 KubeHound 对该集群的描述。
以下是我们示例系统中存在的节点类型:
(⬤ Volume)— 集群内存储持久内存的位置(⬤ Node)* — Kubernetes 集群中运行 Pod 的工作机器(⬤ Pod)— 节点内运行一个或多个容器的可部署单元(⬤ Container)— 包含应用程序的小型环境(⬤ PermissionSet)— 给定用户/身份允许的一组操作,系统中唯一的关键资产节点(⬤ Identity)— 身份验证后授予的用户或服务账户(⬤ Endpoint)— Pod 的连接点
注意:术语 “node” 同时意味着“图中的实体”和“集群中的工作机器”,因此我将通过使用 “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 查询。类似于:
MATCH p=()-[]-() RETURN p LIMIT 10000
虽然 G.V() 完全兼容 Cypher,并且您绝对可以(如果您喜欢的话)从查询编辑器运行此查询,但 Graph Data Explorer 消除了为直观数据探索构建此类基于代码的查询的需要。事实上,我们即将进行一些完全不需要编码的网络安全分析。但无论如何,我们都会包含 Cypher 命令——以防您更倾向于以那种方式跟进。
订阅 Amber Lennox 的故事... (加入 Medium 免费获取此作者的更新。订阅)
让我们尝试查找图中连接到另一个节点的任何节点。
现在我们有了情况的总体概览。我们系统中的所有攻击路径都一目了然,我们可以使用力导向布局来获取节点之间关系的良好概览,或者使用社群布局来查看我们系统中存在哪些类型的资源。
由于 (⬤ 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 跳或更少的跳数内连接到任何关键资产:
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) 的路径:
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),因为没有任何路径将该图节点连接到端点路径。然而,我们可以看到存在一些我们可能关心的容器、卷和身份节点。
为了更全面地概览我们的系统,我们可以查看所有在少于十跳内将端点连接到任何关键资产的路径:
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() 的结合是一个强大的组合,能从各个角度和规模深入洞察您系统的优势和漏洞。
网络攻击总是遵循规则,无论它们多么复杂,这使得它们可以预测。凭借稳健的图数据模型和尽职的网络安全团队,没有哪条攻击路径是您无法预见的。
要了解更多图可视化工具如何提升您的网络安全,请立即下载 G.V() 并开始为您的网络建模。
资源
- 什么是图数据库?
- 在 Neo4j 中可视化您的数据
- Neo4j Cypher 查询语言FINISHED CSD0tFqvECLokhw9aBeRqiK65lS164AuOwRpGElQ/J1I67XH0xjN3ntmGKL6/fqt/0LG+ziLqow4rZTDcQnq2HWaK/BNyTS5YvV5sj4GvMm27den3F/DPLhRKkrz0qVhPWXQFhmgJaFtDSa908jeBA2vpF0Jt5HzRPRRwlrdUnY=