此教學會需要安裝以下程式
- ElasticSearch: 文本過濾
- Logstash: 資料過濾
- Kibanan: 圖形化顯示
- 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 測試
- 首先進入到 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