ELK Stack | Instalar Elasticsearch, Logstash y Kibana en CentOS 7

Gerardo Ocampos
8 min readMar 23, 2020

--

Introduccion a la Instalación y configuración de Elasticsearch, Logstash y Kibana en un Centos 7. Guia completa.

Introducción:

“ELK” es el acrónimo de tres proyectos de código abierto: Elasticsearch, Logstash y Kibana. Elasticsearch es un motor de búsqueda y análisis. Logstash es un canal de procesamiento de datos del lado del servidor que ingiere datos de múltiples fuentes simultáneamente, las transforma y luego las envía al Elasticsearch. Kibana les permite a los usuarios visualizar datos con tablas y gráficos en Elasticsearch.

En este laboratorio mostraremos como instalar y configurar un entorno de ELK Stack para el análisis y monitoreo de infraestructura.

Versiones utilizadas:

  • Elasticsearch 6.2.3
  • Logstash 6.2.3
  • Kibana 6.2.3

Entorno de Laboratorio:

Maestro
Hostname: elk-lab1.ocampoge.com
IP: 192.168.100.40
Os: Centos 7.2
RAM: 6Gb
CPU: 2

Paso 1: Preparar Sistema Operativo.

Si el firewall se encuentra activo, es necesario abrir los siguientes puertos:

# firewall-cmd --add-port=5601/tcp --permanent (kibana)
# firewall-cmd --reload

Por otro lado, puede desactivar el firewall:

# systemctl disable firewalld; systemctl stop firewalld;

Paso 2: Instalar Java

Instalamos Open JDK

# yum install java-1.8.0-openjdk

Verificar la versión de JAVA

# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

Paso 3: Configurar Repositorio de Elastic 6.x

Primeramente habilitaremos un repositorio con el nombre de “elastic-6_x.repo” para el cual realizamos el siguiente comando

# cat <<EOF > /etc/yum.repos.d/elastic-6_x.repo
[elastic-6.x]
name=Elasticsearch 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

Recargamos la configuracion realizada y listamos los repositorios actuales:

# yum makecache; yum repolist;

Paso 4: Instalar y configurar Elasticsearch

Para instalar elasticsearch 6.2.3, debemos lista los rpm actuales que nos provee el repositorio configurado en el “Paso 3” y elegir la versión correspondiente que necesitemos, para eso podemos realizar el siguiente comando:

# yum provides elasticsearch | grep -i 6.2.*
elasticsearch-6.2.0-1.noarch : Elasticsearch is a distributed
elasticsearch-6.2.1-1.noarch : Elasticsearch is a distributed
elasticsearch-6.2.2-1.noarch : Elasticsearch is a distributed
elasticsearch-6.2.3-1.noarch : Elasticsearch is a distributed
elasticsearch-6.2.4-1.noarch : Elasticsearch is a distributed

Seleccionamos la version 6.2.3 y lo instalamos con yum:

# yum install -y elasticsearch-6.2.3-1.noarch

Opcional: Antes de iniciar el servicio de elasticsearch, podemos a realizar algunas modificaciones dentro del archivo de configuración que se encuentra en el “/etc/elasticsearch/elasticsearch.yml”.

Iniciamos el servicio de Elasticsearch y lo establecemos para que se inicie luego de un reinicio del servidor.

Nota: Por defecto Elasticseach corre en el puerto 9200, esto puede ser modficado en el archivo de configuracion “/etc/elasticsearch/elasticsearch.yml”.

# systemctl start elasticsearch; systemctl enable elasticsearch;

Podemos verificar el estado de nuestro Elasticsearch:

# systemctl status elasticsearch● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
Active: active (running) since jue 2018-08-09 03:44:53 PYT; 1min 57s ago
Docs: http://www.elastic.co
Main PID: 17661 (java)
CGroup: /system.slice/elasticsearch.service
└─17661 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTo...
ago 09 03:44:53 elk-lab1.ocampoge.com systemd[1]: Started Elasticsearch.
ago 09 03:44:53 elk-lab1.ocampoge.com systemd[1]: Starting Elasticsearch...

Y puede comprobar que su nodo Elasticsearch se está ejecutando enviando una solicitud HTTP al puerto 9200:

Nota: reemplazar el ‘localhost’ por el nombre de dominio o por la IP del servidor si no funciona la peticion.

# curl -XGET 'http://localhost:9200/'{
"name" : "8Xa8bWm",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RB0b6ORRTbes5CL9t9g1Mw",
"version" : {
"number" : "6.2.3",
"build_hash" : "c59ff00",
"build_date" : "2018-03-13T10:06:29.741383Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

Como también puede verificar los logs, la ubicación por defecto en distribuciones como CentOS7 es la siguiente:

# tail -f /var/log/elasticsearch/elasticsearch.log

Nota: Puede utilizar el comando “journalctl” con los siguientes parámetros:

# journalctl -f --unit=elasticsearch

Listo, con esto tenemos nuestro Elasticsearch corriendo en el servidor.

Paso 5: Instalar y configurar Logstash

Una vez que tengamos nuestro Elasticsearch corriendo en el servidor, el siguiente paso es la instalación del Logstash y del Kibana; iniciamos por logstash.

Al igual que el “Paso 4", listaremos nuestros paquetes disponibles del mismo repositorio ya configurado, en este caso le pasaremos al parámetro “provides” el nombre de logstash:

# yum provides logstash | grep -i 6.2.*
1:logstash-6.2.0-1.noarch : An extensible logging pipeline
1:logstash-6.2.1-1.noarch : An extensible logging pipeline
1:logstash-6.2.2-1.noarch : An extensible logging pipeline
1:logstash-6.2.3-1.noarch : An extensible logging pipeline
1:logstash-6.2.4-1.noarch : An extensible logging pipeline

Seleccionamos la versión 6.2.3 y lo instalamos con yum:

# yum install -y logstash-6.2.3-1.noarch

Iniciamos el servicio de logstash y lo establecemos como persistente ante reinicios:

# systemctl start logstash; systemctl enable logstash;

Verificamos el log por defecto en el siguiente path:

# tail -f /var/log/logstash/logstash-plain.log

En este punto ya deberiamos de tener dos servicios corriendo en nuestro servidor, un “motor de búsqueda y análisis” (Elasticsearch) y un “canal de procesamiento de datos” (Logstash).

Lo siguiente es configurar nuestro primer evento para enviar al Elasticsearch y que empiece a recolectar todo lo necesario.

Una tubería Logstash tiene dos elementos requeridos, entrada y salida, y un elemento opcional, filtro. Los complementos de entrada consumen datos de una fuente, los plugins de filtro modifican los datos como usted especifique, y los complementos de salida escriben los datos en un destino.

Para esta demostración utilizaremos los logs del sistema, el famoso “/var/log/messages”, el cual vamos a leer, filtrar, y enviar al Elasticsearch con un nombre especifico, todo esto con el logstash.

Para el mismo, necesitamos crear un archivo de configuracion en el siguiente path:

Nos dirigimos al directorio:
# cd /etc/logstash/conf.d/
Creamos el siguiente archivo de configuración:
# cat << EOF > syslog.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "(%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{PROG:servicio} %{GREEDYDATA:detalles})" }
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
}
EOF

En la opción de Input, declaramos el plugin file, al cual indicamos las opciones de “path” (ruta de log) y “start_position” inicio de lectura del log.

input {
file {
path => "/var/log/messages"
start_position => "beginning"
}
}

En la opción de Filter, declaramos el plugin grok, el mismo se utiliza como una gran manera de analizar los datos de registro no estructurados en algo estructurado y consultable. En otras palabras “dividimos” nuestro log en diferentes partes para su correspondiente analisis.

filter {
grok {
match => { "message" => "(%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{PROG:servicio} %{GREEDYDATA:detalles})" }
}
}

Nota: para comprender el filtro Grok, puede consultar la siguiente guía: A Beginner’s Guide to Logstash Grok

En la opción de Output, declaramos nuestra forma de enviar los logs estructurados al servicio de Elasticsearch, declaramos un “host” de destino con el puerto especifico y le indicamos el nombre de nuestro índice con el cual el Elasticsearch almacenara nuestros datos.

output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
}

No olvidemos dar permisos al usuario logstash para que pueda leer el /valr/log/messages. Utilizamos ACL.

Para otorgar permisos de lectura al usuario logstash.

# setfacl -m u:logstash:r /var/log/messages

Debemos reiniciar el servicio de Logstash para que tome el cambio declarado en el path “/etc/logstash/conf.d/”

# systemctl restart logstash;

Con esto ya deberíamos de tener nuestros datos insertados en el Elasticsearch mediante una tubería de logstash.

Puede consultar si el índice declarado en el Output ya es visible dentro del Elasticsearch con el siguiente comando:

Lista los indices del Elasticsearch

# curl -XGET 'http://localhost:9200/_cat/indices'                                                   
yellow open syslog-2018.08.12 NnymTDnlQreqqwedR7SQjg 5 1 6044 0 1.6mb 1.6mb

Listo, con esto tenemos nuestro Logstash instalado y configurado para que inicie el envió de datos al Elasticsearch.

Paso 6: Instalación y uso del Kibana

Actualmente ya tenemos trabajando a nuestro Elasticsearch como almacenador de datos y al Logstash como recopilador.

Es momento de configurar nuestro servicio para visualizar datos con tablas y gráficos.

Listamos los paquetes de Kibana disponible:

# yum provides kibana | grep -i 6.2.*
kibana-6.2.0-1.x86_64 : Explore and visualize
kibana-6.2.1-1.x86_64 : Explore and visualize
kibana-6.2.2-1.x86_64 : Explore and visualize
kibana-6.2.3-1.x86_64 : Explore and visualize
kibana-6.2.4-1.x86_64 : Explore and visualize

Instalamos Kibana 6.2.3

# yum install -y kibana-6.2.3-1.x86_64

Antes de iniciar el servicio, realizaremos algunas configuraciones en el “kibana.yml”.

Por defecto, Kibana solo atiende peticiones de localhost, para especificarle que sea accedido por sistemas remotos, cambiamos la siguiente declaración.

Editamos el archivo.
# vi /etc/kibana/kibana.yml
Descomentamos la siguiente declaracion y le establecemos nuestra IP.# Kibana is served by a back end server. This setting specifies the port to use.
#server.port: 5601
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "192.168.100.40" --> Establecemos nuestra IP
# Enables you to specify a path to mount Kibana at if you are running behind a proxy. This only affects
# the URLs generated by Kibana, your proxy is expected to remove the basePath value before forwarding requests
# to Kibana. This setting cannot end in a slash.
#server.basePath: ""
# The maximum payload size in bytes for incoming server requests.
#server.maxPayloadBytes: 1048576
# The Kibana server's name. This is used for display purposes.
#server.name: "your-hostname"
# The URL of the Elasticsearch instance to use for all your queries.
#elasticsearch.url: "http://localhost:9200"
# When this setting's value is true Kibana uses the hostname specified in the server.host
# setting. When the value of this setting is false, Kibana uses the hostname of the host
# that connects to this Kibana instance.
#elasticsearch.preserveHost: true
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# dashboards. Kibana creates a new index if the index doesn't already exist.
#kibana.index: ".kibana"
...

Iniciamos nuestro servicio y lo establecemos como persistente ante reinicios.

# systemctl start kibana; systemctl enable kibana;

Ahora podemos acceder desde nuestro navegador al siguiente enlace:

http://<IP>:5601 → Indican la IP de su servidor.

http://<FQDN>:5601 → Indicamos nuestro nombre de Dominio.

Y listo, ya deberiamos tener nuestro Kibana 6.2.3 en todo su esplendor.

Para empezar a crear nuestro gráficos, debemos especificarle nuestro primer indice, en este caso solo tenemos al “syslog-YYYY.mm.dd”.

Nos dirigimos a “Management” y escribimos el nombre de nuestro índice en la sección “Index pattern”:

Establecemos “syslog-*” para que de esa forma agrupe todos los índices con el nombre de “syslog” sin importar la fecha de creación.

Damos clic al botón “Next step”, y en la siguiente vista nos pedirá un filtro de fecha y hora.

Seleccionamos “@timestamp”. Y finalizamos con “Create index pattern”

Ahora nos dirigimos a la sección de “Discover” y podemos observar todos nuestros registros insertados.

Esta configuración fue realizada para el monitoreo de log de forma local; por otra parte, podemos configurar un agente en cada servidor cliente, para que inicie el envió de sus logs al Logstash o Elasticsearch, y de esa forma tener un ambiente centralizado de Logs.

--

--

Gerardo Ocampos

Red Hat Certified Engineer — Red Hat Certified System Administrator — Red Hat Certified Specialist in Containers and Kubernetes. Asunción, Paraguay