ELK 圖形化分析

Gary Ng
17 min readSep 17, 2024

--

https://malliktalksjava.com/wp-content/uploads/2023/05/image-1.png

此教學會需要安裝以下程式

  1. ElasticSearch: 文本過濾
  2. Logstash: 資料過濾
  3. Kibanan: 圖形化顯示
  4. Filebeat: Log 資料採集

首先先來安裝 FileBeat

先更新系統資訊

sudo apt-get update -y

下載安裝 FileBeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.15.1-amd64.deb
sudo dpkg -i filebeat-8.15.1-amd64.deb

確認是否安裝成功, 以下指令會顯示安裝的版本

sudo filebeat version

查看目前 Filebeat 的 module 啟用狀況

filebeat modules list

目前發現沒有 module 是被啟用的,這邊我們先啟用 nginx module, 因為以下範例會使用 nginx 的 access log 當作範例。

啟用 nginx module

filebeat modules enalbe nginx

檢查 nginx module 是用在啟用列表中

filebeat modules list

Filebeat 預設的設定檔位置

filebeat 安裝檔位置: /usr/share/filebeat

config 檔案位置: /etc/filebeat

data 位置: /var/lib/filebeat

log 位置: /var/log/filebeat

registry_path 位置: ${path.data}/registry -> /var/lib/filebeat/registry, registry 用途是會紀錄 filebeat 讀取檔案到哪個位置, 假如想讓 filebeat 重新抓取檔案的話就是要刪除 registry 裡面的檔案

假如 filebeat.yml 要使用定義的檔案位置,格式為 ${path.config}, 以這個範例來說的就是 /etc/filebeat

參考資料:

ELK 系統安裝

Logstash 安裝

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

安裝 apt-transport-https

sudo apt-get install apt-transport-https

儲存 repository definition

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

安裝 logstash

sudo apt-get update && sudo apt-get install logstash

啟動 logstash

sudo systemctl start logstash

檢查 logstash 是否成功運行

sudo systemctl status logstash

假如想要設定成開機時就啟動的話記得執行

sudo systemctl enable logstash

logstash 測試

  1. 首先進入到 logstash conf 資料夾
cd /etc/logstash/conf.d

2. 新增 first-pipeline.yml

input {
stdin {}
}

output {
stdout {}
}

以上範例為當輸入任何資料時,會顯示在 terminal 上

3. 檢查 first-pipeline.yml

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/first-pipeline.yml --config.test_and_exit

4. 執行 first-pipeline.yml, 使用 config.reload.automatic 的話,當 config 有更改的話 logstash 會 relaod config

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/first-pipeline.yml --config.reload.automatic 

備註:

logstash 預設 port 為 5044

參考資料:

ElasticSearch 安裝

在安裝 logstash 的時候因為一些配置已設定,所以這邊可以直接安裝 ES

sudo apt-get update && sudo apt-get install elasticsearch

ElasticSearch 安全配置

預設 ElasticSearch 在安裝完成後會產生 password (username 為 elastic)、TLS 等憑證

ps: 請記住密碼,也可以將 elastic 的 password 設定在環境變數中

export ELASTIC_PASSWORD="your_password"

倘若忘記密碼想要重設定的話可以執行

/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

啟動 elasticsearch

sudo systemctl start elasticsearch

開機時啟動

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service

確認是否啟動成功, 以及去查看 elasticsearch log

sudo systemctl status elasticsearch

查看 elasticsearch log

cd /var/log/elasticsearch

對 elasticsearch 發送 request 檢查是否成功

curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200 

這邊記得要使用 https 否則請求會失敗

elasticsearch 配置檔位置

sudo vim /etc/elasticsearch/elasticsearch.yml

產生 enrollment token 給 kibana 使用

/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

參考資料:

Kibana 安裝

sudo apt-get update && sudo apt-get install kibana

kibana 配置檔位置

/etc/kibana/kibana.yml

開機重啟

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service

啟動

sudo systemctl start kibana

檢查是否啟動成功

sudo systemctl status kibana

使用 elasticsearch 產生 enrollment token 給 kibana 使用

sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

參考資料:

將 filebeat output 改為到 logstash

編輯 filebeat.yml

sudo vim /etc/filebeat/filebeat.yml

註解掉 output.elasticsearch, 打開 output.filebeat 設定

編輯 filebeat 要讀取的 nginx.log, 首先確認 module nginx 是否啟用

sudo filebeat modules list

進入 ${path.config}/modules.d/nginx.yml

${path.config} 相當於 /etc/filebeat, 詳情請看上面的預設路徑

cd /etc/filebeat/modules.d/nginx.yml

設定要監聽的 log 位置並且記得 enable 改為 true

設定 logstash pipeline 監聽 filebeat

input {
beats {
port => "5044"
}
}

output {
stdout {
codec => rubydebug
}
}

filebeat 啟動測試

sudo filebeat -e -c filebeat.yml -d "publish"

參數說明:

  • -e: 印出 stderr
  • -c: 指定 yml file
  • -d: 啟動 debug selector

檢查 filebeat config , output

sudo filebeat test config
sudo filebeat test output

也可以透過以下指令檢查 filebeat 連線到 logstash 的 port 是否已開啟

nc -zv <logstash ip>:<port>

啟動 logstash

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/first-pipeline.yml --config.reload.automatic

啟動 filebeat

sudo filebeat -e -c filebeat.yml -d "publish"

也可以透過 -M 去 override nginx module 的設定

sudo filebeat -e -c filebeat.yml -d "publish" -modules=nginx -M "nginx.access.var.paths=[/var/log/nginx/access.log*]"

此時 logstash 會有大概這樣的輸出

也可以為 logstash 添加 geoip 資訊

first-pipeline.yml 增加以下資訊, 因為 ip address 在 source 的 address 底下

geoip {
source => "[source][address]"
target => "geoip"
}

logstash 規則資源:

完整 first-pipeline.yml 如下:

input {
beats {
port => 5044
}
}


filter {
grok {
match => {
"message" => "%{COMBINEDAPACHELOG}"
}
}
geoip {
source => "[source][address]"
target => "geoip"
}
}

output {
stdout {
codec => rubydebug
}
}

將 output 資訊輸出到 elasticsearch, 記得要先安裝且啟動 elasticsearch

將 first-pipeline.yml 的 output 改為指向到 elasticsearch

output {
elasticsearch {
hosts => ["https://<ipaddress>:<port>"]
index => ""
user => "elastic"
password => "<password>"
ssl_certificate_verification => false // depecreated 改為 ssl_verification_mode
}
}

也可以在 logstash server 執行以下指令看是否可以正常訪問 elasticsearch

以下指令為取得 elasticsearch 的 index

curl -u elastic:<password> --insecure https://<ip address>:9200/_aliases?pretty=true

回傳值

重新啟動 logstash 即可將資料輸出至 elasticsearch

倘若正常運作後可以使用 elasticsearch rest api 去取得 index 資料

curl -u elastic:<password> --insecure  https://<ip>:<port>/logstash-2024.09.17/_search?size=1&pretty=true

elasticsearch 接到資料後緊接著我們可以透過 kibana 將資料以視覺化的方式呈現出來, 首先安裝 kibana。

安裝完成後為 kibana-system 設定 password

curl -u elastic:<password> -X POST --insecure "https://localhost:9200/_security/user/kibana_system/_password" -H "Content-Type: application/json" -d'
{
"password": "kibana_system password>"
}'

修改 kibana.yml

sudo vim /etc/kibana/kibana.yml

以下參數修改

server.host: "0.0.0.0" // 允許外部 ip 訪問

elasticsearch.hosts: ["https://<ip address>:9200"] // elasticsearch ip address

elasticsearch.username: "kibana_system"
elasticsearch.password: "<password>" // 上面設定 kibana_system 的密碼

elasticsearch.ssl.verificationMode: none // disable ssl validity

重啟 kibana

sudo systemctl restart kibana

查看 kibana log

sudo tail -f /var/log/kibana/kibana.log

查看 5601 port 是否正在運行

sudo lsof -i :5601

瀏覽器輸入 http://<ip address>:5601 確認是否可以連到 kibana

我這邊是使用以下登入資訊進行登入

username: elastic
password: <elastic password>

kibana 自製 dashboard

kibana analytics

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet