目前分類:系統分析 (2)

瀏覽方式: 標題列表 簡短摘要

Logstash

/var/log/named:/var/log/named
sudo vi ~/docker-elk/logstash/pipeline/bind.conf
input {
    file {
        type => "BIND_DNS"
        path => [ "/var/log/named/query.log" ]
        start_position => "beginning"
    }
}

filter {
    if [type] == "BIND_DNS" {
        grok {
            match => ["message", "(?%{MONTHDAY}[-]%{MONTH}[-]%{YEAR} %{TIME}) client %{IPV4:clientip}#%{POSINT:clientport} \(%{GREEDYDATA:query1}\): query: %{GREEDYDATA:query2} IN %{GREEDYDATA:querytype} \(%{IPV4:dns}\)"]
        }
        date {
            match => ["logdate", "dd-MMM-yyyy HH:mm:ss.SSS"]
            timezone => "America/Los_Angeles"
        }
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
    }
}
03-Aug-2017 00:55:29.005 client XXX.XXX.XXX.XXX#54501(www.google.com): query: www.google.com IN A + (XXX.XXX.XXX.XXX)
  • 這次的目的是要分析 BIND9 的 query.log 檔,主要需要修改的地方是 Logstash 結構化 log 的設定
  • 先將 log 檔案所在的目錄 volume 到 docker container,在 volumes 區塊新增
  • ~/docker-elk/docker-compose.yml
  • 根據 BIND9 的 query.log 新增結構化設定
  • ~/docker-elk/logstash/pipeline/bind.conf
  • input > file > path 分析 log 檔案的位置
  • filter > grok 分析並透過他的 patterns 重構 log 字串
  • into
    {
      "_index": "logstash-2017.08.03",
      "_type": "BIND_DNS",
      "_id": "AV2nF6AFU4gS5SfvUHc1",
      "_version": 1,
      "_score": null,
      "_source": {
        "path": "/var/log/named/query.log",
        "@timestamp": "2017-08-03T00:55:29.005Z",
        "logdate": "03-Aug-2017 00:55:29.005",
        "clientip": "203.75.167.229",
        "query1": "www.google.com",
        "query2": "www.google.com",
        "@version": "1",
        "host": "690ab8796350",
        "dns": "172.31.10.132",
        "message": "03-Aug-2017 00:55:29.005 client 203.75.167.229#54501 (www.google.com): query: www.google.com IN A + (172.31.10.132)",
        "type": "BIND_DNS",
        "clientport": "54501",
        "querytype": "A +"
      }
    }
    
  • (?<logdate>%{MONTHDAY}[-]%{MONTH}[-]%{YEAR} %{TIME}) 是自訂 pattern,因為原始 pattern 沒有符合 query.log 的日期格式,參考來源是 logstash-patterns-core
  • 其他關於 grok 寫法的判斷與模擬,可以透過 Grok Debugger 測試
  • filter > date 是將自訂參數 logdate 取代預設 timestamp 的寫法。因為預設 timestamp 是指 Logstash 分析匯入的時間,而不是 log 紀錄的時間,所以要特別替換後才方便給 Kibana 分析使用
  • 如果記錄檔 EC2 機器時區有另外設定,timezone 也要設定

Kibana

  • 一開始會先選擇 Elasticsearch 資料來源,因為沒有特別修改設定,直接使用預設的 logstash-* 即可
  • 因為時區預設使用瀏覽器設定,所以要先到 Management > Advanced Settings > dateFormat:tz 強制設定為資料的時區
  • 建立一個 IP COUNT/DATE 的圖表
    1. 建立新圖表 Visualize > Create a visualization
    2. 選擇長條圖 Basic Charts > Vertical Bar
    3. 選擇資料來源 From a New Search, Select Index > logstash-*
    4. Y 軸選擇欄位 clientip 的數量 Y-Axis > Aggregation[Unique Count] > Field[clientip.keyword]
    5. X 軸選擇日期 X-Axis > Aggregation[Date Histogram] > Field[@timestamp] > Interval[Daily]
    6. 點選右上角的箭頭 Apply changes
    7. 右上角時間範圍選擇 This week 就可以看到一周內 IP COUNT/DATE 的長條圖
    8. 5185654_raw.png

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

 

Info

 

  • ELK 並不是單一程式,而是分別由 Elasticsearch, Logstash, Kibana 所組成
  • Elasticsearch 擔任資料儲存,可以把它看成是資料庫的一種,同時他也可以實現全文檢索
  • Logstash 收集並處理資料,可以透過正規式將 log 的字串結構化
  • Kibana 則是提供網頁的呈現,串接 Elasticsearch 之後可以表現出簡潔美觀的視覺化報表

Installation

sudo apt-get update
sudo apt-get install docker.io
sudo usermod -aG docker $USER
sudo curl -L "https://github.com/docker/compose/releases/download/1.15.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
sudo sysctl -w vm.max_map_count=262144
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
# 建議先不要背景執行,有錯誤可以比較容易發現
docker-compose up
  • 傳統安裝方式是一個一個來,不過要串連三個程式並調整環境設定,非常容易卡關;一開始裝到一半我就遇到各種困難…後來突然想到這種需要安裝不同程式的環境,一定已經有人提供整合後的 docker images,後來一找果然有!網路上推薦使用:docker-elk
  • 基本環境需求:
    • 硬體需求較高,原本我使用 AWS EC2 t2.micro 一直當機,後來升級到 t2.medium 後才成功啟動
    • Docker version 1.10.0+
    • Docker Compose version 1.6.0+
    • git
  • ubuntu 16.04 Docker & Docker Compose 安裝(1.15.0 是寫文章時 Docker Compose 的最新版本,請依安裝時釋出的最新版本號自行更換)
  • 調整系統參數
  • git clone 並建立 docker container
  • 如果沒有錯誤,這個時候 http://domain:5601 應該已經可以看到 Kibana 的畫面(EC2 請開啟 port 5601)
  • 5185647_raw.png

  • http://domain:9200 也會看到 Elasticsearch 的 JSON 回應(EC2 請開啟 port 9200)
  • 5185648_raw.png

  • 另外建議可以安裝 Chrome extension ElasticSearch Head,只要連接 http://domain:9200/ 就可以直接連到 Elasticsearch 並看到原始數據
  • 5185649_raw.jpg

文章標籤

danielhuang030 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼