介紹
在本教程中,我們將介紹在Ubuntu 16.04上安裝Elasticsearch ELK Stack(即Elasticsearch 2.3.x,Logstash 2.3.x和Kibana 4.5.x)。我們還將向您展示如何使用Filebeat 1.2.x將其配置爲在集中位置收集和可視化系統的syslog。Logstash是一個用於收集,解析和存儲日誌以供將來使用的開源工具。Kibana是一個Web界面,可用於搜索和查看Logstash已編入索引的日誌。這兩個工具都基於Elasticsearch,用於存儲日誌。
在嘗試識別服務器或應用程序的問題時,集中日誌記錄非常有用,因爲它允許您在一個位置搜索所有日誌。它也很有用,因爲它允許您通過在特定時間範圍內關聯其日誌來識別跨多個服務器的問題。
可以使用Logstash收集所有類型的日誌,但我們將本教程的範圍限制爲syslog收集。
目標
本教程的目標是設置Logstash以收集多個服務器的syslog,並設置Kibana以可視化收集的日誌。
我們的ELK堆棧設置有四個主要組件:
- Logstash:Logstash的服務器組件,用於處理傳入的日誌
- Elasticsearch:存儲所有日誌
- Kibana:用於搜索和可視化日誌的Web界面,將通過Nginx進行代理
- Filebeat:安裝在將日誌發送到Logstash的客戶端服務器上,Filebeat用作利用伐木工人網絡協議與Logstash通信的日誌傳送代理
我們將在單個服務器上安裝前三個組件,我們將其稱爲ELK服務器。Filebeat將安裝在我們要收集日誌的所有客戶端服務器上,我們將統稱爲客戶端服務器。
準備
一臺已經設置好可以使用sudo
命令的非root賬號的Ubuntu服務器,並且已開啓防火牆。沒有服務器的同學可以在這裏購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後再購買服務器。
ELK服務器所需的CPU,RAM和存儲量取決於您要收集的日誌量。對於本教程,我們將使用具有以下ELK服務器規範的VPS:
- 操作系統:Ubuntu 16.04
- 內存:4GB
- CPU:2
除了ELK服務器之外,您還需要一些其他服務器來收集日誌。
讓我們開始設置我們的ELK服務器!
安裝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/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
apt
再次更新包數據庫:
sudo apt-get update
使用以下命令安裝Elasticsearch:
sudo apt-get -y install elasticsearch
Elasticsearch現已安裝。讓我們編輯配置:
sudo nano /etc/elasticsearch/elasticsearch.yml
您需要限制對Elasticsearch實例(端口9200)的外部訪問,因此外人無法通過HTTP API讀取您的數據或關閉您的Elasticsearch集羣。找到指定的行network.host
,取消註釋,並將其值替換爲“localhost”,使其如下所示:
network.host: localhost
保存並退出elasticsearch.yml
。
現在,啓動Elasticsearch:
sudo systemctl restart elasticsearch
然後,運行以下命令以在啓動時啓動Elasticsearch:
sudo systemctl daemon-reload sudo systemctl enable elasticsearch
現在Elasticsearch已啓動並運行,讓我們安裝Kibana。
安裝Kibana
通過添加Elastic的包源列表,可以將Kibana與包管理器一起安裝。
將Kibana添加到您的源列表:
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
更新您的apt
包數據庫:
sudo apt-get update
使用此命令安裝Kibana:
sudo apt-get -y install kibana
Kibana現已安裝。
打開Kibana配置文件進行編輯:
sudo nano /opt/kibana/config/kibana.yml
在Kibana配置文件中,找到指定的行server.host
,並用“localhost”替換IP地址(默認情況下爲“0.0.0.0”):
server.host: "localhost"
保存並退出。此設置使得Kibana只能被本地主機訪問。這很好,因爲我們將使用Nginx反向代理來允許外部訪問。
現在啓用Kibana服務,然後啓動它:
sudo systemctl daemon-reload sudo systemctl enable kibana sudo systemctl start kibana
在我們使用Kibana Web界面之前,我們必須設置反向代理。我們現在就用Nginx來做。
安裝Nginx
因爲我們將Kibana配置爲偵聽localhost
,所以我們必須設置反向代理以允許外部訪問它。我們將使用Nginx來實現此目的。
注意
如果您已經有想要使用的Nginx實例,請隨意使用它。只需確保配置Kibana,以便Nginx服務器可以訪問它(您可能希望將host
值更改爲/opt/kibana/config/kibana.yml
Kibana服務器的私有IP地址或主機名)。此外,建議您啓用SSL / TLS。
使用apt
安裝Nginx的:
sudo apt-get -y install nginx
使用openssl
創建一個管理員用戶,被稱爲“kibanaadmin”(你應該使用其他名稱),可以訪問Kibana Web界面:
sudo -v echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
在提示符下輸入密碼。記住此登錄信息,因爲您需要它來訪問Kibana Web界面。
現在在您喜歡的編輯器中打開Nginx默認服務器塊:
sudo nano /etc/nginx/sites-available/default
刪除文件的內容,並將以下代碼塊粘貼到文件中。請務必更新server_name
以匹配您的服務器名稱或公共IP地址:
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 nginx -t sudo systemctl restart nginx
如果您按照16.04的初始服務器設置指南進行操作,則表明您已啓用UFW防火牆。要允許連接到Nginx,我們可以通過鍵入以下內容來調整規則:
sudo ufw allow 'Nginx Full'
現在可以通過您的FQDN或ELK服務器的公共IP地址訪問Kibana,即http:// elk \ _server \ _public \ _ip /。如果您在Web瀏覽器中訪問,在輸入“kibanaadmin”憑據後,您應該會看到一個Kibana歡迎頁面,該頁面將要求您配置索引模式。在我們安裝所有其他組件之後,讓我們回過頭來看看。
安裝Logstash
Logstash包可以從與Elasticsearch相同的存儲庫中獲得,我們已經安裝了該公鑰,所以讓我們將Logstash添加到我們的源列表中:
echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
更新您的apt
包數據庫:
sudo apt-get update
使用以下命令安裝Logstash:
sudo apt-get install logstash
已安裝Logstash但尚未配置。
生成SSL證書
由於我們將使用Filebeat將日誌從我們的客戶端服務器發送到ELK服務器,因此我們需要創建SSL證書和密鑰對。Filebeat使用該證書來驗證ELK服務器的身份。使用以下命令創建將存儲證書和私鑰的目錄:
sudo mkdir -p /etc/pki/tls/certs sudo mkdir /etc/pki/tls/private
現在,您有兩種生成SSL證書的選項。如果您的DNS設置允許客戶端服務器解析ELK服務器的IP地址,請使用選項2。否則,選項1將允許您使用IP地址。
選項1:IP地址
如果您沒有DNS設置 - 允許您的服務器,您將收集日誌,以解析您的ELK服務器的IP地址 - 您必須將您的ELK服務器的私有IP地址添加到subjectAltName
(SAN)字段我們即將生成的SSL證書。爲此,請打開OpenSSL配置文件:
sudo nano /etc/ssl/openssl.cnf
找到文件中的[ v3_ca ]
部分,並在其下添加此行(替換爲ELK服務器的專用IP地址):
subjectAltName = IP: ELK_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設置,則應創建包含ELK服務器專用IP地址的A記錄 - 該域名將在下一個命令中使用,以生成SSL證書。或者,您可以使用指向服務器的公共IP地址的記錄。只需確保您的服務器(您將從中收集日誌的服務器)能夠將域名解析爲您的ELK服務器。
現在生成SSL證書和私鑰,在適當的位置(/etc/pki/tls/...
),使用以下內容(在ELK服務器的FQDN中替換):
cd /etc/pki/tls sudo openssl req -subj '/CN=ELK_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
。配置由三部分組成:輸入,過濾器和輸出。
讓我們創建一個名爲02-beats-input.conf
的配置文件並設置我們的“filebeat”輸入:
sudo nano /etc/logstash/conf.d/02-beats-input.conf
插入以下輸入配置:
input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
保存並退出。這指定了beats
將在TCP端口上偵聽的輸入,它將5044
使用我們之前創建的SSL證書和私鑰。
如果您按照Ubuntu 16.04初始服務器設置指南進行操作,則將配置UFW防火牆。要允許Logstash在端口上接收連接5044
,我們需要打開該端口:
sudo ufw allow 5044
現在讓我們創建一個名爲的配置文件10-syslog-filter.conf
,我們將爲syslog消息添加一個過濾器:
sudo nano /etc/logstash/conf.d/10-syslog-filter.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”類型的日誌(通過Filebeat),它將嘗試grok
用於解析傳入的syslog日誌以使其具有結構化和可查詢性。
最後,我們將創建一個名爲30-elasticsearch-output.conf
的配置文件:
sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf
插入以下輸出配置:
output { elasticsearch { hosts => ["localhost:9200"] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
保存並退出。此輸出基本上配置Logstash以將節拍數據存儲在運行於的Elasticsearch中,該localhost:9200
節點以使用的節拍命名的索引(在我們的示例中爲filebeat)。
如果要爲使用Filebeat輸入的其他應用程序添加過濾器,請確保將文件命名爲在輸入和輸出配置之間進行排序(即在02-和30-之間)。
使用以下命令測試Logstash配置:
sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
幾秒鐘後,如果沒有語法錯誤,則應顯示Configuration OK
。否則,請嘗試讀取錯誤輸出以查看Logstash配置的錯誤。
重新啓動Logstash並啓用它,以使我們的配置更改生效:
sudo systemctl restart logstash sudo systemctl enable logstash
Logstash將會收聽
接下來,我們將加載示例Kibana儀表板。
加載Kibana儀表板
Elastic提供了幾個示例Kibana儀表板和Beats索引模式,可以幫助您開始使用Kibana。雖然我們不會在本教程中使用儀表板,但我們仍會加載它們,因此我們可以使用它包含的Filebeat索引模式。
用curl
將文件下載到您的主目錄:
cd ~ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.2.2.zip
使用以下命令安裝unzip
軟件包:
sudo apt-get -y install unzip
接下來,提取存檔的內容:
unzip beats-dashboards-*.zip
並使用以下命令將示例儀表板,可視化和Beats索引模式加載到Elasticsearch中:
cd beats-dashboards-* ./load.sh
這些是我們剛剛加載的索引模式:
- packetbeat- *
- topbeat- *
- filebeat- *
- winlogbeat- *
當我們開始使用Kibana時,我們將選擇Filebeat索引模式作爲默認值。
在Elasticsearch中加載Filebeat索引模板
因爲我們計劃使用Filebeat將日誌發送到Elasticsearch,所以我們應該加載Filebeat索引模板。索引模板將配置Elasticsearch以智能方式分析傳入的Filebeat字段。
首先,將Filebeat索引模板下載到您的主目錄:
cd ~ curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
然後使用以下命令加載模板:
curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' [email protected]
如果模板正確加載,您應該看到如下消息:
{ "acknowledged" : true }
現在我們的ELK服務器已準備好接收Filebeat數據,讓我們轉到在每個客戶端服務器上設置Filebeat。
設置Filebeat(添加客戶端服務器)
對於要將日誌發送到ELK服務器上的Logstash的每個Ubuntu或Debian服務器,請執行以下步驟。
複製SSL證書
在ELK服務器上,將您創建的SSL證書複製到客戶端服務器(替換客戶端服務器的地址和您自己的登錄名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供登錄憑據後,請確保證書副本成功。它是客戶端服務器和ELK服務器之間通信所必需的。
現在,在您的客戶端服務器上,將ELK服務器的SSL證書複製到適當的位置(/etc/pki/tls/certs
):
sudo mkdir -p /etc/pki/tls/certs sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
現在我們將安裝Topbeat包。
安裝Filebeat包
在客戶端服務器上,創建Beats源列表:
echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
它還使用與Elasticsearch相同的GPG密鑰,可以使用以下命令安裝:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然後安裝Filebeat包:
sudo apt-get update sudo apt-get install filebeat
Filebeat已安裝,但尚未配置。
配置Filebeat
現在我們將配置Filebeat以連接到ELK服務器上的Logstash。本節將指導您修改Filebeat附帶的示例配置文件。完成這些步驟後,您應該有一個類似於此的文件。
在客戶端服務器上,創建和編輯Filebeat配置文件:
sudo nano /etc/filebeat/filebeat.yml
注意
Filebeat的配置文件是YAML格式,這意味着縮進非常重要!請務必使用這些說明中指示的相同數量的空格。
在文件頂部附近,您將看到該prospectors
部分,您可以在其中定義探測器,指定應該發送哪些日誌文件以及如何處理它們。每個探礦者都由-
角色指示。
我們將修改現有的prospector以發送syslog
和auth.log
Logstash。在paths
中,註釋掉- /var/log/*.log
文件。這將阻止Filebeat 將該目錄中的每個.log
發送到Logstash。然後爲syslog
和添加新條目auth.log
。完成後它應該看起來像這樣:
... paths: - /var/log/auth.log - /var/log/syslog # - /var/log/*.log ...
然後找到指定的行document_type:
,取消註釋並將其值更改爲“syslog”。修改後應該如下所示:
... document_type: syslog ...
這指定此prospector中的日誌是syslog類型(這是我們的Logstash過濾器正在查找的類型)。
如果要將其他文件發送到ELK服務器,或者對Filebeat如何處理日誌進行任何更改,請隨時修改或添加prospector條目。
接下來,在該output
部分下,找到顯示的行elasticsearch:
,它表示Elasticsearch輸出部分(我們不打算使用)。 刪除或註釋掉整個Elasticsearch輸出部分(直到說明的行#logstash:
)。
找到註釋掉的Logstash輸出部分,由顯示的行指示#logstash:
,並通過刪除前面的內容取消註釋#
。在本節中,取消註釋該hosts: ["localhost:5044"]
行。更改localhost
爲ELK服務器的專用IP地址(或主機名,如果使用該選項):
### Logstash as output logstash: # The Logstash hosts hosts: ["ELK_server_private_IP:5044"]
這會將Filebeat配置爲在端口5044
(我們之前爲之前指定Logstash輸入的端口)連接到ELK服務器上的Logstash。
直接在hosts
條目下,並使用相同的縮進,添加以下行:
### Logstash as output logstash: # The Logstash hosts hosts: ["ELK_server_private_IP:5044"] bulk_max_size: 1024
接下來,找到該tls
部分,並取消註釋。然後取消註釋指定的行certificate_authorities
,並將其值更改爲["/etc/pki/tls/certs/logstash-forwarder.crt"]
。它應該看起來像這樣:
... tls: # List of root certificates for HTTPS server verifications certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
這會將Filebeat配置爲使用我們在ELK服務器上創建的SSL證書。
保存並退出。
現在重新啓動Filebeat以將我們的更改放到位:
sudo systemctl restart filebeat sudo systemctl enable filebeat
同樣,如果您不確定Filebeat配置是否正確,請將其與此示例Filebeat配置進行比較。
現在Filebeat被髮送syslog
,並auth.log
以您的ELK服務器上Logstash!對要爲其收集日誌的所有其他服務器重複此部分。
測試文件安裝
如果您的ELK堆棧設置正確,Filebeat(在客戶端服務器上)應該將您的日誌傳送到ELK服務器上的Logstash。Logstash應該使用我們之前導入的索引將Filebeat數據加載到Elasticsearch中。
在ELK服務器上,通過使用以下命令查詢Filebeat索引,驗證Elasticsearch是否確實正在接收數據:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你應該看到一堆看起來像這樣的輸出:
... { "_index" : "filebeat-2016.01.29", "_type" : "log", "_id" : "AVKO98yuaHvsHQLa53HE", "_score" : 1.0, "_source":{"message":"Feb 3 14:34:00 rails sshd[963]: Server listening on :: port 22.","@version":"1","@timestamp":"2016-01-29T19:59:09.145Z","beat":{"hostname":"topbeat-u-03","name":"topbeat-u-03"},"count":1,"fields":null,"input_type":"log","offset":70,"source":"/var/log/auth.log","type":"log","host":"topbeat-u-03"} } ...
如果您的輸出顯示總命中數爲0,則Elasticsearch不會在您搜索的索引下加載任何日誌,您應該檢查設置是否有錯誤。如果收到預期輸出,請繼續執行下一步。
連接Kibana
當您在要收集日誌的所有服務器上完成Filebeat的設置後,讓我們看一下我們之前安裝的Web界面Kibana。
在Web瀏覽器中,轉到ELK服務器的FQDN或公共IP地址。輸入“kibanaadmin”憑據後,您應該會看到一個頁面,提示您配置默認索引模式:
繼續並從Index Patterns菜單(左側)中選擇filebeat- *,然後單擊Star(設置爲默認索引)按鈕將Filebeat索引設置爲默認值。
現在單擊頂部導航欄中的Discover鏈接。默認情況下,這將顯示過去15分鐘內的所有日誌數據。您應該看到帶有日誌事件的直方圖,其中包含以下日誌消息:
現在,因爲您只從客戶端服務器收集系統日誌,因此不會有太多內容。在這裏,您可以搜索和瀏覽日誌。您還可以自定義儀表板。
請嘗試以下方法:
- 搜索“root”以查看是否有人嘗試以root身份登錄您的服務器
- 搜索特定主機名(搜索
host: "hostname"
) - 通過選擇直方圖上的區域或上面的菜單來更改時間範圍
- 單擊直方圖下方的消息以查看數據的過濾方式
Kibana還有許多其他功能,例如圖形和過濾功能,所以請隨意逛逛!
結論
既然您的系統日誌是通過Elasticsearch和Logstash集中進行的,並且您可以使用Kibana將它們可視化,那麼您應該集中精力處理所有重要日誌。請記住,您可以向Logstash發送幾乎任何類型的日誌或索引數據,但如果使用grok解析和構建數據,則數據會變得更加有用。
更多Ubuntu教程請前往騰訊雲+社區學習更多知識。
參考文獻:《How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 16.04》