Nous allons décrire dans ce billet l’installation et le paramétrage de ELK, Elastic, Logstash et Kibana, sur des boites Debian avec Logstash en “cluster”. La configuration visée est l’installation de ELK sur un “serveur” et celle de Logstash Forwarder (appelé auparavant Lumberjack) sur d’autres boites Linux dont nous souhaitons analyser les logs. Le serveur Web front sera un serveur NGinx.

Dans cet exemple, nous allons créer deux types de logs (au sens Logstash), le type “syslog” pour les logs du système et le tyype “nginx-access” pour les logs d’accès aux serveurs NGinx.

L’avantage d’utiliser Logstash Forwarder sur les postes client, plutôt que Logstash, est de centraliser les filtres et les patterns et d’en simplifier la maintenance, ainsi que pour les points suivants :

  • Est beaucoup plus léger (écrit en Go et donc nul besoin de JVM)
  • Utilise un algorithme de compression des données
  • Utilise de l’encryption pour envoyer les données sur le réseau

Préambule

Logstash utilise Java, il est donc nécessaire qu’un JDK soit installé sur le “serveur”. Vous pouvez utiliser au choix OpenJDK ou Oracle JDK. Par exemple:

sudo apt-get install openjdk-7-jre  

Installer Elastic

wget -qO - https://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add - echo "deb http://packages.elasticsearch.org/elasticsearch/1.5/debian stable main" | sudo tee -a /etc/apt/sources.list sudo apt-get update sudo apt-get install elasticsearch  

Paramétrer Elastic

Editer le fichier de configuration de Elastic, /etc/elasticsearch/elasticsearch.yml, et modifier, à minima, les éléments suivants:

Modifier le nom de cluster:

cluster.name: elasticsearch  

Arrêter le Multicast:

discovery.zen.ping.multicast.enabled: false  

Paramétrer NGinx

Normalement Elastic est installé et tourne  correctement avec les éléments de l’étape précédente. Nous allons néanmoins ajouter les étapes ci-dessous.

Créer un fichier de configuration NGinx pour elastic, comme par exemple:

sudo vi /etc/nginx/sites-available/elastic  

Copier le texte ci-dessous en modifiant le nom de domaine adequat

upstream elasticsearch {  
  server 127.0.0.1:9200;
  keepalive 15;
 }
 server {
  listen 80;
  server_name monelastic.monsite.com;
  return 301 https://$server_name$request_uri;
  # enforce https
 }
 server {
  listen 443 ssl;
  server_name monelastic.monsite.com;
  auth_basic "EL Restricted Access";
  auth_basic_user_file /etc/nginx/htpasswd.users;
  location / {
   proxy_pass http://elasticsearch;
   proxy_http_version 1.1;
   proxy_set_header Connection "Keep-Alive";
   proxy_set_header Proxy-Connection "Keep-Alive";
 }
}

Activer le nouveau site créé:

sudo ln -s /etc/nginx/sites-available/elastic /etc/nginx/sites-enabled/elastic  

Créer un utilisateur:

sudo htpasswd -c /etc/nginx/htpasswd.users monuser  

Redémarrer NGinx

service nginx restart  

En visitant l’URL https://monelastic.monsite.com, vous devez ensuite récupérer l’information suivante:

{ 
  "status" : 200,
  "name" : "Ebenezer Laughton",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.2",
    "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c",
    "build_timestamp" : "2015-04-27T09:21:06Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

Installer des plugins

On peut installer toutes sortes de plugins pour Elastic (cf https://www.elastic.co/guide/en/elasticsearch/client/community/current/front-ends.html ).

J’ai choisi, e,tre autres, ElasticHQ. Pour l’installer suivre les instructions à  http://www.elastichq.org/supportplugin.html, puis, avec l’installation décrite, se connecter à l’URL https://monelastic.monsite.com/plugin/HQ/

Installer & Paramétrer Kibana

Télécharger l’archive kibana et la décompresser dans le répertoire web.

cd /tmp wget https://download.elasticsearch.org/kibana/kibana/kibana-4.0.1-linux-x64.tar.gz tar xvf kibana-4.0.1-linux-x64.tar.gz . sudo cp -R kibana-4.0.1-linux-x64/* /var/www/kibana/.  

Modifier les droits:

sudo chown -R www-data:www-data/var/www/kibana sudo chown -R www-data:www-data /var/www/kibana  

Modifier le fichier update comme ceci:

cd /etc/init.d && sudo wget https://gist.githubusercontent.com/thisismitch/8b15ac909aed214ad04a/raw/bce61d85643c2dcdfbc2728c55a41dab444dca20/kibana4 sudo chmod +x /etc/init.d/kibana4 sudo update-rc.d kibana4 defaults 96 9  

Modifier le fichier de paramètres de Kibana

vi  /var/www/kibana/config/kibana.yml  

Avec les éléments ci-dessous

# Kibana is served by a back end server. This controls which port to use.
port: 5601  
# The host to bind the server to. host: "localhost"
# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://localhost:9200"  
# preserve_elasticsearch_host true will send the hostname specified in `elasticsearch`. If you set it to false,
# then the host you use to connect to *this* Kibana instance will be sent.
elasticsearch_preserve_host: true  
# Kibana uses an index in Elasticsearch to store saved searches, visualizations
# and dashboards. It will create a new index if it doesn't already exist.
kibana_index: ".kibana"  
# If your Elasticsearch is protected with basic auth, this is the user credentials
# used by the Kibana server to perform maintence on the kibana_index at statup. Your Kibana
# users will still need to authenticate with Elasticsearch (which is proxied thorugh
# the Kibana server)
# kibana_elasticsearch_username: user
# kibana_elasticsearch_password: pass
# The default application to load. default_app_id: "discover"
# Time in milliseconds to wait for responses from the back end or elasticsearch.
# This must be > 0 request_timeout: 300000
# Time in milliseconds for Elasticsearch to wait for responses from shards. # Set to 0 to disable. shard_timeout: 0
# Set to false to have a complete disregard for the validity of the SSL
# certificate. verify_ssl: false
# If you need to provide a CA certificate for your Elasticsarech instance, put
# the path of the pem file here.
# ca: /path/to/your/CA.pem
# SSL for outgoing requests from the Kibana Server (PEM formatted) # ssl_key_file: /path/to/your/server.key
# ssl_cert_file: /path/to/your/server.crt
# Set the path to where you would like the process id file to be created.
# pid_file: /var/run/kibana.pid
# Plugins that are included in the build, and no longer found in the plugins/ folder
bundled_plugin_ids:  
 - plugins/dashboard/index
 - plugins/discover/index
 - plugins/doc/index
 - plugins/kibana/index
 - plugins/markdown_vis/index
 - plugins/metric_vis/index
 - plugins/settings/index
 - plugins/table_vis/index
 - plugins/vis_types/index
 - plugins/visualize/index

Démarrer le service:

 sudo service kibana4 start

Paramétrer Nginx pour Kibana

Créer un fichier de configuration NGinx pour kibana, comme par exemple:

sudo vi /etc/nginx/sites-available/kibana  

Copier le texte ci-dessous en modifiant le nom de domaine adequat

server {  
 listen 80;
 server_name monkibana.monsite.com;
 return 301 https://$server_name$request_uri;
 # enforce https }
 server {
 listen 443 ssl;
 server_name monkibana.monsite.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;
 }
 }

Activer le nouveau site créé:

sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana  

Redémarrer NGinx

service nginx restart  

Installer Logstash Server

Installation

echo 'deb http://packages.elasticsearch.org/logstash/1.5/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get update sudo apt-get install logstash  

Installer GeoLiteCity pour la localisation

cd /etc/logstash/ sudo curl -O "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz"  
sudo gunzip GeoLiteCity.dat.gz  

Vous devez avoir maintenant un fichier /etc/logstash/GeoLiteCity.dat

Paramétrer Logstash Server

Créer les fichiers SSL

Pour cela créer, par exemple, sur le serveur un répertoire protected /etc/ssl/protected pour y mettre le fichier .key du certificat et qu’il soit accessible à l’utilisateur logstash. Ensuite, exécuter la commande:

sudo openssl req -subj '/CN=logstash_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout /etc/ssl/protected/logstash-forwarder.key -out /etc/ssl/certs/logstash-forwarder.crt  

Garder une copie du fichier /etc/ssl/certs/logstash-forwarder.crt  pour les autres machines qui viendront alimenter le “serveur” logstash.

Configurer

Créer le fichier de configuration pour le serveur

Pour la partie “input” du serveur, créer, par exemple, le fichier suivant

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf  

y ajouter les paramètres “serveur” de Logstash:

input {  
  lumberjack { 
    port => 5000 type => "logs"
    ssl_certificate => "/etc/ssl/certs/logstash-forwarder.crt"
    ssl_key => "/etc/ssl/protected/logstash-forwarder.key"
  }
}

Pour la partie “output” du serveur, créer, par exemple, le fichier suivant

sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf  

y ajouter les paramètres “serveur” de Logstash pour la connexion à Elastic:

output {  
 elasticsearch {
   host => "localhost"
   cluster => "elasticsearch"
 }
 stdout {
  codec => rubydebug
 }
}

Créer les patterns

Créer le répertoire de patterns

sudo mkdir /opt/logstash/patterns  

Créer ci dessous un fichier de pattern pour NGinx:

sudo vi /opt/logstash/patterns/nginx  

Y indiquer les patterns pour les logs NGinx, par exemple:

 NGUSERNAME [a-zA-Z\.\@\-\+_%]+
 NGUSER %{NGUSERNAME}
 NGINXACCESS %{IPORHOST:clientip}
 %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}

Changer le owner du répertoire et de son contenu:

sudo chown -R logstash:logstash /opt/logstash/patterns  

Créer les filtres

Créer un fichier de filtre pour les logs NGinx.

sudo vi /etc/logstash/conf.d/11-nginx.conf  

Et ajouter, par exemple, les filtres suivants:

filter {  
 if [type] == "nginx-access" {
   grok {
     match => { "message" => "%{NGINXACCESS}" } }
     geoip {
       source => "clientip" target => "geoip"
       database => "/etc/logstash/GeoLiteCity.dat"
       add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
       add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
   }
   mutate { convert => [ "[geoip][coordinates]", "float"] }
 }
}

Créer le fichier de configuration

On peut ajouter un fichier de configurtation pour le serveur sur lequel est installé ELK, comme par exemple:

sudo vi /etc/logstash/conf.d/logstash-broker.conf  

Ajouter les informations de paramétrage, comme les fichiers logs à inspecter (dans notre exemple, quelques fichiers systèmes et quelques fichier d’accès NGinx) et l’host de bind sur lequel se trouve Elastic.

input {  
  file {
    type => "syslog"
    path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ]
  }
  file {
    type => "nginx-access"
    path => [ "/var/log/nginx/access.log", "/var/log/nginx/site1_access.log", "/var/log/nginx/site2.access.log", "/var/log/unautrelog/access.log" ]
  }
}
  output { elasticsearch { bind_host => "localhost" } }

 Démarrer Logstash

sudo service logstash start  

Les fichiers de logs se trouvent dans le répertoire /var/log/logstash/.

Vérifier que le port 5000 de notre exemple bind bien:

netstat -atn |grep 5000  

doit retourner:

tcp6 0 0 :::5000 :::* LISTEN  

Il ne faut pas oublier d’ajouter éventuellement le port dans le Firewall du système.

Installation des clients

Installer Logstash Forwarder

sudo echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list sudo wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get update sudo apt-get install logstash-forwarder  

Si vous avez une version 32 bits de Debian (par exemple avec un Raspberry PI), vous dervriez obtenir une erreur du type “Unable to locate package logstash-forwarder”. L’installation de Logstash Forwarder doit se faire “à la main”.

Installer le certificat SSL

Créer par exemple le fichier /etc/ssl/certs/logstash-forwarder.crt et y copier le certificat généré plus haut.

Paramétrer Logstash Forwarder

Editer le fichier de configuration de logstash-forwarder

sudo vi /etc/logstash-forwarder.conf  

Modifier les éléments ci-dessous

"servers": [ "logstash_server_fqdn:5000" ],
...
"ssl ca": "/etc/ssl/certs/logstash-forwarder.crt",
...
"timeout": 15

et dans la section “files”, entre les crochets, ajouter

{
 "paths": [ "/var/log/syslog", "/var/log/auth.log" ],
 "fields": { "type": "syslog" }
 }
 {
 "paths": [ "/var/log/nginx/access.log" ],
 "fields": { "type": "nginx-access" }
 }

Démarrer Logstash Forwarder

ffff

service logstash-forwarder start  

Voilà, si tout s’est bien passé, les logs sont envoyé au serveur et on peut commencer à utiliser Kibana pour faire de la recherche etdes tableaux de bord.

Erreurs

En cas d’erreur avec le démarrage de LogStash de ce type: http://serverfault.com/questions/527706/logstash-cant-read-files-it-should-have-access-too

Utiliser la solution:

sudo vi /etc/init.d/logstash  

Et modifier

LS_GROUP=logstash  

en

LS_GROUP=adm  

Redémarrer le service

Références

https://deviantony.wordpress.com/2014/09/23/how-to-setup-an-elasticsearch-cluster-with-logstash-on-ubuntu-12-04/
https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04
http://www.foulquier.info/tutoriaux/supervision-des-logs-de-serveurs-lamp-debian-avec-elasticsearch-logstash-kibana-et-redis-elk
https://www.ddreier.com/setting-up-elasticsearch-kibana-and-logstash/
http://knowm.org/how-to-set-up-the-elk-stack-elasticsearch-logstash-and-kibana/
https://community.ulyaoth.net/threads/how-to-create-a-logstash-geoip-based-dashboard-in-kibana-3.29/
http://www.occitech.fr/blog/2015/01/monitorer-votre-serveur-apache-avec-elk/
https://home.regit.org/2014/01/a-bit-of-logstash-cooking/

Plus Loin

http://tekcollab.imdeo.com/astuces-et-retour-dexperience-sur-elasticsearch/ http://williamdurand.fr/2014/12/17/elasticsearch-logstash-kibana-with-docker/
Tester les patterns Grok: http://grokconstructor.appspot.com/do/match