Cài đặt ELK 6.x logs stack để đẩy log

1
3395

Môi trường thực hiện:

+ Centos 7 on GCE

+ 1 Core 4GB RAM

+ ELK 6.4.2 (vì mới có cờ rách X-pack bản này :D)

+ Cài đặt tất cả trên 1 server, không có cluster, không sử dụng Broker nào như Redis hay Kafka

Download:

+ Kibana: https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.rpm

+ Elasticsearch: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.rpm

+ Logstash: https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.deb

  1. Cài đặt

Bước 1: cài đặt Java jdk-8u181-linux-x64.rpm (search google download về)

Bước 2: Cài đặt các gói rpm của E – L – K

rpm -ivh elasticsearch-6.4.2.rpm kibana-6.4.2-x86_64.rpm logstash-6.4.2.rpm

Bước 3: Start các dịch vụ elasticsearch, logstash, kibana lên

systemctl start elasticsearch
systemctl start kibana
systemctl start logstash

systemctl enable elasticsearch
systemctl enable kibana
systemctl enable logstash

Bước 4: Cài đặt Nginx để làm proxy cho Kibana:

yum install nginx

Tạo vhost cho nginx:

upstream kibana {
        server localhost:5601 weight=3 max_fails=3 fail_timeout=10s;
        least_conn;
}

server {
        listen 80;
        server_name logs.domain.com;
        access_log /var/log/nginx/kibana.access.log main;
        error_log /var/log/nginx/kibana.error.log;
        underscores_in_headers on;

        #Denied Google Index
        add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

location / {

	proxy_pass http://kibana;
        proxy_send_timeout 30s;
        proxy_connect_timeout 30s;
        proxy_read_timeout 30s;

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_buffering on;
        proxy_buffers 100 4k;
        proxy_buffer_size 128k;

        index index.html index.php;
        }

    gzip off;

}

Start nginx và truy cập vào IP/domain của server

2. Cấu hình bảo mật và X-pack

Mặc định trong phiên bản Elasticsearch 6 đã có sẵn X-pack không cần cài thêm như các bản trước. Tuy nhiên nó bị tắt đi, để bật thì sửa file

nano /etc/elasticsearch/elasticsearch.yml

Thêm dòng

xpack.security.enabled: true

Restart elasticsearch

Đổi mật khẩu cho các user mặc định (Build-in users):

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

Sửa config Kibana để bật Secure và thêm đường dẫn Elasticsearch:

nano /etc/kibana/kibana.yml

Thêm các dòng sau:

xpack.security.enabled: true

elasticsearch:
  url: "http://localhost:9200"
  preserveHost: true
  username: "elastic"
  password: "Pass-da-dat-o-buoc-tren"

Restart Kibana

Bây giờ đăng nhập vào Kibana cần phải có user/pass. Hãy sử dụng user elastic là superuser với pass bạn đã đặt ở bước trên.

3. Đẩy thử log lên ELK

Bước 1: dưới client

Ở đây mình đẩy log của Laravel lên cho dev có thể check mà không cần đòi vào server nữa

Đẩy log theo từng domain, mỗi domain là 1 Index Pattern cho dễ theo dõi và phân quyền view cho dev

Ở server log cần cài đặt Filebeat để đẩy log lên:

Download: https://www.elastic.co/downloads/beats/filebeat

Sửa file /etc/filebeat/filebeat.yml

##### filebeat.yml
path.home: /usr/share/filebeat
path.config: /etc/filebeat
path.data: /var/lib/filebeat
path.logs: /var/log/filebeat

filebeat.registry_file: /var/lib/filebeat/registry

filebeat.config.prospectors:
  enabled: true
  path: ${path.config}/conf.d/*.yml

output.logstash:
  hosts: ["35.229.132.206:5055"]

setup.template:
  enabled: false

Với 35.229.132.206:5055 là IP và port logstash của server ELK

Tạo file cho domain cần đẩy log (chia mỗi domain một file cấu hình riêng cho dễ quản lý) trong /etc/filebeat/conf.d/domain1.yml

- type: log
  enabled: true
  paths:
   - /data/www/domain.vn/storage/logs/*.log
  fields:
    domain: domain.vn
    log_type: php-framework
  fields_under_root: true
  exclude_files: ['worker.log$']
  multiline:
   pattern: '^\['
   negate: true
   match: after

Restart filebeat

Bước 2: trên server ELK

Tạo 1 file config cho logstash trong /etc/logstash/conf.d/php-framework.conf

input {
beats {
    port => 5055
 }
}

filter {
    if [log_type] == "php-framework" {

        grok {
            match => { "message" => "\[%{TIMESTAMP_ISO8601}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:info}" }
        }

       mutate {
            remove_field => ["info"]
            remove_field => ["beat.name"]
            remove_field => ["host"]
            remove_field => ["tags"]
            remove_field => ["@version"]
        }
    }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "%{domain}"
    manage_template => false
  }
}

Lưu ý: php-framwork là name mình đặt cho loại log Laravel, ở dưới filebeat phải trùng với trên server để nó filter được đúng

Port 5055: trùng với port đã cấu hình ở filebeat

            match => { "message" => "\[%{TIMESTAMP_ISO8601}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:info}" }

Đây là grok để filter log, cụ thể ở đây mình chỉ filter ra time, ENV, severity của log

Restart logstash

Bước 3: Add Index trên Kibana để view log:

Đăng nhập vào Kibana > Management > Index Patterns

Gõ domain của log vào ô trên, nếu báo Success thì ngon luôn

Ở step kế tiếp chọn @timestamp để list theo time và Create index pattern

Mục Discovery sẽ xem được log
Có thể sử dụng mục Management > Security với User, Roles để tạo user, phân quyền cho từng user nào được xem index domain nào…
Cấu hình tắt Replica
Nếu bạn chỉ có 1 server duy nhất (không sử dụng Cluster cho Elasticsearch) thì bạn nên tắt Replica để tiết kiệm dung lượng và truy vấn nhanh hơn.
Mặc định, mỗi index được đẩy vào Elasticsearch sẽ được tạo ra 5 shards với 1 primary và 4 replica. Do bạn chỉ có 1 elasticsearch nên 4 mảnh kia sẽ luôn báo Unassigned khiến cho Status health báo vàng.
Để tắt, vào mục dev tool chạy Query sau:
POST _template/default
{
    "order" : -1,
    "index_patterns" : [
      "*"
    ],
    "settings" : {
      "index" : {
        "number_of_shards" : "1",
        "number_of_replicas" : "0"
      }
    },
    "mappings" : { },
    "aliases" : { }
  }

Như vậy những index sau này đẩy lên sẽ không báo vàng nữa và chỉ có 1 shard

1 COMMENT

LEAVE A REPLY

Please enter your comment!
Please enter your name here