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 的圖表
-
建立新圖表 Visualize > Create a visualization
-
選擇長條圖 Basic Charts > Vertical Bar
-
選擇資料來源 From a New Search, Select Index > logstash-*
-
Y 軸選擇欄位 clientip 的數量 Y-Axis > Aggregation[Unique Count] > Field[clientip.keyword]
-
X 軸選擇日期 X-Axis > Aggregation[Date Histogram] > Field[@timestamp] > Interval[Daily]
-
點選右上角的箭頭 Apply changes
-
右上角時間範圍選擇 This week 就可以看到一周內 IP COUNT/DATE 的長條圖
-
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
-
基本環境需求:
-
ubuntu 16.04 Docker & Docker Compose 安裝(1.15.0 是寫文章時 Docker Compose 的最新版本,請依
安裝時釋出的最新版本號自行更換)
- 調整系統參數
- git clone 並建立 docker container
- 如果沒有錯誤,這個時候 http://domain:5601 應該已經可以看到 Kibana 的畫面(EC2 請開啟 port 5601)
-

- http://domain:9200 也會看到 Elasticsearch 的 JSON 回應(EC2 請開啟 port 9200)
-

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

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