owned this note
owned this note
Published
Linked with GitHub
# Linux Project:AI-SOC
###### tags: `Security` `AI` `SOC` `監控` `log 分析`
[TOC]
https://hackmd.io/@ncnu-opensource/book/%2FF40AXYr2QMOrUD8HO12zTg
---
## 系統功能
1. 即時 log 收集與分析
2. LLM 輔助威脅評估
3. 自動化響應機制
5. 可視化監控界面
### Repo
- <a href='https://github.com/Anna0131/AI-SOC'>GitHub</a>
## 專案用到的工具介紹
在這次專案中,我們主要使用了 **Vector** 和 **Prometheus** 兩個工具來協助分析與監控系統資料。
**Vector 負責從各種來源收集和處理日誌與指標,並轉換成可用格式。
Prometheus 負責儲存、監控這些資料,提供查詢與告警,協助維護系統健康。**
### Vector
Vector 是一個高效能的**資料收集與處理工具**,專門用來處理大量的日誌(log)和指標(metrics)資料。它可以從不同來源收集資料,並進行處理、格式轉換後,將資料輸出到其他系統(例如監控系統或儲存系統)。
- 特色
- 多來源輸入:可收集來自檔案、網路、Syslog 等的資料。
- 即時處理:可快速處理大量資料。
- 轉換與過濾:可對收集到的資料進行過濾、轉換格式(例如 JSON、文本)以符合後續系統需求。
- 輸出多樣化:可將處理後的資料輸出到 Prometheus、Elasticsearch、Kafka 等系統。
- ref:https://ithelp.ithome.com.tw/articles/10332767
### Prometheus
#### 介紹
Prometheus 是一個開源的監控和告警系統,用來收集和儲存時間序列資料(例如 CPU 使用率、記憶體用量、請求數量等),並且支援強大的查詢功能和可視化。
Prometheus 和其他時序資料庫相比有個**典型特性**:
**它是主動從各TARGET(client 端)上拉取(pull)數據,而非等待監控端的推送(push)。**
#### 特色
- 時間序列資料庫:專門設計來儲存隨時間變化的資料(metrics),例如系統性能、request number等。
- 靈活的查詢語言(PromQL):提供查詢語言,可以查詢和分析資料。
- 自動發現:可自動找到要監控的目標(ex: Kubernetes 中的服務)
- 告警功能:可設定規則,當數據超過設定閾值時,會自動發出通知。
- 與 Grafana 整合:常與 Grafana 搭配使用,將資料視覺化展示。
ref
- https://ithelp.ithome.com.tw/articles/10299053
- https://hackmd.io/@cheese-owner/BkF8Kmlc5
### 3 Red Team Tools
- SQLMaps(滲透測試工具,可檢測 SQL injection 漏洞)
- `git clone https://github.com/sqlmapproject/sqlmap.git`
- `cd sqlmap`
- `python3 sqlmap.py -u "http://163.22.17.116" --data="username=admin&password=secret" -p "username,password" --dbs`


- Dalfox(XSS 參數分析和掃描工具)
- Mac OS:`brew install dalfox`
- `dalfox url http://163.22.17.116`


- Gobuster (try 字典檔,網站目錄爆破工具)
- ` gobuster dir -u "http://163.22.17.116" -w /usr/share/wordlists/dirb/big.txt -b 301,401,403,404,500 -t 20`


## 流程圖

### Step
1. 用三個工具(SQLMaps,dalfox,gobuster)送攻擊 request 去打特定主機A,獲得 web access log。
- 查看攻擊的 log:`sudo vim /var/log/nginx/access.log`
> 我們設定好的 Nginx 除了 GET 以外,還可以在 log 看到 POST 的 request body
2. 用 Vector 蒐集 raw log,再 Parse 這些 log
> 用 [Regex](https://tw.alphacamp.co/blog/regex)(正規表達式)把字串中的欄位切分出來,ex:IP、status code
5. 用寫好的靜態分析規則(白名單+黑名單)判斷 log 是否為攻擊,若為攻擊則把該 parse 過的 log 標記起來,放到 Prometheus。
7. 也會把一般的未標記的 raw log 放到 Prometheus,讓後端去拿資料並判斷行為模式
> Prometheus 可用 Promql 查詢 metrics
9. **把靜態分析後判定為攻擊的log** 和 **後端分析 raw log 後判定行為模式異常的 log** ,都**給 LLM 判斷是否為為真正的攻擊行為(想避免 False positive)**。
> False positive(假陽性)可以想像成實際未患病,但模型預測為患病。
> 在某些應用領域也被稱為誤報(False Alarm)。
> False positive 情況

12. 於 Dashboard 顯示 LLM 的判斷結果
### 靜態分析
核心的邏輯是採用白名單(whitelist)+ 黑名單(blacklist)來過濾,因為:
- 在正常情境下,正常 request 數量遠大於惡意攻擊 request
- 過多 False Positive 會讓系統管理員忽略掉真正有用的異常資訊
- LLM(大語言模型)的任務無法完全平行執行,且計算資源有限,因此需要先做初步過濾以減少處理量
#### 過濾規則設計
- **白名單**
- 設定安全的 IP 位址
- 不同時間點對應不同安全範圍(可隨時更新)
- **黑名單**
- HTTP status code 屬於 4xx(Client Error)或 5xx(Server Error)
- 使用未授權的 Query String(例如不應存在於 URL 的參數)
- 基於行為模式:
- 在過去一段時間內,單一 IP 或 User-Agent 存取次數異常過多(例如暴力破解行為)
- 可根據客戶環境動態調整策略,例如某些時間段封包量異常本為正常現象,需設置例外處理
#### 總結
- 靜態分析能提供初步過濾,將大量無關或重複的 log 節省下來,減輕後續 LLM 分析負擔
- 仍需結合動態分析(例如資源使用量、即時行為監控)才能完整反映系統現況
- 最終目標是結合 LLM 判斷與專業判讀,建立兼顧效率與準確性的入侵偵測系統(IDS)
:::info
### 常見 Detection 說明
當我們進行 **靜態分析** (例如查看系統或網路的 log 記錄) 時,可以藉由分析 HTTP 請求內容來判斷是否有 **SQL Injection** 攻擊的跡象。
具體來說,若在 log 中看到以下關鍵字或特殊符號,這可能代表 SQL Injection 攻擊:
- 關鍵字:`OR`, `AND`, `FROM`, `OR 1=1`, `SELECT`
- 特殊符號:`:`、`()`、`'` (單引號)、`-` (減號)
> 舉例來說,如果在 HTTP request 中觀察到:`GET /index.php?id=1 OR 1=1`,這裡的 `OR 1=1` 明顯是一種試圖繞過條件限制的 SQL Injection 攻擊特徵。
>
這些關鍵字與符號常用於構造惡意 SQL 查詢,試圖繞過資料庫驗證或執行未授權的查詢。
串)
### 總結
- **靜態分析** 能幫助我們從 HTTP log 中,透過已知的特徵模式(例如特定關鍵字和符號),快速判斷是否可能存在 SQL Injection 攻擊。
- 但需要注意,靜態分析只能針對已知特徵進行偵測,對於變異型態或隱藏得很深的攻擊(例如混淆、編碼過後的 payload),可能會漏判。
ref:https://medium.com/@u.emmanuel53/detecting-web-attacks-in-server-logs-as-a-soc-analyst-945e36dac01e
:::
### 工具說明
1. **Vector**
在我們的專案中,我們用 Vector 來收集 server 的 web access log,並對這些 log 進行即時轉換與處理(ex:parsing),使它們符合 Prometheus 的格式。也會提供 API 讓 Prometheus 查詢指標資料(metrics),讓後續的監控系統能正確理解和呈現資料。
2. **Prometheus**
將 Vector 收集和處理後的指標資料(metrics)輸出到 Prometheus,由它負責**儲存和監控這些指標**。
當系統中發生異常(例如:request 異常增加),Prometheus 可以及時發出警告,讓我們及早應對,保護系統的穩定性與安全。
> 目前專案用到的指標有:`nginx_nginx_requests_total` 和 `nginx_nginx_requests_total_no_filter`
3. **Backend Server**
- Express.js 框架
- RESTful API 設計
4. **LLM 分析**
- 基於 OpenAI API 做 log 分析
- 威脅評估
5. **資料庫**
- MySQL 儲存
- 歷史數據查詢
### 後端技術(backend/server.js)
1. **Node.js & Express.js**
```javascript
import express from 'express';
import cors from 'cors';
const app = express();
```
2. **資料庫操作**
```javascript
const pool = mysql.createPool({
host: '198.19.249.55',
user: 'aiioc',
password: 'aiioc',
database: 'aiioc',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
```
3. **LLM 整合**
```javascript
const openai = new OpenAI({
baseURL: "https://openrouter.ai/api/v1",
apiKey: "YOUR_API_KEY"
});
```
3. 行為模式分析:request 限流功能
```javascript
async function checkRequestFrequency(ip) {
const query = `sum(sum_over_time(nginx_nginx_requests_total_no_filter{ip="${ip}"}[40s]))`;
const response = await fetchWithTimeout(`${PROMETHEUS_URL}/api/v1/query?query=${encodeURIComponent(query)}`);
const data = await response.json();
// 分析請求頻率
}
```
### 監控技術
1. **Vector.yml 配置**
```yaml
sources:
nginx_logs:
type: "file"
include: ["/var/log/nginx/access.log"]
transforms:
parse_nginx:
type: "remap"
inputs: ["nginx_logs"]
sinks:
prometheus:
type: "prometheus"
inputs: ["parse_nginx"]
```
- log 作靜態分析
- 數據轉換(parse)
- 指標輸出
- sink部分添加了 prometheus_exporter sink
配置了兩種指標:
http_response_time_seconds:HTTP 響應時間的分布
http_requests_total:HTTP 請求總數,按方法、狀態碼和端點分類
2. **Prometheus.yml 查詢**
```javascript
const query = `sum(sum_over_time(nginx_nginx_requests_total_no_filter{ip="${ip}"}[40s]))`;
```
- PromQL Query 查詢
- 可依設定好的時間定期抓取 Vector 的指標。
```yaml=
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'vector'
static_configs:
- targets: ['vector:9090']
```
### 儲存持久性資料技術
#### docker-compose.yml
1. Vector 添加 9090 對映
- Vector 是用來收集和轉換日誌(log)的工具。
- 我們在 Vector 容器裡開放 9090 這個 port,因為這是 Vector 的 Prometheus exporter(將內部指標數據輸出給 Prometheus 抓取)所使用的 port。這樣 Prometheus 就能從這個 port 上來收集 Vector 提供的指標數據。
2. Prometheus 服務(用 9091 port)
- Prometheus 是一個監控系統和時序數據庫,會定期從 Vector 收集指標數據。
3. 設置 volumes 持久化 Prometheus 數據
- Prometheus 收集到的數據需要長期儲存,不能只存在記憶體中。
- 我們透過 docker-compose 中的 volumes 把 Prometheus 的數據儲存在主機上,這樣就算容器重啟,數據也不會消失。
```yaml=
version: "3.8"
services:
vector:
image: timberio/vector:0.46.1-debian
container_name: vector
restart: always
volumes:
- ./vector.yaml:/etc/vector/vector.yaml:ro
- /var/log/nginx:/var/log/nginx:ro
ports:
- "8686:8686"
- "9090:9090"
command: ["vector", "--config", "/etc/vector/vector.yaml"]
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: always
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9091:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
volumes:
prometheus_data: {}
```
## 詳細流程
### 1. Log 收集流程
1. Nginx 產生 log
2. Vector 監控 log 文件變化
3. 解析 log 內容為結構化數據
4. 轉換為 Prometheus 指標
5. 推送到 Prometheus service
### 2. 分析流程
1. 定期檢查請求頻率
```javascript
setInterval(async () => {
console.log('Checking request frequencies...');
const activeIPs = await getActiveIPs();
// 檢查每個 IP 的請求頻率
}, 20000);
```
2. AI 分析可疑行為
```javascript
const analysis = await sendToOpenAI(requestData);
```
3. 結果儲存&通知
```javascript
await saveAnalysisResult(analysisResult, request.logEntry);
```
### 部署
#### 要求
- Node.js >= 14
- MySQL >= 8.0
- Vector 配置
- Prometheus 設置
- 告警規則定義
:::success
### Nginx 記錄 POST Request Body 設定教學
在這個專案中,我們需要收集包含 HTTP POST request body 的 log,以便後續透過 Vector 收集與分析資料。以下是步驟與設定。
1. 編輯 /etc/nginx/nginx.conf,新增 postdata 格式來記錄請求的資料,包含 request body。(新增自定義的 log_format)
- `vi /etc/nginx/nginx.conf`
> log collector(Vector) 要把 log 的欄位切分出來
```=
log_format postdata '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio" '
'"$request_body"';
```
- $request_body:用來記錄 HTTP POST 請求的 body 資料。
- $gzip_ratio:表示 gzip 壓縮比(可選,可刪掉)。
- 其他欄位(IP、時間、user agent 等)也是常見 log 內容。
2. 在對應的 site 設定檔加入 location 並啟用 request body 記錄
- 編輯 /etc/nginx/sites-available/default 或你的 site 設定檔,加入以下內容:
```=
location /log {
log_format postdata $request_body;
access_log /mnt/logs/nginx/my_tracking.access.log postdata;
echo_read_request_body; # 需要 echo 模組,確認 Nginx 已安裝 nginx-full 或加載 echo 模組
}
```
- access_log:指定 log 檔案路徑與格式。
- echo_read_request_body:這是第三方 echo 模組功能,用來讀取 request body。安裝完整 nginx (nginx-full) 後會支援。
3. 安裝完整的 Nginx 支援(如果缺少 module)
- `apt-get install nginx-full`
> nginx-full 版本包含更多模組(例如 echo module),這樣才能讓 $request_body 在 log 裡記錄下來。
4. 搭配 Vector (log collector) 切分欄位
在 Vector 中,我們會設定 remap 或 parse_grok,對 log line 進行切分,把 $request_body 對應成獨立欄位,方便後續查詢和分析。
5. 為什麼要記錄 POST Request Body?
- 靜態 log 分析:光看 URL 和 headers 不夠,POST request body 可能藏有惡意 payload(例如 SQL Injection, XSS)。
- 攻擊取證:當系統發生異常,我們能從 log 中還原完整請求內容(包含 body),提高鑑識與取證能力。
- 搭配 LLM 分析:讓後端 AI 模型可以讀取更完整的資料,做更準確的判斷。
ref:https://stackoverflow.com/a/14034744/21023840
:::
#### 配置步驟
1. 把專案 clone 下來:`git clone https://github.com/Anna0131/AI-SOC.git`
2. 安裝需要的套件:`npm intstall`
4. 初始化資料庫(建 DB 、建使用者帳號並給權限)
> 記得 **sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf**, 把bind-address 改成0.0.0.0,資料庫才能給外面連
6. 啟動服務`npm start`

<!--
## 舊流程圖

-->
## Demo
可打一些 request 測試
`curl "http://163.22.17.116/admin?page=3"`
`curl "http://163.22.17.116/admin?pages=3"`
`for ((i=1; I<=30; i++)); do curl "http://163.22.17.116/admin?page=3"; done`


