注意:本教程適用於較舊版本的ELK堆棧,該版本與最新版本不兼容。
介紹
在本教程中,我們將在Ubuntu 14.04上重新安裝Elasticsearch ELK Stack,即Elasticsearch 1.7.3,Logstash 1.5.4和Kibana 4.1.1。我們還將向您展示如何對其進行配置,以便在集中位置收集和可視化系統的系統日誌。Logstash是一個用於收集,解析和存儲日誌以供將來使用的開源工具。Kibana是一個Web界面,可用於搜索和查看Logstash已編入索引的日誌。這兩個工具都基於Elasticsearch。
在嘗試識別服務器或應用程序的問題時,集中日誌記錄非常有用,因爲它允許您在一個位置搜索所有日誌。它也很有用,因爲它允許您通過在特定時間範圍內關聯其日誌來識別跨多個服務器的問題。
可以使用Logstash收集所有類型的日誌,但我們將本教程的範圍限制爲syslog收集。
目標
本教程的目標是設置Logstash以收集多個服務器的syslog,並設置Kibana以可視化收集的日誌。
我們的Logstash / Kibana設置有四個主要組件:
- Logstash:Logstash的服務器組件,用於處理傳入的日誌
- Elasticsearch:存儲所有日誌
- Kibana:用於搜索和可視化日誌的Web界面,將通過Nginx進行代理
- Logstash Forwarder:安裝在將日誌發送到Logstash的服務器上,Logstash Forwarder作爲日誌轉發代理,利用伐木工人網絡協議與Logstash通信
我們將在單個服務器上安裝前三個組件,我們將其稱爲Logstash Server。Logstash Forwarder將安裝在我們要收集日誌的所有客戶端服務器上,我們將統稱爲客戶端服務器。
準備
一臺已經設置好可以使用sudo
命令的非root賬號的Ubuntu服務器,並且已開啓防火牆。沒有服務器的同學可以在這裏購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後再購買服務器。
Logstash Server所需的CPU,RAM和存儲量取決於您要收集的日誌量。對於本教程,我們將使用具有以下規範的VPS用於Logstash服務器:
- 操作系統:Ubuntu 14.04
- 內存:4GB
- CPU:2
除了Logstash服務器之外,您還需要一些其他服務器來收集日誌。
讓我們開始設置我們的Logstash服務器吧!
安裝Java 8
Elasticsearch和Logstash需要Java,所以我們現在就安裝它。我們將安裝最新版本的Oracle Java 8,因爲這是Elasticsearch推薦的。但是,如果您決定走這條路,它應該可以與OpenJDK一起使用。
將Oracle Java PPA添加到apt:
sudo add-apt-repository -y ppa:webupd8team/java
更新您的apt包數據庫:
sudo apt-get update
使用此命令安裝最新穩定版本的Oracle Java 8(並接受彈出的許可協議):
sudo apt-get -y install oracle-java8-installer
現在已經安裝了Java 8,讓我們安裝ElasticSearch。
安裝Elasticsearch
通過添加Elastic的包源列表,可以將Elasticsearch與包管理器一起安裝。
運行以下命令將Elasticsearch公共GPG密鑰導入apt:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果你的提示只是掛在那裏,它可能正在等待你的用戶密碼(授權sudo
命令)。如果是這種情況,請輸入您的密碼。
創建Elasticsearch源列表:
echo "deb http://packages.elastic.co/elasticsearch/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-1.7.list
更新您的apt包數據庫:
sudo apt-get update
使用以下命令安裝Elasticsearch:
sudo apt-get -y install elasticsearch
Elasticsearch現已安裝。讓我們編輯配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
您需要限制對Elasticsearch實例(端口9200)的外部訪問,因此外人無法通過HTTP API讀取您的數據或關閉您的Elasticsearch集羣。找到指定的行network.host
,取消註釋,並將其值替換爲“localhost”,使其如下所示:
network.host: localhost
保存並退出elasticsearch.yml
。
現在啓動Elasticsearch:
sudo service elasticsearch restart
然後運行以下命令以在啓動時啓動Elasticsearch:
sudo update-rc.d elasticsearch defaults 95 10
現在Elasticsearch已啓動並運行,讓我們安裝Kibana。
安裝Kibana
通過添加Elastic的包源列表,可以將Kibana與包管理器一起安裝。
創建Kibana源列表:
echo 'deb http://packages.elastic.co/kibana/4.1/debian stable main' | sudo tee /etc/apt/sources.list.d/kibana.list
更新您的apt包數據庫:
sudo apt-get update
使用此命令安裝Kibana:
sudo apt-get -y install kibana
Kibana現已安裝。
打開Kibana配置文件進行編輯:
sudo vi /opt/kibana/config/kibana.yml
在Kibana配置文件中,找到指定的行host
,並用“localhost”替換IP地址(默認情況下爲“0.0.0.0”):
kibana.yml摘錄(更新)
host: "localhost"
保存並退出。此設置使得Kibana只能被本地主機訪問。這很好,因爲我們將在同一臺服務器上安裝一個Nginx反向代理,以允許外部訪問。
現在啓用Kibana服務,然後啓動它:
sudo update-rc.d kibana defaults 96 9 sudo service kibana start
在我們使用Kibana Web界面之前,我們必須設置反向代理。我們現在就用Nginx來做。
安裝Nginx
因爲我們將Kibana配置爲偵聽localhost
,所以我們必須設置反向代理以允許外部訪問它。我們將使用Nginx來實現此目的。
注意:如果您已經有一個想要使用的Nginx實例,請隨意使用它。只需確保配置Kibana,以便Nginx服務器可以訪問它(您可能希望將host
值更改爲/opt/kibana/config/kibana.yml
Kibana服務器的私有IP地址或主機名)。此外,建議您啓用SSL / TLS。
使用apt安裝Nginx和Apache2-utils:
sudo apt-get install nginx apache2-utils
使用htpasswd創建一個名爲“kibanaadmin”的管理員用戶(您應該使用其他名稱),該用戶可以訪問Kibana Web界面:
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在提示符下輸入密碼。記住此登錄信息,因爲您需要它來訪問Kibana Web界面。
現在,在您喜歡的編輯器中打開Nginx默認服務器塊。我們將使用vi:
sudo vi /etc/nginx/sites-available/default
刪除文件的內容,並將以下代碼塊粘貼到文件中。請務必更新server_name
以匹配您的服務器名稱:
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; } }
保存並退出。這會將Nginx配置爲將服務器的HTTP流量定向到正在偵聽localhost:5601
的Kibana應用程序。此外,Nginx將使用htpasswd.users
我們之前創建的文件,並需要基本身份驗證。
現在重新啓動Nginx以使我們的更改生效:
sudo service nginx restart
現在可以通過您的FQDN或Logstash服務器的公共IP地址訪問Kibana,即http:// logstash \ _server \ _public \ _ip /。如果您在Web瀏覽器中訪問,在輸入“kibanaadmin”憑據後,您應該會看到一個Kibana歡迎頁面,該頁面將要求您配置索引模式。在我們安裝所有其他組件之後,讓我們回過頭來看看。
安裝Logstash
Logstash包可以從與Elasticsearch相同的存儲庫中獲得,我們已經安裝了該公鑰,所以讓我們創建Logstash源列表:
echo 'deb http://packages.elasticsearch.org/logstash/1.5/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
更新您的apt包數據庫:
sudo apt-get update
使用以下命令安裝Logstash:
sudo apt-get install logstash
已安裝Logstash但尚未配置。
生成SSL證書
由於我們將使用Logstash Forwarder將日誌從我們的服務器發送到Logstash服務器,因此我們需要創建SSL證書和密鑰對。Logstash Forwarder使用該證書來驗證Logstash Server的身份。使用以下命令創建將存儲證書和私鑰的目錄:
sudo mkdir -p /etc/pki/tls/certs sudo mkdir /etc/pki/tls/private
現在,您有兩種生成SSL證書的選項。如果您具有允許客戶端服務器解析Logstash服務器的IP地址的DNS設置,請使用選項2。否則,選項1將允許您使用IP地址。
選項1:IP地址
如果您沒有DNS設置 - 允許您的服務器,您將從中收集日誌以解析Logstash服務器的IP地址 - 您必須將Logstash服務器的專用IP地址添加到subjectAltName
(SAN)字段我們即將生成的SSL證書。爲此,請打開OpenSSL配置文件:
sudo vi /etc/ssl/openssl.cnf
找到[ v3_ca ]
文件中的部分,並在其下添加此行(替換爲Logstash Server的專用IP地址):
subjectAltName = IP: logstash_server_private_ip
保存並退出。
現在使用以下命令在適當的位置(/ etc / pki / tls /)生成SSL證書和私鑰:
cd /etc/pki/tls sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
該logstash-forwarder.crt文件將被複制到所有將日誌發送到Logstash服務器,但我們會做到這一點稍晚。讓我們完成Logstash配置。如果您使用此選項,請跳過選項2並繼續配置Logstash。
選項2:FQDN(DNS)
如果您使用專用網絡進行DNS設置,則應創建包含Logstash Server的專用IP地址的A記錄 - 該域名將在下一個命令中使用,以生成SSL證書。或者,您可以使用指向服務器的公共IP地址的記錄。只需確保您的服務器(您將從中收集日誌的服務器)能夠將域名解析爲Logstash服務器。
現在使用以下命令(在Logstash服務器的FQDN中替換)在適當的位置(/ etc / pki / tls / ...)生成SSL證書和私鑰:
cd /etc/pki/tls; sudo openssl req -subj '/CN=logstash_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
該logstash-forwarder.crt文件將被複制到所有將日誌發送到Logstash服務器,但我們會做到這一點稍晚。讓我們完成Logstash配置。
配置Logstash
Logstash配置文件採用JSON格式,駐留在/etc/logstash/conf.d中。配置由三部分組成:輸入,過濾器和輸出。
讓我們創建一個名爲01-lumberjack-input.conf
的配置文件並設置我們的“lumberjack”輸入(Logstash Forwarder使用的協議):
sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
插入以下輸入配置:
input { lumberjack { port => 5043 type => "logs" ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
保存並退出。這指定了lumberjack
將在tcp端口上偵聽的輸入,它將5043
使用我們之前創建的SSL證書和私鑰。
現在讓我們創建一個名爲的配置文件10-syslog.conf
,我們將爲syslog消息添加一個過濾器:
sudo vi /etc/logstash/conf.d/10-syslog.conf
插入以下syslog 過濾器配置:
filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] add_field => [ "received_from", "%{host}" ] } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } }
保存並退出。此過濾器查找標記爲“syslog”類型的日誌(由Logstash轉發器),並且它將嘗試使用“grok”來解析傳入的syslog日誌,以使其具有結構化和可查詢性。
最後,我們將創建一個名爲30-lumberjack-output.conf
的配置文件:
sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
插入以下輸出配置:
output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
保存並退出。此輸出基本上配置Logstash以將日誌存儲在Elasticsearch中。
使用此配置,Logstash還將接受與過濾器不匹配的日誌,但不會構建數據(例如,未過濾的Nginx或Apache日誌將顯示爲平面消息,而不是按HTTP響應代碼,源IP地址,服務文件對消息進行分類等)。
如果要爲使用Logstash Forwarder輸入的其他應用程序添加過濾器,請確保命名文件,以便它們在輸入和輸出配置之間進行排序(即在01-和30-之間)。
重新啓動Logstash以使我們的配置更改生效:
sudo service logstash restart
現在我們的Logstash服務器已準備就緒,讓我們繼續設置Logstash Forwarder。
設置Logstash轉發器(添加客戶端服務器)
爲要將日誌發送到Logstash Server的每個Ubuntu或Debian服務器執行這些步驟。
複製SSL證書和Logstash轉發器包
在Logstash Server上,將SSL證書複製到客戶端服務器(替換客戶端服務器的地址和您自己的登錄名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供登錄憑據後,請確保證書副本成功。它是客戶端服務器和Logstash服務器之間通信所必需的。
安裝Logstash轉發器包
在客戶端服務器上,創建Logstash轉發器源列表:
echo 'deb http://packages.elastic.co/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
它還使用與Elasticsearch相同的GPG密鑰,可以使用以下命令安裝:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然後安裝Logstash Forwarder包:
sudo apt-get update sudo apt-get install logstash-forwarder
注意:如果您使用的是32位版本的Ubuntu,並且收到“無法找到軟件包logstash-forwarder”錯誤,則需要手動安裝Logstash Forwarder。
現在將Logstash服務器的SSL證書複製到適當的位置(/ etc / pki / tls / certs):
sudo mkdir -p /etc/pki/tls/certs sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置Logstash轉發器
在客戶端服務器上,創建和編輯Logstash Forwarder配置文件,該文件採用JSON格式:
sudo vi /etc/logstash-forwarder.conf
在該network
部分下,將以下行添加到文件中,在您的Logstash Server的私有地址中替換logstash_server_private_address
:
"servers": [ "logstash_server_private_address:5043" ], "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt", "timeout": 15
在該files
部分(方括號之間),添加以下行,
{ "paths": [ "/var/log/syslog", "/var/log/auth.log" ], "fields": { "type": "syslog" } }
保存並退出。這會將Logstash Forwarder配置爲在端口5043(我們之前爲其指定輸入的端口)上連接到Logstash Server,並使用我們之前創建的SSL證書。該路徑部分指定哪些日誌文件發送(這裏我們指定syslog和auth.log),和類型節指定這些日誌型“系統日誌*(這是我們的過濾器正在尋找的類型)。
請注意,您可以在此處添加更多文件/類型,以將Logstash Forwarder配置爲其他日誌文件到端口5043上的Logstash。
現在重新啓動Logstash Forwarder以將我們的更改放到位:
sudo service logstash-forwarder restart
現在Logstash Forwarder正在向您的Logstash服務器發送syslog和auth.log!對要爲其收集日誌的所有其他服務器重複此部分。
連接Kibana
當您在要收集日誌的所有服務器上完成Logstash Forwarder的設置後,讓我們看一下我們之前安裝的Web界面Kibana。
在Web瀏覽器中,轉到Logstash Server的FQDN或公共IP地址。輸入“kibanaadmin”憑據後,您應該會看到一個提示您配置索引模式的頁面:
繼續從下拉菜單中選擇@timestamp,然後單擊“ 創建”按鈕以創建第一個索引。
現在單擊頂部導航欄中的Discover鏈接。默認情況下,這將顯示過去15分鐘內的所有日誌數據。您應該看到帶有日誌事件的直方圖,其中包含以下日誌消息:
現在,因爲您只從客戶端服務器收集系統日誌,因此不會有太多內容。在這裏,您可以搜索和瀏覽日誌。您還可以自定義儀表板。
請嘗試以下方法:
- 搜索“root”以查看是否有人嘗試以root身份登錄您的服務器
- 搜索特定主機名(搜索
host: "hostname"
) - 通過選擇直方圖上的區域或上面的菜單來更改時間範圍
- 單擊直方圖下方的消息以查看數據的過濾方式
Kibana還有許多其他功能,例如圖形和過濾功能,所以請隨意逛逛!
結論
既然您的系統日誌是通過Elasticsearch和Logstash集中進行的,並且您可以使用Kibana將它們可視化,那麼您應該集中精力處理所有重要日誌。請記住,您可以向Logstash發送幾乎任何類型的日誌,但如果使用grok解析和構建數據,則數據會變得更加有用。
要改進新的ELK堆棧,您應該研究使用Logstash收集和過濾其他日誌,以及創建Kibana儀表板。
更多Ubuntu教程請前往騰訊雲+社區學習更多知識。
參考文獻:《How To Install Elasticsearch 1.7, Logstash 1.5, and Kibana 4.1 (ELK Stack) on Ubuntu 14.04》