
Saludos amigos, hoy os traigo otra serie sobre Dashboards, en este caso os quiero presentar Elastic Stack, que incluye varios componentes que harán de la tarea de monitorizar Logs, y la ingestión de datos desde aplicaciones, una tarea mucho más sencilla, además Elastic incluye el X-Pack, que nos permite funcionalidades adicionales como pueden ser el reporting, monitoring de nuestros servicios de Elastic, Alertas y mucho más.
Como esta entrada es extremadamente larga, os dejo un menú para moveros con agilidad:
- Esquema lógico de la Infraestructura
- Orden de instalación
- Requerimientos de Hardware y Software
- Instalando Elasticsearch
- Instalando Kibana
- Instalando Logstash
- Comprobar los puertos de Elastic Stack
- Instalar y configurar Filebeat en un cliente basado en Ubuntu
- Realizando la primera prueba con Kibana
Esquema lógico de la Infraestructura
Os dejo un gráfico ara que comprendamos los componentes que vamos a instalar y configurar en este laboratorio:
- Logstash: Es un servicio que se encarga de ingerir información , normalmente logs, los procesa y los transforma en información que se puede almacenar y mostrar de manera mas humana en Elasticsearch.
- Beats: Los Beats son agentes ligeros que se integran en las aplicaciones o servicios que tenemos y que mandan todo tipo de información hacía Logstash o Elasticsearch. Hay varios Beats ya disponibles como son: Logs, Metrics, Network, Windows y uptime.
- Elasticsearch: Es la pieza principal de Elastic Stack y se encarga de almacenar y realizar búsquedas de información almacenada de manera muy, muy rápida.
- Kibana: Es el Dashboard que se encarga de mostrar toda la información que Elastic Stack tiene almacenada en la Elasticsearch.
X-Pack y Elastic Cloud serán cubiertos en sus propias entradas posteriormente, con lo que estar atentos para conocer mas detalles de estas dos funcionalidades Corporativas que nos proporciona Elastic.
Orden de instalación
La recomendación de Elastic es la siguiente para conseguir un Elastic Stack perfectamente instalado, y asegurarnos que los componentes se instalan en el orden adecuado:.
- Elasticsearch
- Kibana
- Logstash
- Beats
Requerimientos de Hardware y Software
No hay unos requerimientos específicos para Elastic Stack, ya que depende de la cantidad de Logs y el tamaño de los mismos a procesar, pero para un pequeño Homelab como el mío he decidido crear una VM con:
- CPU – 4vCPU
- RAM – 8GB
- SSD – 60GB
Configurar el tamaño adecuado para vuestro entorno de Elastic Stack es una operación que debe hacerse con paciencia y planearlo sabiendo el tamaño de logs a ingerir, etc. Si tenéis dudas os recomiendo abrir un thread en los Foros de Elastic, o contactar con algún Partner recomendado, por ejemplo Seacom.
Es muy importante instalar Java antes de instalar Elasticsearch o cualquier otro componente de Elastic Stack, tan sencillo como:
sudo apt-get install default-jre
Instalando Elasticsearch
Existen varias maneras de instalar Elasticsearch, en mi caso voy a instalar todo Elastic Stack en Ubuntu 16.04 LTS. Una vez que tenemos la VM o server cloud preparado realizaremos los siguientes pasos para una instalación automática desde los repositorios oficiales de Elastic.
Añadiendo la llave PGP y Repositorios
El primer paso es importar la llave PGP en nuestro sistema
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Ahora necesitaremos instalar el paquete de transport https de la siguiente manera, es probable que en Ubuntu 16.04 LTS ya lo tengáis en todo caso:
sudo apt-get install apt-transport-https
Añadiremos los repositorios de Elastic de la siguiente manera a nuestra lista de repositorios de apt:
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
Instalación de los paquetes de Elasticsearch
Ya estamos listos para lanzar la instalación de Elasticsearch con el siguiente comando, este comando hará un update de los paquetes y procederá a la instalación de Elasticsearch:
sudo apt-get update && sudo apt-get install elasticsearch
Deberíamos ver un output similar al siguiente:
The following NEW packages will be installed: elasticsearch 0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded. Need to get 33.2 MB of archives. After this operation, 37.1 MB of additional disk space will be used. Get:1 https://artifacts.elastic.co/packages/5.x/apt stable/main amd64 elasticsearch all 5.4.0 [33.2 MB] Fetched 33.2 MB in 50s (654 kB/s) Selecting previously unselected package elasticsearch. (Reading database ... 59575 files and directories currently installed.) Preparing to unpack .../elasticsearch_5.4.0_all.deb ... Creating elasticsearch group... OK Creating elasticsearch user... OK Unpacking elasticsearch (5.4.0) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ... Setting up elasticsearch (5.4.0) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ...
SysV init vs. systemd
Elasticsearch por defecto no arranca automáticamente, por lo que tendremos que lanzar un comando u otro dependiendo de nuestro sistema, si estamos usando Ubuntu 16.04 LTS será systemd seguramente, pero para estar seguros lanzaremos el siguiente comando:
ps -p 1
Ejecutar Elasticsearch con SysV init
Si el resultado del comando anterior nos ha devuelto que estamos usando init, entonces ejecutaremos el siguiente comando:
sudo update-rc.d elasticsearch defaults 95 10
Podemos arrancar o parar el servicio con los típicos comandos:
sudo -i service elasticsearch start sudo -i service elasticsearch stop
Ejecutar Elasticsearch con systemd
Si estamos en una versión moderna de Ubuntu, seguramente el resultado del ps -p 1 será que usamos systemd, para ejecutar Elasticsearch de manera automática en cada arranque lanzaremos los siguientes comandos:
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable elasticsearch.service
Elasticsearch podrá ser arrancado con los siguientes comandos:
sudo systemctl start elasticsearch.service sudo systemctl stop elasticsearch.service
Revisar Logs de Elasticsearch en caso de fallo al ejecutarse
Si por cualquier motivo tuvieramos un error al arrancar el servicio, podremos encontrar los logs en la siguiente ubicación – /var/log/elasticsearch/
Si estamos usando systemd Elasticsearch no guarda información por defecto en el journal de systemd, por lo que hay que eliminar la opción de –quiet de la línea llamada ExectStart dentro del fichero /usr/lib/systemd/system/elasticsearch.service
ExecStart=/usr/share/elasticsearch/bin/elasticsearch \
-p ${PID_DIR}/elasticsearch.pid \
--quiet \
-Edefault.path.logs=${LOG_DIR} \
-Edefault.path.data=${DATA_DIR} \
-Edefault.path.conf=${CONF_DIR}
Una vez que hemos realizado esta operación podremos consultar directamente al journal de systemd de la siguiente manera:
sudo journalctl -f
Si queremos solamente las entradas referentes al servicio de elasticsearch ejecutaremos lo siguiente:
sudo journalctl --unit elasticsearch
Comprobar que hemos instalado correctamente Elasticsearch
Podemos ejecutar el siguiente comando para saber si tenemos nuestro Elasticsearch arriba y funcionando:
curl -i -XGET 'localhost:9200/'
Y si todo está bien, nos devolverá lo siguiente:
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 327
{
"name" : "u-pjjoX",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-lfWywfyT4aw0UXb9wGZYw",
"version" : {
"number" : "5.4.0",
"build_hash" : "780f8c4",
"build_date" : "2017-04-28T17:43:27.229Z",
"build_snapshot" : false,
"lucene_version" : "6.5.0"
},
"tagline" : "You Know, for Search"
}
Si tuvieramos cualquier error aquí, nos tendremos que ir a la sección anterior y depurar el error que tengamos.
Instalando Kibana
Una vez que hemos realizado la instalación de Elasticsearch, el resto de módulos no tienen mucho misterio, en este caso instalaremos Kibana con el siguiente comando:
sudo apt-get update && sudo apt-get install kibana
Que nos devolverá algo similar a este output:
The following NEW packages will be installed: kibana 0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded. Need to get 55.1 MB of archives. After this operation, 208 MB of additional disk space will be used. Get:1 https://artifacts.elastic.co/packages/5.x/apt stable/main amd64 kibana amd64 5.4.0 [55.1 MB] Fetched 55.1 MB in 36s (1,519 kB/s) Selecting previously unselected package kibana. (Reading database ... 62124 files and directories currently installed.) Preparing to unpack .../kibana_5.4.0_amd64.deb ... Unpacking kibana (5.4.0) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ... Setting up kibana (5.4.0) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ...
Lanzaremos ahora el comando que nos corresponda, dependiendo de init o systemd para ejecutar Kibana en el arranque del sistema, si tenéis dudas consultar la sección anterior sobre este tema, en mi caso para systemd:
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable kibana.service
Para parar y arrancar el servicio, si tenemos systemd, con los siguientes comandos:
sudo systemctl start kibana.service sudo systemctl stop kibana.service
Nos quedaría un paso importante para al menos comprobar que podemos acceder a Kibana correctamente, editaremos el fichero de confguración vi /etc/kibana/kibana.yml y cambiar la siguiente línea por un host que se pueda resolver en la red, si dejamos localhost no podremos acceder desde equipos externos:
server.port: 5601 server.host: "elastic.zimbra.io" elasticsearch.url: "http://elastic.zimbra.io:9200"
Y reiniciaremos Kibana:
sudo systemctl stop kibana.service sudo systemctl start kibana.service
Si nos vamos a esta dirección con el puerto 5206 ya podremos acceder a Kibana
Vamos a pasar al siguiente elemento ahora antes de seguir tocando nada más.
Instalando Logstash
Vamos a realizar ahora la instalación de Logtash de la siguiente manera, ya que ya tenemos el repositorio, java y demás, es tan sencillo como:
sudo apt-get update && sudo apt-get install logstash
Seguramente veamos un output similar a este:
The following NEW packages will be installed: logstash 0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded. Need to get 93.9 MB of archives. After this operation, 173 MB of additional disk space will be used. Get:1 https://artifacts.elastic.co/packages/5.x/apt stable/main amd64 logstash all 1:5.4.0-1 [93.9 MB] Fetched 93.9 MB in 1min 18s (1,191 kB/s) Selecting previously unselected package logstash. (Reading database ... 119618 files and directories currently installed.) Preparing to unpack .../logstash_1%3a5.4.0-1_all.deb ... Unpacking logstash (1:5.4.0-1) ... Setting up logstash (1:5.4.0-1) ... Using provided startup.options file: /etc/logstash/startup.options Successfully created system startup script for Logstash
Ya vimos anteriormente la diferencia entre init y systemd, por lo que en mi caso voy a ejecutar ahora el comando para que Logstash se ejecute automáticamente:
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable logstash.service
Y para arrancarlo o pararlo, los comandos de siempre, si usas systemd:
sudo systemctl start logstash.service sudo systemctl stop logstash.service
Parece que hay un pequeño bug que nos mostrará varios errores en los logs y que corregiremos antes de nada ejecutando este comando:
sudo touch /etc/logstash/conf.d/empty.conf
Creando el certificado SSL para Logstash
Logtash necesita un certificado SSL para poder ser verificado por los clientes que le envían información, podremos crear un certificado SSL de la siguiente manera, por favor recordar poner vuestro hostname en el /CN
cd /etc/logstash/ openssl req -subj /CN=elastic.zimbra.io -x509 -days 3650 -batch -nodes -newkey rsa:4096 -keyout logstash.key -out logstash.crt
Creando los ficheros de configuración
Vamos a crear ahora tres ficheros de configuración diferentes, uno para beats, otro para syslog, y el último para el output de Elasticsearch.
Vamos a empezar con el file beats, nos iremos hasta el siguiente directorio y crearemos el siguiente fichero de configuración:
cd /etc/logstash/ vi conf.d/filebeat-input.conf
E introduciremos los siguientes valores:
input {
beats {
port => 5443
type => syslog
ssl => true
ssl_certificate => "/etc/logstash/logstash.crt"
ssl_key => "/etc/logstash/logstash.key"
}
}
Crearemos ahora el fichero para syslog de la siguiente manera:
vi conf.d/syslog-filter.conf
E introduciremos lo siguiente, que basicamente usa el plugin llamado grok para hacer el parseo de los ficheros:
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}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
Y por último crearemos el fichero para el output de elasticsearch:
vi conf.d/output-elasticsearch.conf
Con el siguiente contenido:
output {
elasticsearch { hosts => ["localhost:9200"]
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
Comprobar los puertos de Elastic Stack
Realizando el siguiente comando podremos ver si tenemos todos los servicios escuchando de la manera adecuada, algunos comentarios:
- Hemos cambiado la configuración de Kibana para que escuche por la IP. Configuraremos NGINX en futuras entradas. Puerto 5601
- Elasticsearch está escuchando en el puerto 9200 y 9300
- Logstash está escuchando en el puerto 5443
root@elastic:/etc/logstash# netstat -plntu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5378/sshd tcp 0 0 192.168.1.85:5601 0.0.0.0:* LISTEN 27553/node tcp6 0 0 127.0.0.1:9200 :::* LISTEN 25943/java tcp6 0 0 ::1:9200 :::* LISTEN 25943/java tcp6 0 0 127.0.0.1:9300 :::* LISTEN 25943/java tcp6 0 0 ::1:9300 :::* LISTEN 25943/java tcp6 0 0 :::22 :::* LISTEN 5378/sshd tcp6 0 0 127.0.0.1:9600 :::* LISTEN 31301/java tcp6 0 0 :::5443 :::* LISTEN 31301/java
Instalar y configurar Filebeat en un cliente basado en Ubuntu
Ha llegado la hora de configurar un agente de Filebeat para mandar información hacía Elastic Stack, en mi caso sobre Ubuntu.
El primer paso será comprobar que podemos resolver por DNS al hostname de Elasticsearch, en mi caso al tener un server DNS para mi homelab, todo va bien, si hubiera la necesidad, se podría editar el fichero de /etc/hosts en el cliente y añadir el server de Elasticsearch de manera manual:
root@tig-monitor:/home/oper# ping elastic PING elastic.zimbra.io (192.168.1.85) 56(84) bytes of data. 64 bytes from 192.168.1.85: icmp_seq=1 ttl=64 time=0.297 ms
El tercer paso es añadir la llave PGP al cliente ubuntu:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Necesitaremos el paquete de https transport para poder descargar e instalar los paquetes de Elastic:
sudo apt-get install -y apt-transport-https
Añadiremos los repositorios de Elastic de la siguiente manera a nuestra lista de repositorios de apt:
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list sudo apt-get update
El tercer paso es instalar el paquete de beats de Elastic de la siguiente manera:
sudo apt-get install -y filebeat
El cuarto paso será copiar el certificado SSL del server de Elasticsearch en este cliente, en la carpeta que deseemos, en mi caso podéis ver que he ubicado una copia en /tmp para acceder más sencillo y con un usuario con menos privilegios, y que al final es copiado a la carpeta /etc/filebeat del cliente:
cd /etc/filebeat scp oper@elastic:/tmp/logstash.crt .
Y ahora ya podremos comenzar con la configuración del agente, editaremos el siguiente fichero:
vi /etc/filebeat/filebeat.yml
Podremos por ejemplo añadir todos los logs en el directorio de logs y los mensajes de sistema, y el tipo que estamos añadiendo en este caso syslog, debería quedar de la siguiente manera:
- input_type: log
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/messages
- /var/log/*.log
document_type: syslog
En este mismo fichero tendremos que comentar la sección de Elasticsearch, con lo que tendría que quedar de la siguiente manera:
#-------------------------- Elasticsearch output ------------------------------ #output.elasticsearch: # Array of hosts to connect to. # hosts: ["localhost:9200"]
Editaremos ahora la sección de output de Logstash que debería quedar más o menos del siguiente modo, recordar usar el hostname de vuestro Elastic Stack server, no solo eso, sino que además debe ser exacto al /CN que pusimos al crear el SSL:
#----------------------------- Logstash output -------------------------------- output.logstash: # The Logstash hosts hosts: ["elastic.zimbra.io:5443"] bulk_max_size: 2048 ssl.certificate_authorities: ["/etc/filebeat/logstash.crt"] template.name: "filebeat" template.path: "filebeat.template.json" template.overwrite: false
Y por último en la sección de Logging añadiremos un valor, de manera que quedaría así:
#================================ Logging ===================================== # Sets log level. The default log level is info. # Available log levels are: critical, error, warning, info, debug #logging.level: debug logging.metrics.period: 1m
Y ya podemos guardarlo y cerrarlo, vamos ahora a configurar beats para que se inicie al inicio y arrancaremos el servicio, en este caso al usar una versión antigua de Ubuntu, tengo que usar init, de nuevo si teneis dudas, volver al punto donde se explica init y systemd
sudo update-rc.d filebeat defaults 95 10 Adding system startup for /etc/init.d/filebeat ... /etc/rc0.d/K10filebeat -> ../init.d/filebeat /etc/rc1.d/K10filebeat -> ../init.d/filebeat /etc/rc6.d/K10filebeat -> ../init.d/filebeat /etc/rc2.d/S95filebeat -> ../init.d/filebeat /etc/rc3.d/S95filebeat -> ../init.d/filebeat /etc/rc4.d/S95filebeat -> ../init.d/filebeat /etc/rc5.d/S95filebeat -> ../init.d/filebeat sudo -i service elasticsearch start
Al arrancar el servicio veremos un output similar a este:
2017/05/07 18:47:10.292117 beat.go:285: INFO Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat] 2017/05/07 18:47:10.292163 beat.go:186: INFO Setup Beat: filebeat; Version: 5.4.0 2017/05/07 18:47:10.292249 metrics.go:23: INFO Metrics logging every 30s 2017/05/07 18:47:10.292473 logstash.go:90: INFO Max Retries set to: 3 2017/05/07 18:47:10.292566 outputs.go:108: INFO Activated logstash as output plugin. 2017/05/07 18:47:10.292642 publish.go:295: INFO Publisher name: tig-monitor 2017/05/07 18:47:10.292807 async.go:63: INFO Flush Interval set to: 1s 2017/05/07 18:47:10.292830 async.go:64: INFO Max Bulk Size set to: 2048 Config OK
Si queremos ojear si Beats está enviando correctamente datos hacía nuestro server un tail a los logs debe devolvernos más o menos lo siguiente:
root@tig-monitor:/home/oper# tail -f /var/log/filebeat/filebeat 2017-05-07T19:58:45+01:00 INFO Starting prospector of type: log; id: 15553102747449154808 2017-05-07T19:58:45+01:00 INFO Loading and starting Prospectors completed. Enabled prospectors: 1 2017-05-07T19:58:45+01:00 INFO Starting spooler: spool_size: 2048; idle_timeout: 5s 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/kern.log 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/boot.log 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/alternatives.log 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/auth.log 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/dpkg.log 2017-05-07T19:58:45+01:00 INFO Harvester started for file: /var/log/bootstrap.log 2017-05-07T19:59:15+01:00 INFO Non-zero metrics in the last 30s: filebeat.harvester.open_files=6 filebeat.harvester.running=6 filebeat.harvester.started=6 libbeat.logstash.call_count.PublishEvents=46 libbeat.logstash.publish.read_bytes=4191 libbeat.logstash.publish.write_bytes=2670150 libbeat.logstash.published_and_acked_events=92928 libbeat.publisher.published_events=92928 publish.events=93026 registrar.states.current=6 registrar.states.update=93026 registrar.writes=46
Realizando la primera prueba con Kibana
Después de todos estos pasos, es el momento de irnos a nuestro Kibana, y crearemos un nuevo index pattern, seleccionaremos que sea de tipo filebeat-* y en timestamp seleccionaremos @timestamp
El index ha sido generado y ahora podríamos editar todos los campos que estamos ingiriendo, si queremos mostrarlos, analizarlos, etc:
Si nos fueramos ahora a Discover, podríamos ver que Kibana ya nos muestra datos de los logs que tenemos ya dentro de Logstash y Elasticsearch:
Por ejemplo, podemos ver de manera sencilla un ataque denegado de SSH, y desde que IP se está originando:
En siguientes entradas vamos a ver lo siguiente:
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte I
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte II (Logs de Windows)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte III (X-Pack)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte IV (Nginx y mapa con GeoIP)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte V (Dashboard con Web Analytics)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte VI (Monitorizando Veeam)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte VII (Monitorizando VMware vSphere)
- En busca del Dashboard perfecto: Elastic Stack 5.x (Beats, Logstash, Elasticsearch y Kibana) – Parte VIII (Monitorizando Zimbra Collaboration)



Buen articulo. Yo uso ELK en conjunto con Wazuh,un fork de Ossec, y la verdad que va de fábula.
Muchas gracias
Muy buen artículo: bien explicado, paso a paso, detallado, … una pena que no haya continuado la serie