Elastic Stack terdiri dari 3 aplikasi yaitu Elasticsearch, Kibana dan Logstash. Masing-masing memiliki peran tersendiri, tetapi bagian utama ada Elasticsearch. Elasticsearch sendiri merupakan tempat dimana data disimpan, kibana tempat menampilkan visual dari data elasticsearch dan logstash alat untuk mengirim data ke Elasticsearch.
Dalam penggunaannya Elastic Stack kadang sudah tidak cukup lagi bila hanya menggunakan 1 server, untuk itulah Elastic sudah support untuk banyak server atau cluster. Di tutorial ini akan dibahas cara untuk menginstall 3 server cluster Elastic Stack.
Agar cluster ini berjalan dengan normal, ada baiknya menggunakan spesifikasi server minimal
2 Core
8 GB Memory
40 GB SSD/HD
Anggap kita akan menggunakan IP berikut dengan hostname masing-masing untuk server
10.0.0.1 elastic-stack-1 10.0.0.2 elastic-stack-2 10.0.0.3 elastic-stack-3
ganti 10.0.0.*
dengan IP Server yang digunakan. Masuk ke ketiga /etc/hosts
. Pembagiannya sebagai berikut
elastic-stack-1 akan digunakan sebagai Master.
elastic-stack-2, elastic-stack-3 sebagai Data
Setting Timezone
Setting time zone dengan timedatectl. Zona waktu atau timezone ini penting untuk di setting, agar semua server menggunakan zona waktu yang sama
timedatectl set-ntp true timedatectl set-timezone "Asia/Jakarta"
Update System
Update dan upgrade semua package yang terinstall di Debian 10. Cara ini adalah salah satu aspek penting dalam mengelola server agar server yang digunakan tetap aman dan upto date
apt update
apt upgrade -y
Install Elasticsearch
Di tahapn instalasi Elasticsearch akan dibagi menjadi beberapa tahap agar memudahkan, dan disertai penjelasan singkat. Kecuali disebutkan perintah dibawah ini dijalankan di semua server dalam cluster Elasticsearch
Install Dependency
Dependency ini untuk memudahkan instalasi dan testing elastic nanti setelah selesai di install. curl nanti digunakan untuk testing hasil install
sudo apt install curl wget gnupg unzip -y
Install Java 11
Karena Elasticsearch dibuat dengan Java kita harus menginstall Java JRE agar aplikasi tersebut bisa dijalankan.
sudo apt install openjdk-11-jre -y
Install Repository Elasticsearch
Di repository Debian tidak ada elasticsearch, untuk itu kita akan menggunakn repository yang disediakan oleh Elastic sendiri, repository ini selalu di update dengan versi terbaru.
Karena repository dari pihak ketiga, maka kita perlu menginstall key yang digunakan untuk validasi file yang akan diambil dari repository tersebut.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
tambah repository elasticsearch
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
update metadata repository Debian, agar repository Elasticsearch bisa dikenali
apt update
Install Elasticsearch
Setelah semua selesai, sekarang install Elasticsearch. Cukup dengan menggunakan apt karena kita sudah menambah repositori sebelumnya.
sudo apt install elasticsearch -y
Disini kita akan melakukan konfigurasi di masing-masing server, perbedaan antar konfigurasinya hanya sedikit, tapi penting agar proses instalasi berjalan lancar dan bisa digunakan.
Mengamankan Elasticsearch dengan SSL
Proses ini dijalankan di server master (elastic-stack-1), dan hanya perlu dijalankan sekali. Untuk mengamankan Elasticsearch kita akan mewajibkan penggunaan SSL untuk koneksi ke service Elasticsearch, jadi agar bisa menggunakan Elasticsearch, Kibana dan Logstash harus menggunakan SSL.
Buat instances.yml di /tmp
dengan isi
instances: - name: 'elastic-stack-1' dns: ['elastic-stack-1'] ip: ['10.0.0.1'] - name: 'elastic-stack-2' dns: ['elastic-stack-2'] ip: ['10.0.0.2'] - name: 'elastic-stack-3' dns: ['elastic-stack-3'] ip: ['10.0.0.2']
jumlah data tersebut, sesuai dengan jumlah server dan hostname yang digunakannya.
generate SSL untuk ketiga server tersebut, perintah ini hanya dijalankan dari salah satu server, disini dijalankan dari elastic-stack-1
/usr/share/elasticsearch/bin/elasticsearch-certutil cert –keep-ca-key ca –pem –in /tmp/instances.yml –out /tmp/certs.zip
SSL yang digenerate disimpan di file /tmp/certs.zip
, kirim file ini ke server elastic-stack-2 dan elastic-stack-3
scp /tmp/certs.zip user@elastic-stack-2:/tmp/ scp /tmp/certs.zip user@elastic-stack-3:/tmp/
Buat folder menyimpan SSL tersebut di ketiga server
mkdir /etc/elasticsearch/certs
ekstrak file certs.zip tersebut
unzip /tmp/certs.zip -d /etc/elasticsearch/certs/
Konfigurasi Elasticsearch
Backup konfigurasi elasticsearch, lalu buat baru sesuai dengan konfigurasi masing-masing server
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.ori rm -f /etc/elasticsearch/elasticsearch.yml
elastic-stack-1 (master)
node.name: elastic-stack-1 node.master: true network.host: 10.0.0.1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch http.port: 9200 cluster.initial_master_nodes: [elastic-stack-1] discovery.seed_hosts: ["elastic-stack-1", "elastic-stack-2", "elastic-stack-3"] xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.key: certs/elastic-stack-1/elastic-stack-1.key xpack.security.transport.ssl.certificate: certs/elastic-stack-1/elastic-stack-1.crt xpack.security.transport.ssl.certificate_authorities: [ "certs/ca/ca.crt" ] xpack.security.http.ssl.enabled: true xpack.security.http.ssl.key: certs/elastic-stack-1/elastic-stack-1.key xpack.security.http.ssl.certificate: certs/elastic-stack-1/elastic-stack-1.crt xpack.security.http.ssl.certificate_authorities: [ "certs/ca/ca.crt" ]
elastic-stack-2
node.name: elastic-stack-2 node.data: true network.host: 10.0.0.2 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch http.port: 9200 cluster.initial_master_nodes: [elastic-stack-1] discovery.seed_hosts: ["elastic-stack-1", "elastic-stack-2", "elastic-stack-3"] xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.key: certs/elastic-stack-2/elastic-stack-2.key xpack.security.transport.ssl.certificate: certs/elastic-stack-2/elastic-stack-2.crt xpack.security.transport.ssl.certificate_authorities: [ "certs/ca/ca.crt" ] xpack.security.http.ssl.enabled: true xpack.security.http.ssl.key: certs/elastic-stack-2/elastic-stack-2.key xpack.security.http.ssl.certificate: certs/elastic-stack-2/elastic-stack-2.crt xpack.security.http.ssl.certificate_authorities: [ "certs/ca/ca.crt" ]
elastic-stack-3
node.name: elastic-stack-3 node.master: true network.host: 10.0.0.3 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch http.port: 9200 cluster.initial_master_nodes: [elastic-stack-1] discovery.seed_hosts: ["elastic-stack-1", "elastic-stack-2", "elastic-stack-3"] xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.key: certs/elastic-stack-3/elastic-stack-3.key xpack.security.transport.ssl.certificate: certs/elastic-stack-3/elastic-stack-3.crt xpack.security.transport.ssl.certificate_authorities: [ "certs/ca/ca.crt" ] xpack.security.http.ssl.enabled: true xpack.security.http.ssl.key: certs/elastic-stack-3/elastic-stack-3.key xpack.security.http.ssl.certificate: certs/elastic-stack-3/elastic-stack-3.crt xpack.security.http.ssl.certificate_authorities: [ "certs/ca/ca.crt" ]
setelah merubah konfiguras elasticsearch restart servicenya, dimulai dari server elastic-stack-1
systemctl restart elasticsearch
Setting Password
Password disini digunakan untuk mengamankan service Elastic Stack. Ada beberapa user yang akan disetting passwordnya.
Jalankan hanya dari elastic-stack-1
(master)
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
agar lebih aman, gunakan password yang berbeda untuk tiap user
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]y Enter password for [elastic]: Reenter password for [elastic]: Enter password for [apm_system]: Reenter password for [apm_system]: Enter password for [kibana_system]: Reenter password for [kibana_system]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Enter password for [beats_system]: Reenter password for [beats_system]: Enter password for [remote_monitoring_user]: Reenter password for [remote_monitoring_user]: Changed password for user [apm_system] Changed password for user [kibana_system] Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [beats_system] Changed password for user [remote_monitoring_user] Changed password for user [elastic]
Tes Elasticsearch
Karena sudah menggunakan TLS/SSL, elasticsearch hanya bisa diakses dengan https://ip:port
, contoh
curl -k -s https://elastic-stack-1:9200
outputnya
{ "error": { "root_cause": [ { "type": "security_exception", "reason": "missing authentication credentials for REST request [/]", "header": { "WWW-Authenticate": [ "Basic realm=\"security\" charset=\"UTF-8\"", "Bearer realm=\"security\"", "ApiKey" ] } } ], "type": "security_exception", "reason": "missing authentication credentials for REST request [/]", "header": { "WWW-Authenticate": [ "Basic realm=\"security\" charset=\"UTF-8\"", "Bearer realm=\"security\"", "ApiKey" ] } }, "status": 401 }
sekarang gunakan password yang tadi dibuat untuk user elastic, contoh passwordnya nwJ2qv57SWrTqXZx
curl -k -s -u elastic:nwJ2qv57SWrTqXZx https://elastic-stack-1:9200 # output { "name" : "elastic-stack-1", "cluster_name" : "elasticsearch", "cluster_uuid" : "CDc0l2X8SduqoWQKHjTUmA", "version" : { "number" : "7.11.1", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "ff17057114c2199c9c1bbecc727003a907c0db7a", "build_date" : "2021-02-15T13:44:09.394032Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
cek status cluster ke _cluster/health?pretty
curl -k -s -u elastic:nwJ2qv57SWrTqXZx https://elastic-stack-1:9200/_cluster/health?pretty # output { "cluster_name" : "elasticsearch", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, "active_primary_shards" : 1, "active_shards" : 2, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
Install Kibana
Di server master kita akan menginstall Kibana, di server yang lain tidak perlu di install.
apt install kibana -y
Ubah konfigurasi Kibana di /etc/kibana/kibana.yml
sesuaikan nilainya
server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["https://elastic-stack-1:9200"] elasticsearch.username: "kibana_system" elasticsearch.password: "pass" #password yang tadi dibuat elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/certs/ca/ca.crt" ]
Bila dilihat diatas, kita menambahkan satu baris untuk CA ke folder /etc/kibana/certs/
, file CA ini digunakan untuk berkomunikasi dengan Elasticsearch, karena di folder /etc/elasticsearch tidak bisa diakses langsung oleh Kibana dengan user kibana, maka file tersebut di copy ke folder kibana
mkdir /etc/kibana/certs cp -r /etc/elasticsearch/certs/ca /etc/kibana/certs/
Restart service kibana, untuk mengaplikasikan perubahan tersebut
systemctl restart kibana
Kibana menggunakan port 5601, buka http://ip-server:5601
untuk loginnya sendiri gunakan user elastic dan password yang sudah dibuat sebelumnya.
Install Logstash
Untuk logstash, install langsung dengan
sudo apt install logstash -y
Sebagai contoh kita akan mengirim log syslog ke Elasticsearch dengan bantuan logstash, buat file /etc/logstash/conf.d/syslogs.conf
input { tcp { port => 5000 type => syslog } udp { port => 5000 type => 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}" ] } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } output { elasticsearch { hosts => ["https://elastic-stack-1:9200"] cacert => '/etc/logstash/certs/ca/ca.crt' user => 'elastic' password => 'JpBb4df0qTYuZF0D' } stdout { codec => rubydebug } }
copy file CA dari elasticsearch
mkdir /etc/logstash/certs/ cp -r /etc/elasticsearch/certs/ca /etc/logstash/certs/
Mengaktifkan Service Setelah Booting
Jangan lupa menjalankan service Elasticsearch, Kibana dan Logstash setelah booting/restart.
systemctl enable elasticsearch systemctl enable kibana systemctl enable logstash
Troubleshooting
Beberapa teknik troubleshooting yang bisa digunakan
1. Cek open port
ss -tunlp
2. Cek status service
systemctl status elasticsearch
3. Cek log service
tail -f /var/log/elasticsearch/elasticsearch.log tail -f /var/log/kibana/kibana.log
4. Cek firewall
iptables -L iptables -L -t nat