The Elastic Stack(先前稱為 ELK Stack)是一個用於集中式記錄的強大解決方案。它是開源軟體的集合,由 Elastic 開發。它允許管理員搜尋、分析和視覺化從任何來源以任何格式產生的記錄。這是一種稱為集中式記錄的實踐形式。在嘗試精確定位伺服器和應用程式的問題時,集中式記錄非常方便,因為它允許從單一位置搜尋所有記錄。它還可以透過關聯特定時間的記錄來協助識別多個伺服器上的問題。
在本指南中,我們將介紹如何在 Ubuntu 18.04 上安裝 Elastic Stack。首先,請按照我們的教學輕鬆地 在 CloudSigma 上安裝您的 Ubuntu 伺服器.
Ubuntu 上的 Elastic Stack
Elastic Stack 由以下組件組成:
- Elasticsearch:一個分散式的 RESTful 搜尋引擎。它儲存所有收集到的數據。
- Logstash: Elastic Stack 的數據處理部分。它將傳入的數據傳送到 Elasticsearch。
- Kibana: 一個網頁介面,提供搜尋和記錄視覺化功能。
- Beats: 一個輕量級、單一用途的數據傳輸器。它可以將數據從多台機器傳送到 Logstash 或 Elasticsearch。
您需要手動安裝該 Stack 的每個組件。
先決條件
在繼續安裝 the Elastic Stack 之前,必須滿足幾個系統要求:
- 硬體需求:
- CPU:2 個 CPU(可由非 root sudo 使用者存取)
- RAM:4GB
- OpenJDK 11(最新的 Java LTS 版本)。要安裝此軟體,請參閱我們的 在 Ubuntu 18.04 上設定 Java 的教學.
- 。配置妥當的 Nginx。您可以按照我們的 在 Ubuntu 18.04 上安裝 Nginx 的指南 來進行設定。
請注意,儲存空間的大小取決於要收集和儲存的記錄數量。此外,Elastic Stack 還處理有關伺服器的重要資訊。為了確保數據傳輸的安全,我們強烈建議配置 TLS/SSL 憑證。請按照此 教學在您的 Nginx 伺服器上獲取免費的 SSL 憑證.
除了加密的伺服器之外,還需要執行以下步驟:
- 一個 FQDN(完整網域名稱)。在本指南中,它將是 <domain>。
- 以下兩個網域的 DNS 記錄都指向該伺服器。
- 一條將 <domain> 指向伺服器公用 IP 的 A 記錄。
- 一條將 www.<domain> 指向伺服器公用 IP 的 A 記錄。
安裝 Elastic Stack
-
配置 Elastic 儲存庫
Elastic Stack 的組件無法直接從官方 Ubuntu 儲存庫中取得。幸好,Ubuntu 允許 3rd 方儲存庫來安裝套件。為此,我們將新增 Elastic 套件儲存庫。該儲存庫提供所有 Elastic 套件的最新更新。所有 Elastic 套件都使用 Elasticsearch 簽章金鑰進行簽署,以防止套件被偽造。首先,將金鑰新增至 Ubuntu 金鑰環中:
|
1 |
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - |
然後,在「sources.list.d」目錄下新增 Elastic 來源清單。這是 APT 用於搜尋新來源的專用目錄:
|
1 |
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list |
最後,更新 APT 快取:
|
1 |
sudo apt update |
根據官方文件,建議按照本指南中示範的順序安裝每個組件。這可以確保每個產品所依賴的組件都位於正確的位置。
-
安裝與配置 Elasticsearch
配置好 Elastic 儲存庫後,APT 就可以下載並安裝所有 Elastic 套件。執行以下命令來安裝 Elasticsearch:
|
1 |
sudo apt install elasticsearch |
現在您可以設定 Elasticsearch。“elasticsearch.yml” 檔案提供了有關叢集、節點、路徑、網路、記憶體、閘道等的設定選項。其中大部分已在檔案中預先設定。接下來,使用您選擇的文字編輯器開啟 Elasticsearch 設定檔案:
|
1 |
sudo vim /etc/elasticsearch/elasticsearch.yml |
Elasticsearch 預設監聽來自任何地方的 9200 連接埠。我們建議限制對 Elasticsearch 的外部存取,以防止外部人員讀取資料或使用其 REST API 關閉 Elasticsearch 叢集。要限制對 Elasticsearch 的存取並加強其安全性,請取消註解以下行並替換其值:
|
1 |
network.host: localhost |
如果 Elasticsearch 要監聽特定的 IP 位址,請將 “localhost” 替換為目標 IP 位址。這是執行 Elasticsearch 之前的最低設定要求。儲存並關閉設定檔案。接下來,啟動 Elasticsearch 服務。啟動 Elasticsearch 可能需要一些時間:
|
1 |
sudo systemctl start elasticsearch |
之後,您需要確保 Elasticsearch 在每次伺服器開機時啟動:
|
1 |
sudo systemctl enable elasticsearch |
以下指令將驗證 Elasticsearch 服務是否正在執行。它只需要傳送一個 HTTP 請求:
|
1 |
curl -X GET "localhost:9200" |
回應看起來會像這樣。這是一個顯示有關本機節點一些基本資訊的回應。
安裝與設定 Kibana 儀表板
Kibana 可以直接從 Elastic 儲存庫中取得。請注意,您應該在安裝了 Elasticsearch 之後才安裝 Kibana。假設儲存庫已經可用,APT 可以直接獲取並安裝 Kibana:
|
1 |
sudo apt install kibana |
安裝完成後,啟用並啟動 Kibana 服務:
|
1 2 |
sudo systemctl enable kibana sudo systemctl start kibana |
預設情況下,Kibana 設定為僅監聽 “localhost”。對於外部存取,它需要設定反向代理。在這裡, Nginx 將作為反向代理。使用 openssl 指令來建立 Kibana 管理員使用者。這將是存取 Kibana 網頁介面的使用者帳戶。在這裡,範例使用者名稱將是 “kibana_admin”。為了確保更好的安全性,我們建議使用非標準的使用者名稱。以下指令將為 Kibana 建立一個管理員使用者。使用者名稱和密碼將被產生並儲存在 “htpasswd.users” 檔案中。Nginx 必須設定為使用該使用者名稱和密碼:
|
1 |
echo "kibana_admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users |
在提示字元下輸入並確認密碼。此密碼對於存取 Kibana 介面非常重要。之後,您需要建立一個 Nginx 伺服器區塊(server block)檔案。為了進行演示,它將是 example.com。它也可以是任何其他描述性名稱。如果為伺服器設定了 FQDN 和 DNS 記錄,檔案名稱也可以使用 FQDN:
|
1 |
sudo vim /etc/nginx/sites-available/example.com |
如果存在任何現有內容,請刪除該內容,並將其替換為以下幾行程式碼:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
server { listen 80; server_name example.com; auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.users; location / { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } |
儲存並關閉檔案。在「sites-enabled」目錄下建立新設定的符號連結。如果已存在相同檔名的連結,則可能不需要此步驟:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |
以下命令將提示 Nginx 檢查是否存在任何語法錯誤:
|
1 |
sudo nginx -t |
如果存在任何語法問題,請確保檔案內容放置正確。接下來,重新啟動 Nginx 服務:
|
1 |
sudo systemctl restart nginx |
告知 UFW 允許連線至 Nginx:
|
1 |
sudo ufw allow 'Nginx Full' |
現在應該可以透過 Elastic Stack 伺服器的 FQDN 或公用 IP 位址存取 Kibana。檢查 Kibana 伺服器的狀態頁面:
|
1 |
http://<server_ip>:5601/status |
安裝與設定 Logstash
雖然 Beats 可以直接將資料傳送到 Elasticsearch’s 資料庫,但建議使用 Logstash 來處理資料。Logstash 可以收集資料並將其轉換為通用格式,然後再匯出到另一個資料庫。執行以下 APT 命令來安裝 Logstash:
|
1 |
sudo apt install logstash |
安裝完成後,就可以開始設定 Logstash 了。Logstash 的設定檔為 JSON 格式。您可以在「/etc/logstash/conf.d」目錄中找到所有這些檔案。將 Logstash 視為一個管道(pipeline)會很有幫助,它在一端接收資料,進行處理,然後將其傳送到目的地。Logstash 管道需要兩個必要元素 – input 與 output ,以及一個選用元素 – filter。input 外掛程式接收資料,filter 外掛程式處理資料,而 output 外掛程式將資料寫入目的地。以下命令將建立一個設定檔,將 Logstash 設定為 Filebeat 輸入:
|
1 |
sudo vim /etc/logstash/conf.d/02-beats-input.conf |
輸入以下 input 設定。它描述了一個 beats 輸入,該輸入將在 TCP 連接埠 5044 上進行監聽:
|
1 2 3 4 5 |
input { beats { port => 5044 } } |
下一步是建立一個名為「10-syslog-filter.conf」的設定檔。我們將使用它來為 syslogs(系統記錄):
|
1 |
sudo vim /etc/logstash/conf.d/10-syslog-filter.conf |
輸入以下 syslog 設定程式碼。此程式碼可直接從 Elastic 指南 取得。此程式碼說明了 input 對 Logstash 的設定:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
輸入{ beats{ 連接埠 => 5044 主機 => "0.0.0.0" } } 過濾器 { 如果 [檔案集][模組] == "system" { 如果 [檔案集][名稱] == "auth" { grok { 匹配 => { "訊息" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$", "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] } pattern_definitions => { "GREEDYMULTILINE"=> "(.|\n)*" } remove_field => "message" } date { match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } geoip { source => "[system][auth][ssh][ip]" target => "[system][auth][ssh][geoip]" } } else if [fileset][name] == "syslog" { grok { match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] } pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" } remove_field => "message" } date { match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } } |
下一個設定檔將處理輸出。開啟一個名為「30-elasticsearch-output.conf」的新檔案:
|
1 |
sudo vim /etc/logstash/conf.d/30-elasticsearch-output.conf |
輸入以下程式碼。此程式碼向 Logstash 說明輸出設定:
|
1 2 3 4 5 6 7 |
output { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } |
測試 Logstash 設定。然後,執行以下命令:
|
1 |
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t |
如果沒有錯誤,Logstash 將會印出以下成功訊息。如果未成功,請確保所有設定檔都包含正確的程式碼。最後,啟動並啟用 Logstash 服務:
|
1 2 |
sudo systemctl start logstash sudo systemctl enable logstash |
現在 Logstash 已成功執行且已完整設定,讓我們來安裝 Filebeat。
安裝與設定 Filebeat
Elastic Stack 使用稱為「Beats」的資料傳送器,從各種來源收集資料並將其傳輸到 Logstash/Elasticsearch。以下是 Elastic 提供的可用 Beats 簡短清單:
- Filebeat:收集/傳送日誌檔案。
- Metricbeat:從系統和服務收集/傳送指標。
- Packetbeat:收集/分析網路資料。
- Winlogbeat:收集 Windows 事件日誌。
- Auditbeat:收集 Linux 稽核框架資料並監控檔案完整性。
- Heartbeat:監控服務的可用性。
在本教學中,我們將需要 Filebeat 來將本地日誌傳送到 Elastic Stack。首先,安裝 Filebeat:
|
1 |
sudo apt install filebeat |
您現在可以配置 Filebeat。首先,它需要連接到 Logstash。我們將使用 Filebeat 隨附的範例配置。在文字編輯器中打開配置文件。請注意,因為該文件是 YAML 格式,所以正確的縮排非常重要:
|
1 |
sudo vim /etc/filebeat/filebeat.yml |
找到「output.elasticsearch」區段並註解掉以下幾行。這將配置 Filebeat 直接將事件發送到 Elasticsearch/Logstash 進行額外處理。接下來,跳到「output.logstash」區段。接著,取消註解以下幾行:
|
1 2 3 4 5 6 7 |
#output.elasticsearch: # 要連接的主機陣列。 # hosts: ["localhost:9200"] output.logstash: # Logstash 主機 hosts: ["localhost:5044"] |
Filebeat 支援 模組,可以擴充其功能。在本教學中,我們將使用 系統模組,它會收集並解析常見 Linux 發行版的系統記錄服務所產生的記錄。啟用 Filebeat 系統模組:
|
1 |
sudo filebeat modules enable system |
以下 Filebeat 指令將列出所有已啟用和已停用的模組:
|
1 |
sudo filebeat modules list |
預設情況下,Filebeat 設定為遵循 syslog 和授權記錄的預設路徑。模組的參數可在「/etc/filebeat/modules.d/system.yml」配置文件中找到。
下一步是將索引範本載入到 Elasticsearch 中。一個 Elasticsearch 索引 表示共享相似特徵的文件集合。每個索引都有一個名稱。在其中執行各種操作時,該名稱是必需的。每次產生新索引時,都會自動套用索引範本。接下來,載入範本:
|
1 |
sudo filebeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]' |
預設情況下,Filebeat 包含一個適用於 Kibana 的範例儀表板。它有助於在 Kibana 中視覺化 Filebeat 資料。然而,在使用儀表板之前,必須先建立索引模式並將儀表板載入到 Kibana 中。在載入儀表板時,Filebeat 會聯絡 Elasticsearch 以獲取版本資訊。為了載入儀表板,在啟用 Logstash 的情況下,需要停用 Logstash 輸出並啟用 Elasticsearch 輸出。以下指令將完成此工作:
|
1 |
sudo filebeat setup -e -E output.logstash.enabled=false -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601 |
最後,您可以啟動 Filebeat:
|
1 2 |
sudo systemctl start filebeat sudo systemctl enable filebeat |
現在,是時候測試 Elastic Stack 配置了。如果配置正確,輸出將類似於以下內容:
|
1 |
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty' |
如果輸出顯示總命中數為 0,則表示 Elasticsearch 沒有在我們搜尋的索引下載入任何記錄。這表示配置存在錯誤。如果輸出符合預期,則表示 Elastic Stack 已成功配置。
Kibana 儀表板概述
現在,是時候探索我們已經安裝的 Kibana 網頁介面了。首先,打開 Kibana 儀表板。它應該位於 Elastic Stack 伺服器的 FQDN 或公用 IP 位址:
|
1 |
http://<server_ip>:5601 |
輸入我們之前產生的登入憑證。登入後,儀表板將如下所示:
從左側導覽列中,選擇「Discover」。然後,選擇「filebeat-*」模式。它會顯示過去 15 分鐘內收集的所有記錄。您可以搜尋和瀏覽記錄,並自訂儀表板:
從左側導覽列中,前往 Dashboard >> Filebeat System。在這裡,可以使用來自 Filebeat 系統模組的所有範例儀表板。
在以下範例中,它詳細列出了基於 syslog 訊息的各種統計數據:
它還可以報告哪些使用者使用 sudo 執行了指令:
最後,Kibana 讓您有機會探索許多其他功能(例如圖表和篩選),因此請隨意自行探索。
結語
Elastic Stack 是用於分析系統記錄的強大解決方案。請記住,雖然任何記錄或索引數據都可以使用 Beats 傳送到 Logstash,但透過 Logstash 篩選器進行解析和結構化後,它會變得更加有用。
祝您運算愉快!









留言
目前尚無留言。成為第一個留言的人吧。