Monitoring Log Menggunakan ELK

Post a Comment

ELK merupakan penggabungan dari 3 proyek opensource (log management) yakni
Elasticsearch : merupakan search analystik engine berbasis json
Longstash : saluran pemrosesan data mentah server dari beberapa sumber secara bersamaan, kemudian dikirimkan data tersebut ke stash seperti elasticsearch
Kibana : visualisasi data dengan grafik dari elastic

Log tersentralisasi sangat berguna jika suatu saat seorang DevOps akan melakukan identifikasi masalah pada server atau aplikasi. Hal tersebut membuat mereka mampu mencari histori data atau log dari source manapun.

Beberapa Komponen yang harus di perhatikan:
1. Filebeat : berfungsi untuk mengumpulkan dan mengirimkan data log ke dalam Logstash.
2. metricbeat : mengumpulkan metrik dari sistem dan layanan
3. hearbeat : monitoring layanan yang tersedia seprti CPu dan Memory
4. Packetbeat: mengumpulkan dan menganalisis data dalam jaringan.
5. Winlogbeat: mengumpulkan log kejadian pada Windows.
6. Auditbeat: mengumpulkan data kerangka audit Linux dan memantau integritas file.

Cara Kerja

Melihat diagram di atas dapat disimpulkan bahwa log dari seluruh perangkat yang ada di infrastruktur IT dikumpulkan oleh Filebeat untuk dikirim ke Logstash. Kemudian, Logstash akan memproses dan mengindeks log ke Elasticsearch agar dapat dicari oleh user dan dapat divisualisasikan melalui Kibana.

NB: Java diperlukan untuk mengistall Elastik stack. Elasticsearch memerlukan Java 8, dianjurkan untuk menggunakan Oracle JDK 1.8. Kita akan menginstal Java 8 dari paket rpm Oracle resmi.
(penulis menggunakan OpenSuSe)

zypper search java
zypper in  java-1_8_0-openjdk  

java -version
openjdk version "1.8.0_275"

======Instalasi======
1. Tambahkan repository dan install

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
nano /etc/zypp/repos.d/elasticsearch.repo

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

zypper search (package) #konfirmasi bahwa ke3 package tersebut ada 
zypper search kibana

zypper in (package)
zypper in kibana
zypper in elasticsearch
zypper in logstash
zypper in filebeat
zypper in metricbeat
zypper in heartbeat

2. Setting pada elasticsearch
sudo nano /etc/elasticsearch/elasticsearch.yml

cari parameter
. . .
network.host: localhost
. . .
node.name: localhost (ganti sesuai dengan hostname)
. . .

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
sudo systemctl status elasticsearch

curl -X GET "localhost:9200"

3. Setting kibana
sudo systemctl enable kibana
sudo systemctl start kibana

berhubung kibana menggunakan port maka perlu di setting untuk reverse proxy
kali ini penulis menggunakan web service nginx (nginx.conf)

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;
    }
}

sudo nginx -t
syntax is ok
sudo systemctl restart nginx
sudo systemctl status kibana
http://your_server_ip/status

4. Setting logstash
sudo nano /etc/logstash/conf.d/02-beats-input.conf

input {
  beats {
    port => 5044
  }
}

sudo nano /etc/logstash/conf.d/10-syslog-filter.conf

filter {
  if [fileset][module] == "system" {
    if [fileset][name] == "auth" {
      grok {
        match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$",
                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }
        pattern_definitions => {
          "GREEDYMULTILINE"=> "(.|\n)*"
        }
        remove_field => "message"
      }
      date {
        match => [ "[system][auth][timestamp]", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
      }
      geoip {
        source => "[system][auth][ssh][ip]"
        target => "[system][auth][ssh][geoip]"
      }
    }
    else if [fileset][name] == "syslog" {
      grok {
        match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
        pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
        remove_field => "message"
      }
      date {
        match => [ "[system][syslog][timestamp]", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
      }
    }
  }
}

sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    manage_template => false
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
Configuration OK 
sudo systemctl start logstash
sudo systemctl enable logstash
sudo systemctl status logstash

5. Setting filebeat
sudo nano /etc/filebeat/filebeat.yml
...
#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]
...
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

masukkan log yang akan di input ke kibana

sudo filebeat modules enable system
sudo filebeat modules list
Output
Enabled:
system

Disabled:
apache2
auditd
elasticsearch
kibana
logstash
....

sudo systemctl start filebeat
sudo systemctl enable filebeat
sudo systemctl status filebeat

6. setting heartbeat
nano /etc/heartbeat/heartbeat.yml
. . .
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
. . .
sudo systemctl start heartbeat
sudo systemctl enable heartbeat
sudo systemctl status heartbeat

7. setting metricbeat
nano /etc/metricbeat/metricbeat.yml
. . .
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
. . .
sudo systemctl start metricbeat
sudo systemctl enable metricbeat
sudo systemctl status metricbeat

8. pengoperasian pada dashboard kibana
Cek file 






tambahkan index tersebut untuk di tampilakan ke discover kibana


setelah di tambahkan maka akan muncul di discover
lalu sesuaikan type file nya yang nanti nya akan di explore ke dashboard, selanjut nya tinggal save dan kasih nama untuk dashboard nya

9. Troubleshooting
Dalam hal ini penulis akan menunjukkan bagaimana sistem dari pada ELK itu kita kita kurang memberikan settingan, by default akan menampilkan indikator dimana contoh nya sudah saya kasih kotak, tinggal di klik lalu akan di arahkan ke panduan, selain itu jika kita sudah merasaa bahwa semua yang kita setting sudah sesuai maka bisa di coba untuk reinstall paket nya

Sekian, terimakasih :)

Related Posts

Post a Comment