iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Modern Web

AI 驅動的 Web 資安新時代系列 第 22

Day22 - AI 日誌事件分析(Log Analyzer Agent)

  • 分享至 

  • xImage
  •  

為什麼需要 AI 日誌分析?

在資安事件應變中,日誌分析是最耗時、最關鍵的一步

傳統 SOC 需要人工過濾大量 log,找出異常登入、惡意請求或 lateral movement。

但 AI Agent 能協助:

  • 自動分類事件類型(攻擊行為 / 系統異常 / 使用者操作)
  • 分析攻擊鏈(來源 IP → 攻擊手法 → 目標系統)
  • 自動產生管理摘要與風險排序

這就是 Log Analyzer Agent 的任務:

「讓 AI 幫你把幾萬筆日誌,濃縮成可行的事件摘要。」


工作流程(AI Log Analyzer Pipeline)

1、收集日誌資料

  • 來源:Wazuh、Suricata、Nginx、Syslog
  • 格式:JSON / CSV

2、AI 分析

  • 分類:登入行為、惡意掃描、爆破攻擊、系統錯誤
  • 判斷:異常模式(failed login spikes、RCE pattern)
  • 提煉:攻擊來源、受害主機、時間線

3、輸出結果

  • 技術報告:列出每個可疑事件、來源、嚴重度
  • 管理摘要:顯示 Top 攻擊來源、受影響系統、趨勢

Server

這個部分建立了一個 Express API,

可以模擬日誌來源、接收請求,並呼叫 LogAnalyzer Agent 進行分析。

1、初始化伺服器

  • 載入 express 建立 HTTP 伺服器
  • 使用 dotenv 讀取 .env 中的環境變數(API 金鑰)
  • 建立 LogAnalyzer 實例,稍後用來呼叫 AI 進行分析
import express from "express";
import dotenv from "dotenv";
import { v4 as uuidv4 } from "uuid";
import LogAnalyzer from "./agent.js";

dotenv.config();
const app = express();
app.use(express.json());

const analyzer = new LogAnalyzer();

2、 模擬日誌輸出

  • 模擬一組多來源日誌資料(內含可疑登入與目錄遍歷攻擊)
  • 回傳 JSON 給前端或 AI Agent 作分析
app.get("/api/logs", (req, res) => {
   res.json([
      {
         id: uuidv4(),
         timestamp: "2025-10-04T03:21:12Z",
         src_ip: "192.168.10.25",
         dst_ip: "10.0.0.8",
         method: "POST",
         uri: "/login",
         status: 401,
         message: "Failed login attempt"
      },
      {
         id: uuidv4(),
         timestamp: "2025-10-04T03:25:31Z",
         src_ip: "192.168.10.25",
         dst_ip: "10.0.0.8",
         method: "POST",
         uri: "/login",
         status: 401,
         message: "Failed login attempt"
      },
      {
         id: uuidv4(),
         timestamp: "2025-10-04T03:26:09Z",
         src_ip: "103.22.1.45",
         dst_ip: "10.0.0.8",
         method: "GET",
         uri: "/../../etc/passwd",
         status: 403,
         message: "Blocked suspicious path traversal"
      },
      {
         id: uuidv4(),
         timestamp: "2025-10-04T03:27:45Z",
         src_ip: "192.168.10.25",
         dst_ip: "10.0.0.8",
         method: "POST",
         uri: "/login",
         status: 200,
         message: "Successful login"
      }
   ]);
});

3、分析日誌並產生報告

  • 這個端點接收日誌陣列 logs
  • 呼叫 LogAnalyzer 模組進行分析
  • 回傳 Gemini 產生的報告(含技術與管理摘要)
app.post("/api/analyze-logs", async (req, res) => {
   const logs = req.body.logs;
   if (!logs || !logs.length)
      return res.status(400).json({ error: "請提供 logs 陣列" });

   const report = await analyzer.generateReport(logs);
   res.json(report);
});

4、啟動伺服器

  • 啟動 Express 應用
  • 伺服器預設在 http://localhost:3000 運行
app.listen(process.env.PORT || 3000, () => {
   console.log(`Log Analyzer 啟動中:http://localhost:${process.env.PORT || 3000}`);
});

Agent

Agent 模組的主要功能是:

接收日誌 → 呼叫 Gemini 模型 → 生成報告。

1、載入環境與模型初始化

  • 載入 .env 中的 Gemini API 金鑰
  • 初始化 GoogleGenerativeAI 客戶端
import dotenv from "dotenv";
import { GoogleGenerativeAI } from "@google/generative-ai";

dotenv.config();
const API_KEY = process.env.GEMINI_API_KEY;

2、AI 日誌分析主程式

  1. 建立 AI 模型物件 → 指定使用 gemini-2.5-flash
  2. 定義分析 prompt,讓 AI 產出 JSON 結構報告
  3. 使用 replace() 移除 Markdown 符號(避免 JSON.parse 錯誤)
  4. 將結果印出並回傳
export async function LogAnalyzer() {
   if (!API_KEY) {
      console.error("請在 .env 檔案設定 GEMINI_API_KEY");
      return;
   }

   const genAI = new GoogleGenerativeAI(API_KEY);
   const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash" });

   const logs = [
      { src_ip: "192.168.10.25", uri: "/login", status: 401, message: "Failed login attempt" },
      { src_ip: "103.22.1.45", uri: "/../../etc/passwd", status: 403, message: "Blocked suspicious path traversal" }
   ];

   const prompt = `
你是一位資安分析師,請根據以下日誌輸出兩份報告:
1. 技術報告:列出各事件詳細資訊(來源 IP、URI、行為類型、嚴重度、建議)。
2. 管理摘要:列出 Top 攻擊來源、受影響系統、改善方向。
日誌資料:
${JSON.stringify(logs, null, 2)}
請輸出 JSON:
{ "technicalReport": [...], "managementSummary": {...} }
`;

   console.log("開始分析日誌...\n");

   try {
      const result = await model.generateContent(prompt);
      let text = result.response.text();

      // 移除 ```json 和 ```
      text = text.replace(/```json\s*|```/g, "").trim();

      const report = JSON.parse(text);

      console.log("分析結果:");
      console.log(JSON.stringify(report, null, 2));
      return report;
   } catch (err) {
      console.error("分析失敗:", err.message);
      return { error: err.message };
   }
}

LogAnalyzer();

上一篇
Day21 - AI Agent 產生安全報告:從技術到管理摘要
系列文
AI 驅動的 Web 資安新時代22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言