Instalación + Configuración de ELK (Elasticsearch + Logstash + Kibana)

Instalación + Configuración de ELK (Elasticsearch + Logstash + Kibana)

ELK, que es la composición de Elasticsearch + Logstash + Kibana es una más que correcta solución para, por ejemplo, crear un sistema de Control de Eventos y/o Logs. Por ejemplo, si queremos monitorizar en Realtime nuestras aplicaciones o sistemas podemos implementar el Stack de ELK para embeber nuestros logs, ya sean generados por el Framework del código (Symphony, Laravel, Spring, etc…) o bien, por el log de Apache, Nginx, etc… el que corresponda a nivel de Sistema Operativo.

Instalación + Configuración de ELK (Elasticsearch + Logstash + Kibana)

Si estamos usando AWS, por ejemplo, tenemos en el marketplace diversas imágenes disponibles que nos van a permitir ponerlo en marcha muy rápidamente, por supuesto si queremos hacer una instalación desde cero, estáis en el lugar acertado. Igualmente, comparto la imagen de Bitnami en AWS Marketplace:

En mi caso voy a usar Docker para crear todo el Stack, crearé un docker para cada componente y así los tendremos separados y podremos hacer el control de versiones por separado, arrancar/parar por separado, crear imágenes, etc…

Para ir contextualizando un poco, comentar que:

Elasticsearch es un servicio de búsqueda, nos va a permitir efectuar busquedas entre los datos, por ejemplo logs, gestionados por Logstash.

Logstash en este caso, es una herramienta para la administración de logs. Se puede utilizar para recolectar, parsear y guardar los logs.

Kibana es una herramienta de visualización de datos abierta y que se nutre de la información subministrada por Elasticsearch.

Para proceder a la instalación (siempre serán las últimas versiones de todos los componentes), hagamos un breve índice de pasos:

  • Java Oracle Versión 1.8.144
  • Elasticsearch Versión 5.5.2
  • Kibana versión 5.5.2
  • Logstash Versión 5.5.2
  • Filebeat Versión 5.5.2

NOTA: Todo el proceso de instalación está basado en Ubuntu 16.04.3 LTS (Xenial Release) con usuario “root”, en caso de no tenerlo, cada command debería tener precedido “sudo” y el usuario con el que se ejecute la instalación tener permisos de “sudoer”.

NOTA 2: El proceso de instalación se realiza todo junto, aunque se debería lanzar un Docker, usando la imagen de Ubuntu de Docker Hub:, y proceder a instalar cada componente (Elasticsearch, Logstash y Kibana) por separado.

NOTA 3: Recordar que hay que publicar cada puerto que se requiera y que durante el artículo se van mencionando, como por ejemplo en el caso de Elasticsearch los 9200 y 9300.

Agregando los repositorios

JAVA

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" > /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886

Elasticsearch

echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" > /etc/apt/sources.list.d/elasticsearch-2.x.list
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add -

Logstash

echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" > /etc/apt/sources.list.d/logstash-2.3.x.list

Kibana

echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" > /etc/apt/sources.list.d/kibana-4.5.x.list

Instalación de Java Versión 8

Para facilitar la instalación de todos los paquetes, lo realizaremos con aptitude, igualmente al final del artículo se podrán descargar de la fuente directa en su versión 64bits para Ubuntu (.deb).

aptitude update
aptitude install oracle-java8-installer

Para corroborar que se ha instalado la versión correcta, en el mismo prompt podemos lanzar: java -version

Instalación de Elasticsearch

aptitude install elasticsearch

Para proceder a la configuración, mínima, nos dirigimos al Path /etc/elasticsearch para editar el fichero elasticsearch.yml. Deberemos modificar:

network.host: NUESTRA_IP_HOST_DOCKER
http.port: 9200

Reiniciaremos el servicio de Elasticsearch para que utilice la nueva configuración: /etc/init.d/elasticsearch restart

Instalación de Logstash

Para la instalación y Configuración de Logstash se recomienda hacer la conexión segura, por tanto deberemos antes generar los Certificados:

cd /etc/pki/tls
openssl req -x509 -batch -nodes -subj "/CN=HOSTNAME/" \ -days 3650 -newkey rsa:2048 -keyout private/logstash-beats.key -out certs/logstash-beats.crt

Una pequeña Leyenda al respecto:

  • CN=HOSTNAME , es el nombre de nuestro Host
  • logstash-beats.key , es el nombre de la llave privada
  • logstash-beats.crt , es el nombre del certificado

Procedamos ahora a la instalación de Logstash:

aptitude install logstash

Para la configuración, deberemos editar el fichero /etc/logstash/conf.d/syslog-logstash.conf y agregar o modificar lo siguiente:

#Secccion INPUT
input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
    ssl_key => "/etc/pki/tls/private/logstash-beats.key"
  }
}
#Secccion FILTER
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}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

#Secccion OUTPUT
output {
  elasticsearch {
    hosts => ["IP_HOST_ELASTICSEARCH:9200"]
    sniffing => true
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

Podemos corroborar que está funcionando correctamente lanzando el Command service logstash configtest y ver que responde Configuration OK.

Instalación de Kibana

aptitude install kibana

Para la configuración de Kibana, debemos editar el fichero /opt/kibana/config/kibana.yml:

server.port: 5601
server.host: "IP_HOST_KIBANA"
elasticsearch.url: "http://IP_HOST_ELASTICSEARCH:9200"

Reiniciaremos el servicio para que ejecute la nueva configuración /etc/init.d/kibana restart

Para añadir seguridad a nuestro visualizador Kibana, podemos instalar (opcional) Nginx (o Apache) donde lo usaremos como proxy reverse en Kibana:

aptitude install nginx apache2-utils

Crearemos un usuario para la autenticación ya que por defecto, Kibana, viene sin autentificación y cualquiera que sepa nuestra IP podría acceder a la visualización.

htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

Para configurar Kibana en el nuevo Site de Nginx deberemos editar el fichero /etc/nginx/sites-available/default modificando los siguientes parámetros:

server {
   listen 80;
   server_name localhost;

   auth_basic "Restricted Access";
   auth_basic_user_file /etc/nginx/htpasswd.users;

   location / {
       proxy_pass http://IP_HOST_KIBANA: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;
   }
}

Reiniciaremos el servicio de Nginx para aplciar los cambios /etc/init.d/ nginx restart

Instalación de Filebeat en “Cliente”

Si queremos recuperar los Log de un cliente, digamos una instancia de Docker o de cualquier otro servidor que tenga acceso a nuestra instalación de ELK, deberemos seguir unos pasos muy simples:

  • Agregaremos el repositorio de Filebeat: echo "deb https://packages.elastic.co/beats/apt stable main" > /etc/apt/sources.list.d/beats.list
  • Importaremos la llave del repositorio: wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add -
  • Actualizaremos nuestros repositorios: aptitude update
  • Instalaremos Filebeat: aptitude install apt-transport-https filebeat

Para realizar la configuración, deberemos editar el fichero /etc/filebeat/filebeat.yml

Hay dos partes importantes en el fichero:

  • La primera es el orígen de la información, por ejemplo, los Path de los Log que queremos enviar a Logstash. Para ello deberemos buscar la siguiente sección y añadir en “Paths” aquellas rutas absolutas de los Log que queremos, por defecto viene /var/log/*.log
filebeat:
  prospectors:
    -
      paths:
        - "/var/log/*.log"
      input_type: log
      document_type: syslog
      registry_file: /var/lib/filebeat/registry
  • La segunda es la fuente destino de los datos, es decir la conexión a Logstash, hay que decir que por defecto vendrá Elasticsearch, pero deberemos comentarlo y cambiarlo por Logstash, que está inmediatamente debajo:
# Configure what outputs to use when sending the data collected by the beat.
# Multiple outputs may be used.
output:
  logstash:
    hosts: ["IP_HOST_LOGSTASH:5044"]
    bulk_max_size: 1024
    index: filebeat
    tls:
      certificate_authorities: ["/etc/pki/tls/certs/logstash-beats.crt"]

Para verificar que funciona correctamente deberemos ejecutar filebeat -configtest -e y arrancar el servicio de Filebeat /etc/init.d/filebeat start

Como cultura general, comentar que podemos observar como se van enviando los Log si hacemos un “tail -f”, por ejemplo, al Path /var/log/filebeat/filebeat, observaremos que en realtime se van actualizando líneas y debería hacer referencia a aquellos Path que hemos introducido en nuestro fichero de configuración de Logstash.

Si todo va bien, en Kibana, tras la creación del índice de “Logstash”, deberíamos observar los primeros Logs que ya está recibiendo Elasticsearch tras pasar por Logstash.

Fuente original de los Paquetes (Elastic.co)

Autor: Joakim Vivas

comments powered by Disqus