How to do a basic install of an ELK stack on Ubuntu for log stashing?
Use a machine with at least 4GiB of RAM. This guide will install ElasticSearch, Logstash and Kibana all on the same machine, so this is suited only for a small-scale setup.
Warning: ELK is under contant development, and this guide is probably out of date now…
Install and configure ElasticSearch
$ sudo apt install apt-transport-https software-properties-common wget
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt update
$ sudo apt install oracle-java8-installer
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt update
$ sudo apt install elasticsearch
$ sudo systemctl enable elasticsearch
$ sudo systemctl start elasticsearchThen edit /etc/elasticsearch/elasticsearch.yml and do the following:
- Set node.nameto something descriptive
- Set cluster.nameto something unique to avoid issues with auto-discovery
- Set network.hostto “localhost”
- Change path.dataandpath.logsif necessary
Edit /etc/elasticsearch/jvm.options and set the heap size according
to your machine RAM, for example (to set it to 2GiB):
-Xms2g
-Xmx2gProbably the easiest is to divide the available RAM by 4 and take that figure for each service (ElasticSearch, Logstash and Kibana, with the rest for the OS).
A setting of 1GiB is probably the minimum you should use.
Make sure you disable swapping!
Install and configure Kibana
Run this: $ sudo apt install kibana. Then edit
/etc/kibana/kibana.yml
and set server.host to “localhost”. Then:
$ sudo systemctl enable kibana
$ sudo systemctl start kibanaCreate a DNS entry for your kibana host and an SSL certificate.
Install nginx as reverse proxy with authentication:
$ sudo apt install nginx
$ sudo rm /etc/nginx/sites-enabled/default
$ echo "admin:$(openssl passwd -apr1 PASSWORD)" | sudo tee -a /etc/nginx/kibana.htpasswdThen edit an nginx site file (eg: /etc/nginx/sites-available/kibana)
and make it look like this:
server {
    listen 80 default_server;
    server_name _;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 default_server ssl http2;
    server_name _;
    ssl_certificate /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOURDOMAIN/privkey.pem;
    auth_basic "My Kibana";
    auth_basic_user_file /etc/nginx/kibana.htpasswd;
    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;
    }
}Activate the site like so:
$ sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana
$ sudo nginx -t
$ sudo systemctl reload nginxInstall and configure logstash
Just run: $ sudo apt install logstash. Edit
/etc/logstash/jvm.options and set the heap size according to your
machine RAM, for example (to set it to 2GiB):
-Xms2g
-Xmx2gA setting of 1GiB is probably the minimum you should use. Create a
file /etc/logstash/conf.d/GIVE_ME_A_NAME.conf and edit it so it
looks like this:
input {
    beats {
        port => "5044"
    }
}
filter {
    if [fields][log_type] == "apache-access" {
        grok {
            match => { "message" => "%{IPORHOST:vhost}:%{NUMBER:vhost_port} %{COMBINEDAPACHELOG}" }
        }
        geoip {
            source => "clientip"
        }
    } else if [fields][log_type] == "apache-error" {
       grok {
           match => { "message" => "%{IPORHOST:vhost} \[%{TIMESTAMP_ISO8601:timestamp}\] \[%{DATA:module}:%{LOGLEVEL}\] \[pid: %{POSINT:pid}:tid %{DATA:tid}\] \[OS error: %{DATA:oserror}\] \[client %{DATA:clientip}\] %{GREEDYDATA:error_message}" }
       }
       geoip {
           source => "clientip"
       }
    }
}
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
        index => "%{[fields][log_type]}-%{+YYYYMMdd}"
    }
}Then run:
$ sudo systemctl restart logstashNB: The grok patterns assume the following log formats for apache:
ErrorLogFormat "%-v [%{cu}t] [%-m:%l] [pid: %-P:tid %-T] [OS error: %-E] [client %-a] %M"
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedNB: You can use this to test your grok patterns.
Install and configure filebeat
Filebeat goes on the machine where your service is running, not the ELK machine.
To install filebeat:
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt update
$ sudo apt install filebeatThen edit /etc/filebeat/filebeat.yml so it looks like this:
filebeat.inputs:
- type: log
  paths:
  - /var/log/apache2/access.log
  fields:
    log_type: apache-access
- type: log
  paths:
  - /var/log/apache2/error.log
  fields:
    log_type: apache-error
output.logstash:
  hosts: ["ELK_HOSTNAME_OR_IP:5044"]
output.console:
  pretty: trueThen run:
$ sudo systemctl restart filebeatYou should have a working system now.