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.
login ke service kibana

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

Leave a comment

Your email address will not be published. Required fields are marked *