1.5.26

snort3 alloy loki grafana 傳遞alert_json

測試完成重寫,alloy好像有比較快,還是錯覺



看來看去Promtail跟alloy真的很像,所以就測試成功了

用snort3搭配alloy拋json到loki

alloy跟snort3都安裝在kali-linux上


snort3的部分用kali-linux2026的版本就有3.12版的

要用apt install snort3 安裝,省去了原始碼編譯







編輯snort3的設定檔

加入規則的參數跟警報的參數

建立log要放的地方

mkdir -p /var/log/snort

權限開到775

測試snort -c /etc/snort/snort.lua -T

無報錯,就可以開始跑來測試了

跑 snort -c /etc/snort/snort.lua -i eth0 -A alert_json -L /var/log/snort/

給他資料 ping google.com 測試規則是icmp

去/var/log/snort/裡面看alert的log

然後要安裝alloy的元件,讓他把LOG拋去

安裝alloy跟設定

sudo apt-get update #更新套件清單

sudo apt-get install -y apt-transport-https software-properties-common wget #安裝必要的套件

sudo mkdir -p /etc/apt/keyrings #建立key的目錄

wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null #下載並加入 Grafana GPG 金鑰

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list #加入來源(Stable 版本)

sudo apt-get update //更新套件清單

sudo apt-get install alloy //安裝alloy

有兩個設定檔

架容器時的設定檔

建立docker-compose.yml跟config.alloy在同一個目錄下

容器建立時,會去讀config.alloy

另一個是在用戶端的alloy用的設定檔,我是在kali-linux底下

sudo nano /etc/alloy/config.alloy #這個是kali-linux底下的設定檔

sudo usermod -aG adm alloy //將adm使用者加入到該群組中

sudo mkdir -p /var/lib/alloy //建立目錄

sudo groupadd alloy //建立alloy群組

sudo usermod -aG alloy alloy //將alloy使用者加入到該群組中

sudo chown -R alloy:alloy /var/lib/alloy //修改目錄所有權

sudo chmod 755 /var/lib/alloy //確保權限正確

sudo systemctl start alloy //啟動alloy

sudo systemctl enable alloy //設定開機自動啟動

sudo systemctl status alloy //檢查狀態顯示 active (running)就成功了

sudo -u alloy ls -l /var/log/snort/alert_json.txt //檢查檔案是否可讀

sudo chmod 644 /var/log/snort/alert_json.txt //修改權限

sudo chmod 755 /var/log/snort/  //修改權限

journalctl -u alloy -f //追蹤日誌觀察

/etc/alloy/config.alloy  以下是內容,這個可以多端點跑,所以日誌不用清空,放到最後一排也行

---------------------------------------------------------------------------------------------------

//發現日誌

local.file_match "snort_alerts" {

    path_targets = [{

        __address__ = "localhost",

        __path__    = "/var/log/snort/alert_json.txt",

        job         = "snort3",

    }]

}


//讀取日誌 

loki.source.file "snort_reader" {

    targets    = local.file_match.snort_alerts.targets

    forward_to = [loki.process.snort_pipeline.receiver]

}


//處理日誌 

loki.process "snort_pipeline" {

    //解析 JSON 欄位

    stage.json {

        expressions = {

            timestamp = "timestamp",

            action    = "action",

            class     = "class",

            msg       = "msg",

            proto     = "proto",

            src_addr  = "src_addr",

            dst_addr  = "dst_addr",

        }

    }


    //將重要欄位設為標籤

    stage.labels {

        values = {

            action = null,

            class  = null,

            proto  = null,

        }

    }


    //格式化內容 

    stage.template {

        source   = "output_msg"

        template = "[{{.action}}] {{.proto}} {{.src_addr}} -> {{.dst_addr}} | {{.msg}}"

    }


    stage.output {

        source = "output_msg"

    }


    forward_to = [loki.write.local_loki.receiver]

}


//發送至 Loki 

loki.write "local_loki" {

    endpoint {

        url = "http://localhost:3100/loki/api/v1/push" #localhost是loki的IP

    }

}

-----------------------------------------------------------------------------------------------

docker-compose.yml

-----------------------------------------------------------------------------------------------


services:

  # Loki: 

  loki:

    image: "grafana/loki:latest"

    ports:

      - "3100:3100"

    command: -config.file=/etc/loki/local-config.yaml

    restart: always


  # Grafana: 

  grafana:

    image: "grafana/grafana:latest"

    ports:

      - "3000:3000"

    environment:

      - GF_SECURITY_ADMIN_PASSWORD=admin

    restart: always


  # Alloy: 

  alloy:

    image: "grafana/alloy:latest"

    volumes:

      - "./config.alloy:/etc/alloy/config.alloy"

      - "/var/log/snort:/var/log/snort:ro"

    command: "run --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy"

    ports:

      - "12345:12345"

    restart: "always"

------------------------------------------------------------------------------------------------------

config.alloy

------------------------------------------------------------------------------------------------------

local.file_match "snort3_log" {

  path_targets = [{

    __address__ = "localhost",

    __path__    = "/var/log/snort/alert_json.txt", 

    job         = "snort",

    instance    = "ids-node-01",

  }]

}


loki.source.file "snort_scrape" {

  targets    = local.file_match.snort3_log.targets

  forward_to = [loki.process.snort_json_parser.receiver]

}


loki.process "snort_json_parser" {

  stage.json {

    expressions = {

      action      = "action",      

      protocol    = "proto",       

      src_ip      = "src_addr",    

      dest_ip     = "dst_addr",    

      signature   = "msg",         

      class       = "class",       

    }

  }


  stage.labels {

    values = {

      action   = null,

      protocol = null,

      class    = null,

    }

  }


  forward_to = [loki.write.local_loki.receiver]

}


loki.write "local_loki" {

  endpoint {

    url = "http://loki-server:3100/loki/api/v1/push" #loki-server是loki的IP

  }

}

------------------------------------------------------------------------------------

其實兩個設定檔都一樣,job: snort3 #在 Grafana 搜尋時的主要標籤

-----------------------------------------------------------------------------------------------------------







沒有留言:

張貼留言