HƯỚNG DẪN CÀI ĐẶT VÀ SỬ DỤNG ELASTICSEARCH ELK STACK TRÊN UBUNTU 16.04
GIỚI THIỆU
Trong bài hướng dẫn này mình sẽ hướng dẫn bạn cách cài đặt Elasticsearch ELK Stack trên Linux Ubuntu 16.04 ( Bộ ELK này bao gồm Elasticsearch 2.3.x, Logstash 2.3.x, and Kibana 4.5.x) . Hướng dẫn cách cấu hình các service này hoạt động chung với nhau để visualize syslogs và quản lý tập trung logs (centralized location) bằng Filebeat 1.2.x. Logstash là một opensource nó có thể collecting, parsing, and storing logs. Kibana là một web interface xử dụng để search & view logs mà Logstash đã index. Cả 2 tools trên đều base trên Elasticsearch, Elasticsearch dùng để lưu logs.
Việc xử lý tập trung logs rất quan trọng trong các trường hợp xác định lỗi phía server hoặc là application. Nó cho phép mình search bất kỳ loại logs mà chỉ cần đứng ở web interface của Kibana. Nó rất hữu hiệu trong các trường hợp mà lỗi server hoặc application xuất hiện ở nhiều server khác nhau trong hệ thống, đứng ở Kibana bạn có thể search logs của toàn bộ hệ thống
Logstash có thể collect được hầu hết các loại logs, nhưng trong bài viết này mình sẽ giới hạn lại ở syslog.
MỤC TIÊU ĐẠT ĐƯỢC
Mục tiêu của bài viết này là mình có thể dùng Logstash để tập hợp syslog của tất cả các server có mặt trong hệ thống lại với nhau, và cài đặt Kibana để visualize logs.
ELK Stack cài đặt thì có các component chính như sau.
* Logstash: Thành phần chức năng chính của Logstash chính là xử lý incoming logs
* Elasticsearch: Lưu trữ toàn bộ logs mà Logstash index được.
* Kibana: Web interface dùng để searching & visualizing logs, có thể expose ra bằng proxy nginx
* Filebeat: Filebeat server là một logs shipping agent, nó được cài đặt trên Server mà mình muốn lấy logs, nó sẽ đẩy logs từ server này về cho Logstash xử lý. Nó được gọi là Client Servers
Mình sẽ cài đặt 3 tool đầu tiên vào chung server. Còn FileBeat thì nó sẽ được cài lên server remote.
YÊU CẦU CẦN THIẾT CHO QUÁ TRÌNH CÀI ĐẶT
Cần quyền root để cài đặt ELK Stack
Cấu hình server CPU, Ram, Disk phụ thuộc vào lượng Logs mà bạn muốn thu thập và xử lý. Trong bài này mình sẽ dùng cấu hình trong specs của ELK
* OS: Ubuntu 16.04
* RAM: 4GB
* CPU: 2
BẮT ĐẦU QUÁ TRÌNH CÀI ĐẶT ELK STACK (NOTE: CẦN QUYỀN ROOT)
- Cài đặt Java 8 (Install Java 8)
Elasticsearch và Logstash đều yêu cầu phải có java enviroment mới có thể hoạt động, nên ta tiến hành cài đặt Java.
123$ sudo add-apt-repository -y ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get -y install oracle-java8-installer - Cài đặt Elasticsearch (Install Elasticsearch)
Elasticsearch có thể cài đặt từ package manager như apt & yum từ Elastic’s package source list.
Chạy command sau để import Elasticsearch public GPG key.
1$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Tạo Elasticsearch source list file.
1echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
Update apt package database lại.
1$ sudo apt-get update
Sau đó cài đặt Elasticsearch bằng command sau.
1$ sudo apt-get -y install elasticsearch
Lúc này Elasticsearch đã được cài đặt xong, bây giờ tiến hành cấu hình.
12# mở file cấu hình Elasticsearch lên.$ sudo vim /etc/elasticsearch/elasticsearch.yml
Mở file cấu hình lên và cho elasticsearch listen ở loopback interface, để bên ngoài không thể truy cập vào database elasticsearch bằng HTTP API được (nhầm tránh rũi ro). Tìm dòng “network.host”, uncomment it, và thay thế vào đó bằng localhost như bên dưới
1network.host: localhost
Lưu lại và thoát. Bây giờ start Elasticsearch lên.
1$ sudo systemctl restart elasticsearch
Cấu hình cho elasticsearch khởi động lúc onboot.
12$ sudo systemctl daemon-reload$ sudo systemctl enable elasticsearch
Finished, giờ tiếp theo ta cài Kibana. - Cài đặt Kibaba (Install Kibana)
Củng tương tự như Elasticsearch, với Kibana mình củng cài nó từ package manager bằng repo. Đầu tiên add repo cho Kibana.
1$ echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
Update apt package database.
1$ sudo apt-get update
Cài đặt Kibana.
1$ sudo apt-get -y install kibana
Sau khi cài đặt xong thì tiến hành cấu hình.
1$ sudo vim /opt/kibana/config/kibana.yml
Trong file config tìm dòng server.host, Thay ip 0.0.0.0 bằng localhost. Mình sẽ không public Kibana ra ngoài mà đặt nó phía sau proxy nginx, và vì 1 điều nữa là Kibana nó dở cái nó không có user management, nên mình phải dùng authentication basic của nginx để làm login tạm.
1server.host: "localhost"
Bây giờ start, và cấu hình on boot cho kibana
123$ sudo systemctl daemon-reload$ sudo systemctl enable kibana$ sudo systemctl start kibana
Lúc này mình chưa sài được Kibana vì chưa có proxy nginx. Bắt đầu cài nginx proxy và public tên miền http://docker.wikivps.net để truy cập vào Kibana web interface. - Cài đặt Nginx (Install Nginx)
Phải và nên cài nginx proxy để public Kibana ra ngoài internet.
Sử dụng package manager apt để cài Nginx.
1$ sudo apt-get -y install nginx
Sử dụng openssl để tạo admin user, mình đặt tên user là “kibanaadmin” (có thể thay đổi bất kỳ tên nào muốn). Sử dụng user này có thể login vào web interface của kibana
12$ sudo -v$ echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
Khi chạy command trên nó sẽ yêu cầu bạn nhập password cho user kibanaadmin đó, nhập password và nhớ lưu lại để lúc sau sài, sau đó nhấn Enter.
Bây giờ cấu hình vhost cho nginx để listen trên domain docker.wikivps.net, và proxy pass về Kibana TCP Socket đang listen.
Mở file cấu hình virtualhost mặt định lên xoá toàn bộ nội dung trong đó.
1$ sudo vim /etc/nginx/sites-available/default
Sau khi xoá toàn bộ nội dung trong đó thì copy và paste nội dung này vào thay thế.
1234567891011121314151617server {listen 80;server_name docker.wikivps.net;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;}}
OK, giờ check lại config nginx và start service nginx lên.
12$ sudo nginx -t$ sudo systemctl restart nginx
Ở bước này check thử xem cái tool quản lý firewall ufw có được cài đặt chưa, chưa thì bạn cài vào, và chạy command để cho firewall allow open port cho Nginx service.
123$ sudo ufw status # lệnh kiểm tra ufw có cài hay chưa, nếu command not found là chưa cài$ sudo apt-get install ufw # Nếu chưa cài thì cài bằng command này$ sudo ufw allow 'Nginx Full' - Cài đặt Logstash (Install Logstash)
Củng tương tự các service trên Logstash củng cài đặt từ package manager apt, thêm repo để cài đặt Logstash
1$ echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
Update apt package database.
1$ sudo apt-get update
Cài đặt Logstash
1$ sudo apt-get install logstash
Ok, Logstash vừa cài xong, nhưng khoan hãy start nó lên. Giờ mình cấp SSL Certificates và cấu hình vài bước phụ.- Tạo SSL Certificates (Generate SSL Certificates)
Bởi vì mình dùng tool Filebeat để đẩy log từ remote server về ELK server cho nên mình phải tạo SSL Certificate và key pair. Certificate sẽ được Filebeat sử dụng để verify với ELK Server trước khi đẩy log về.
Tạo các thư mục chứa certificates và key
12$ sudo mkdir -p /etc/pki/tls/certs$ sudo mkdir /etc/pki/tls/private
Lúc này nếu mà hệ thống mình có DNS internal à. thì mình sẽ gen key cách khác, còn ở đây mình sẽ chỉ các bạn gen key và cert khi hệ thống không có DNS internal và phải dùng IP của ELK Server. - Tạo SSL cho phép sử dụng IP trong trường hợp không có DNS internal
Vì dùng ip để tạo SSL Cert nên mình phải thay đổi trường subjectAltName trong file openssl.conf thành IP để mới có thể generate SSL bằng ip được.
1234$ sudo vim /etc/ssl/openssl.cnf# Tìm tới session [ v3_ca ], thêm trực tiếp dòng bên dưới vào dưới session nàysubjectAltName = IP: 10.90.0.89
Ok, xong lưu lại file này và tiến hành gen key & cert.
12$ 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
Sau này khi mà muốn đẩy logs từ server nào về ELK server thì chỉ cần copy certificate file logstash-forwarder.crt này qua, và cấu hình nó trong Filebeat là ok. - Cấu hình Logstash (Configure Logstash)
File cấu hình của Logstash nó viết dưới dạng JSON, và đặt ở /etc/logstash/conf.d/. Logstash nó có 3 thành phần chính về cấu hình đó là: Inputs, Filters, and Outputs.
Đầu tiên ta tạo file có tên là 02-beats-input.conf và cấu hình input filebeat.
12345678910111213# Mở file cấu hình lên$ sudo vim /etc/logstash/conf.d/02-beats-input.conf# Copy hết phần nội dung bên dưới đây vào.input {beats {port => 5044ssl => truessl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"}}
Ta phải mở port 5044 cho beat đầy logs về.
1$ sudo ufw allow 5044
Bây giờ tạo file 10-syslog-filter.conf, và cấu hình filter cho syslog message.
1234567891011121314151617# mở file sau lên$ sudo vim /etc/logstash/conf.d/10-syslog-filter.conf# copy toàn bộ nội dung bên dưới cho vào filefilter {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" ]}}}
Ý nghĩa của phần filter trên là logstash nó sẽ tìm kiếm logs có type là syslog sau đó nó parse incoming syslog log để cho những đoạn logs này nó có thứ tự, cấu trúc hơn, dễ truy vấn hơn.
Cuối cùng, ta tạo file có tên là 30-elasticsearch-output.conf, để cấu hình output
12345678910111213# mở file ra$ sudo vim /etc/logstash/conf.d/30-elasticsearch-output.conf#copy nội dung bên dưới sau đó paste vào fileoutput {elasticsearch {hosts => ["localhost:9200"]sniffing => truemanage_template => falseindex => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"document_type => "%{[@metadata][type]}"}}
Ý nghĩa phần cấu hình output này là logstash sẽ lưu beat data vào elasticsearch.
NOTE: Nếu bạn muốn cấu hình filter cho ứng dụng khác không phải syslog thì phải chắc chắn rằng tên của các file chứa filter này phải có số thự tự nằm ở giữa (như ví dụ trên thì phải nằm đoạn 02-30)
Kiểm tra Logstash configuration.
1$ sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
Sau một vài giây, nếu mà output là “Configuration OK” thì không có lỗi gì. Còn ngược lại thì ráng đọc error log output nha. : ))
Khởi động lại Logstash, enable on boot, để các thay đổi config phía trên được apply
12$ sudo systemctl restart logstash$ sudo systemctl enable logstash
OK, Logstash listen ok rồi, giờ mình cài thêm sample kibana dashboards.
- Tạo SSL Certificates (Generate SSL Certificates)
- Load Kibana Dashboards
Elastic cung cấp một vài sample Kibana Dashboards và Beats index patterns nó có thể giúp mình tiếp cận Kibana dễ dàng hơn.
Sử dụng lệnh curl để download file đặt ở home folder.
12$ cd ~$ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.2.2.zip
Cài đặt tool unzip và tiến hành giải nén file
12$ sudo apt-get -y install unzip$ unzip beats-dashboards-*.zip
Load the sample dashboards, visualizations and Beats index patterns into Elasticsearch with these command.
12$ cd beats-dashboards-*$ ./load.sh
Các index patterns sau sẽ được load lên.
– packetbeat-*
– topbeat-*
– filebeat-*
– winlogbeat-*
Khi bắt đầu sài kibana, mình sẽ chọn filebeat index pattern làm default. - Load Filebeat Index Template In Elasticsearch
Vì trong bài viết này mình sẽ demo ship logs bằng FileBeat về ELK Server để lưu vào Elasticsearch, cho nên mình phải Load FileBeat index template để cho Elasticsearch có thể xử lý tốt các trường gửi về từ filebeat một cách tốt nhất.
Đầu tiên download filebeat index template về.
12$ cd ~$ curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
Sao đó load template lên
1$ curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
Nếu template được load thành công thì sẽ thấy output như sau.
123{"acknowledged" : true}
Ok, hiện tại thì ELK Server sẵng sàn để nhập logs ship từ FileBeat về, giờ mình đi cài đặt FileBeat trên server remote (Client Servers) để ship logs về. - Cài đặt Filebeat (Setup Filebeat – Add client servers)
- Copy SSL Certificate
Đứng từ ELK Server copy cái file certificate nãy tạo ở bước trên à. Lưu vào thư mục /tmp
1$ scp /etc/pki/tls/certs/logstash-forwarder.crt lab@10.90.0.84:/tmp
Tạo thư mục lưu và chuyển file vừa copy về vào thư mục cert mới tạo này.
12$ sudo mkdir -p /etc/pki/tls/certs$ sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
Ok, giờ tiến hành cài Filebeat package - Cài đặt FileBeat package (Install Filebeat package)
Đứng từ server remote (client servers), tạo repo filebeat để cài đặt từ package manager.
123456789$ echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list# sài GPG key giống elasticsearch, ta cài GPG key$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -# Cài đặt Filebeat$ sudo apt-get update$ sudo apt-get install filebeat
Ok, Filebeat đã cài đặt nhưng chưa được config, giờ mình sẽ cấu hình cho filebeat. - Cấu hình FileBeat (Configure FileBeat)
Phần này nếu bạn nào lười thì copy file cấu hình sẵn này bỏ vào thư mục /etc/filebeat/filebeat.yml luôn, sau đó sữa lại cái trường hosts: [“ip_elk_server:5044”], thay cái ip_elk_server bằng ip internal của ELK Server là được.
Còn nếu cấu hình từng bước để hiểu, thì ta bắt đầu cấu hình từ file config default của filebeat như sau.
Mở file cấu hình lên.
1$ sudo vim /etc/filebeat/filebeat.yml
Chú ý là file config của filebeat nó dùng yaml format, cho nên nó rất rất là quan trọng các dấu cách (space). chú ý copy hay ghỏ lại phải canh dấu cách cho chuẩn không là ăn hành.
Ở phần đầu ta thấy cái prospectors section, chổ này định nghĩa log nào được đầy về và cách sử lý. Mình sẽ cấu hình lại như sau
123456...paths:- /var/log/auth.log- /var/log/syslog# - /var/log/*.log...
Ý nghĩa phần cấu hình trên là chỉ lấy syslog và auth log thôi, còn lại comment lại hết.
Tiếp theo là tìm dòng document_type, uncomment và điền value mới cho nó là “syslog” như sau.
123...document_type: syslog...
Tiếp theo tìm phần Logstash output section. uncomment nó, sau đó trong section này uncomment cái dòng host, sau đó edit lại localhost bằng ip của ELK Server như sau.
12345### Logstash as outputlogstash:# The Logstash hostshosts: [“10.90.0.89:5044"]bulk_max_size: 1024 # add thêm dòng này nếu chưa có
Next, tìm tls section và uncomment nó. Tìm dòng certificate_authorities thay đổi value của nó thành như sau.
1234...tls:# List of root certificates for HTTPS server verificationscertificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
Ok, bây giờ Filebeat đã sử dụng SSL của ELK Server tạo lúc đầu.
Lưu lại và thoát.
Restart lại Filebeat
12$ sudo systemctl restart filebeat$ sudo systemctl enable filebeat
Nếu bạn không chắc cấu hình chính xác thì quay lại bước đầu của phần này lấy cái file temp của mình up lên à. check lại cấu hình. 😀 - Kiểm tra Filebeat sau khi cài đặt (Test FileBeat installation)
Trên ELK Server, kiểm tra kiểm tra xem Elasticsearch có nhận được data chưa, bằng cách query filebeat index với command.
1$ curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
Nếu mà thành công thì nó sẽ phụt ra một đống result như này.
123456789101112131415……..{"_index" : "filebeat-2018.08.05","_type" : "syslog","_id" : "AWUiY-p6OOsWPf7K0Tot","_score" : 1.0,"_source" : {"message" : "Aug 5 11:45:08 lab sshd[9413]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.142 user=root","@version" : "1","@timestamp" : "2018-08-05T15:45:08.000Z","beat" : {"hostname" : "lab","name" : "lab"}……..
Nếu mà không có output ra như vậy thì check lại xem lỗi đâu, lần mò lại thử.
- Copy SSL Certificate
- Kiểm tra lại Kibana
Ok hết rồi giờ login vào domain docker.wikivps.net với thông tin tài khoản kibanaadmin trước đó. Sau khi login lần đầu mình sẽ chọn index patterns là filebeat-*, và set default như hình sau.Sau đó chuyển qua tab Discover, ở tab này mặt định dữ liệu load lên sẽ là 15 phút gần nhất bạn có thể thay đổi được thời gian này thành 30 phút, 1 ngày, …
Và đứng ở tab này bạn có thể search, để xử lý sự cố hệ thống hay ứng dụng của mình. ví dụ như search thông tin login user root từ syslog như sau.OK, xong rồi, nếu bạn còn nhiều client server thì cứ cài filebeat và cấu hình tương tự vậy nhé. Mình sẽ cố gắng viết thêm bài về lấy log của virtualhost webservice để theo dõi traffic web, và cố gắng viết bài về hướng dẫn sử dụng kibana về search về visualizations. Bài viết này mới chỉ là khởi đầu.
Chúc mọi người có ngày mới vui vẻ !
Chào bạn,
Bài viết của bạn khá hay nó sẽ rất hữu ích. Hiện nay xu thế với công nghệ Opensource ELK một hệ sinh thái rất hay. Mình xin đề xuất nếu có thời gian bạn có thể xem thêm các mục sau:
1) ELK Stack không dừng lại ở log có cấu trúc –> Xử lý với những log ứng dụng phi cấu trúc
2) 3 phương thức để input log trong bài này bạn đang dùng 1 cách
(cá nhân mình thì tổng hợp nó thành 3 cách sau: (1) qua Agent shiper (2) qua socket (3) qua restful)
3) Nghiên cứu mở rộng hơn tính năng của hệ sinh thái ELK
a. Ossec – wazuh (tích hợp với wazuh đóng vai trong ossec)
b. APM (application performance monitoring)
Chúc bạn thành công!!!! hy vọng VN sớm có cộng đồng của elk để cùng chia sẻ chi thức
Rất mong nhận được chia sẻ từ các bạn — [email protected]
Hi,
Cảm ơn góp ý của Đức Tú nhé, team wikivps sẽ cố gắng hết sức để viết tiếp những bài bạn gọi ý phía trên
Cảm ơn bạn.
Chao ban,
Xin php hoi ban vai cau hoi:
1,Minh vao docker.wikivps.net khong duoc, nhung khi minh vao localhost:5601 thi lai vao duoc dashboard kibana.
2. trong phan 8 : Cài đặt Filebeat (Setup Filebeat – Add client servers)
minh se phai cai tren nhieu may khac nhau co ket noi mang voi nhau hay the nao?
cam on ban
Hi Bạn,
Cảm ơn bạn đã đặt câu hỏi, mình xin trả lời như sau.
1. Nếu bạn setup ELK trên máy tính bạn (local) và nếu bạn muốn dùng domain docker.wikivps.net của mình luôn thì bạn phải trỏ domain bằng file hosts trên máy tính bạn (phần này thì bạn kham khảo trên google thêm nha), còn nếu bạn setup với srv có ip public thì bạn nên lấy domain của riêng bạn thay cho docker.wikivps.net nha.
2. Máy nào bạn muốn đẩy log về server để phân tích thì bạn cài Filebeat lên máy đó và cấu hình loại log mà bạn cần ship về nhé. trong bài mình ship syslog về à.
Hy vọng câu trả lời giúp ít được cho bạn, bạn có thể pm skype, fanpage, group, để được hổ trợ tốt hơn nhé.
Hi Đạt
Cảm ơn Bạn vì bài viết rất hay và chi tiết. Trong phần Filebeat Đạt chỉ ship syslog, vậy Cho Tuấn hỏi là: ngoài syslog ra còn ship được cái gì nữa trong Filebeat?? Hay có tài liệu nào nói về các thành phần có thể ship về từ filebeat. Cảm ơn Đạt và Team wikivps.net nhiều lắm. Mong hồi âm từ Đạt
Có thể cho mình hỏi là Filebeat sẽ được cài trên con server dùng để đẩy log về ELK master phải ko ạ ? Vậy thì mình có cần phải cài đặt Filebeat trên ELK master ko ạ ? Mình cảm ơn !